我正在尝试重新训练(读取微调)MobileNet图像分类器。
tensorflow 给出的再训练脚本(来自教程),仅更新新添加的全连接层的权重。我修改了这个脚本来更新预训练模型的所有层的权重。我正在使用深度乘数为 0.25 且输入大小为 128 的 MobileNet 架构。
然而,在重新训练时,我观察到一件奇怪的事情,如果我将特定图像作为输入与其他一些图像一起进行批量推理,则某些层之后的激活值与单独传递图像时的激活值不同。来自不同批次的相同图像的激活值也不同。示例 - 对于两个批次 -
batch_1 : [img1, img2, img3]; batch_2 : [img1, img4, img5]
。img1 的激活与这两个批次不同。
这是我用于推理的代码 -
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})
上面的代码按原样执行一次,并在最后一行进行以下更改:
layerXactivations_batch=sess.run(layerX, {input_image_tensor: np.asarray([np.squeeze(id), np.squeeze(id), np.squeeze(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操作对于批量输入和单个图像的行为不同。还是问题是由其他原因引起的?
任何帮助/指针将不胜感激。