MobileNet 이미지 분류자를 재교육 (finetune 읽기)하려고합니다.Tensorflow : 동일한 이미지에 대해 다른 정품 인증 값
텐서 흐름 here (tutorial에서)에 의해 주어진 재교육 스크립트는 새로 추가 된 완전히 연결된 레이어의 가중치 만 업데이트합니다. 이 스크립트를 수정하여 사전 훈련 된 모델의 모든 레이어의 가중치를 업데이트했습니다. 0.25의 깊이 배율과 128의 입력 크기를 가진 MobileNet 아키텍처를 사용하고 있습니다.
그러나 재교육 중에 나는 특정 이미지를 다른 이미지와 함께 배치의 추론을위한 입력으로 제공하면 이상한 것을 깨닫지 만 활성화 일부 레이어 뒤의 값은 이미지가 단독으로 전달 된 값과 다릅니다. 또한 다른 배치의 동일한 이미지에 대한 활성화 값이 다릅니다. 예 - 두 배치의 경우 - batch_1 : [img1, img2, img3]; batch_2 : [img1, img4, img5]
. img1의 활성화는 두 배치와 다릅니다. 몇 가지 다음
layerXactivations_batch=sess.run(layerX, {input_image_tensor: np.asarray([np.squeeze(id), np.squeeze(id), np.squeeze(id)])})
: 위의 코드는 마지막 줄에 다음과 같이 변경 한 번 그대로 한 번 실행
for tf.Session(graph=tf.get_default_graph()) as sess:
image_path = '/tmp/images/10dsf00003.jpg'
id_ = gfile.FastGFile(image_path, 'rb').read()
#The line below loads the jpeg using tf.decode_jpeg and does some preprocessing
id = sess.run(decoded_image_tensor, {jpeg_data_tensor: id_})
input_image_tensor = graph.get_tensor_by_name('input')
layerXname='MobilenetV1/MobilenetV1/Conv2d_1_depthwise/Relu:0' #Name of the layer whose activations to inspect.
layerX = graph.get_tensor_by_name(layerXname)
layerXactivations=sess.run(layerX, {input_image_tensor: id})
- 여기
내가 추론에 사용하는 코드입니다 그래프의 노드 : 이제[u'input', u'MobilenetV1/Conv2d_0/weights', u'MobilenetV1/Conv2d_0/weights/read', u'MobilenetV1/MobilenetV1/Conv2d_0/convolution', u'MobilenetV1/Conv2d_0/BatchNorm/beta', u'MobilenetV1/Conv2d_0/BatchNorm/beta/read', u'MobilenetV1/Conv2d_0/BatchNorm/gamma', u'MobilenetV1/Conv2d_0/BatchNorm/gamma/read', u'MobilenetV1/Conv2d_0/BatchNorm/moving_mean', u'MobilenetV1/Conv2d_0/BatchNorm/moving_mean/read', u'MobilenetV1/Conv2d_0/BatchNorm/moving_variance', u'MobilenetV1/Conv2d_0/BatchNorm/moving_variance/read', u'MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/add/y', u'MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/add', u'MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/Rsqrt', u'MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/mul', u'MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/mul_1', u'MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/mul_2', u'MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/sub', u'MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/add_1', u'MobilenetV1/MobilenetV1/Conv2d_0/Relu6', u'MobilenetV1/Conv2d_1_depthwise/depthwise_weights', u'MobilenetV1/Conv2d_1_depthwise/depthwise_weights/read', ... ...]
layerXname = 'MobilenetV1/MobilenetV1/Conv2d_0/convolution'
정품 인증은 위의 두 경우 모두 동일합니다. (즉, layerxactivations 및 layerxactivations_batch [0]이 동일 함). 그러나이 계층 이후에는 모든 계층이 다른 활성화 값을 갖습니다. 'MobilenetV1/MobilenetV1/Conv2d_0/convolution'계층 이후의 batchNorm 작업은 배치 입력 및 단일 이미지에 대해 다르게 동작합니다. 아니면 다른 문제로 인한 문제입니까?
도움/의견을 보내 주시면 감사하겠습니다.
감사합니다. @jorgemf! 내 질문에 의심되는 바와 같이 문제는 batchNorm에서 발생했으며'is_training'을'false'로 설정 한 것입니다. 그러나 이것이 올바른 방법은 아닙니다. 이상적으로 그래프는 훈련 중에'is_training'을'True'로로드하고, 추론 중에 False로'is_training'을로드해야합니다. 하지만 여기서부터 나는 batchnorm을 직접 작성하지 않았으며, 그래프는 MobileNet 코드에서로드되었습니다. 나는 아직 어떻게 해야할지 알아낼 수 없다.여기에서 참조하실 수 있습니다 - https://stackoverflow.com/questions/39353503/tensorflow-tf-slim-model-with-is-training-true-and-false 또는 https://ruishu.io/2016/12/27/batchnorm/ – Krist
@Krist가 도움이된다면 응답을 유효한 것으로 표시하는 것을 잊지 마십시오. – jorgemf