我正在运行tensorflow retrain tutorial,但我无法理解为什么重新训练图像可能与模型最初训练的图像大小不同。我查看了将retrain.py脚本提供给模型的脚本,但代码没有进行任何类型的图片调整,直接reading the image from disk并立即feeds it to the model
有人知道在进行最后一层培训时如何使用不同尺寸的图片吗?
答案 0 :(得分:3)
从技术上讲,Inception模型可以直接应用于各种图像尺寸。这是可能的,因为密集层之前的最后一次平均池是全局平均池(而不是3x3或2x2):
来自https://github.com/tensorflow/models/blob/master/inception/inception/slim/inception_model.py#L320:
DWORD prefix = 24;
unsigned long mask = (0xFFFFFFFF << (32 - prefix)) & 0xFFFFFFFF;
这将池的窗口指定为整个图像。
换句话说,该合并图层会平均空间维度中的要素,因此无论 shape = net.get_shape()
net = ops.avg_pool(net, shape[1:3], padding='VALID', scope='pool')
和H x W x 2048
如何,1 x 1 x 2048
都会变为H
。
那就是说,根据我的经验,将NN应用于与训练方式截然不同的规模可能会导致准确性下降(但网络应该有效)
答案 1 :(得分:1)
@anthonybell你是对的,代码没有做任何图像调整大小。但是,如果您检查预训练网络,则会出现图像调整大小图层
<tf.Tensor 'DecodeJpeg/contents:0' shape=() dtype=string>,
<tf.Tensor 'DecodeJpeg:0' shape=(?, ?, 3) dtype=uint8>,
<tf.Tensor 'Cast:0' shape=(?, ?, 3) dtype=float32>,
<tf.Tensor 'ExpandDims/dim:0' shape=(1,) dtype=int32>,
<tf.Tensor 'ExpandDims:0' shape=(1, ?, ?, 3) dtype=float32>,
<tf.Tensor 'ResizeBilinear/size:0' shape=(2,) dtype=int32>,
<tf.Tensor 'ResizeBilinear:0' shape=(1, 299, 299, 3) dtype=float32>,
<tf.Tensor 'Sub/y:0' shape=() dtype=float32>,
<tf.Tensor 'Sub:0' shape=(1, 299, 299, 3) dtype=float32>,
<tf.Tensor 'Mul/y:0' shape=() dtype=float32>,
<tf.Tensor 'Mul:0' shape=(1, 299, 299, 3) dtype=float32>,
网络将接受任何分辨率的图像,并在内部将其大小调整为299x299