TensorFlow 重新训练最后一层如何处理不同的图像大小



我正在运行张量流重新训练教程,但我不明白为什么重新训练图像的大小可能与最初训练模型的图像不同。 我研究了将图像馈送到模型的 retrain.py 脚本,但代码没有进行任何类型的图像大小调整,它直接从磁盘读取图像并立即将其馈送到模型

有谁知道在进行最后一层训练时如何使用不同大小的图像?

从技术上讲,Inception模型可以直接应用于各种图像尺寸。这是可能的,因为密集层之前的最后一个平均池化是全局平均池(而不是 3x3 或 2x2(:

从 https://github.com/tensorflow/models/blob/master/inception/inception/slim/inception_model.py#L320 :

      shape = net.get_shape()
      net = ops.avg_pool(net, shape[1:3], padding='VALID', scope='pool')

这将池化窗口指定为整个映像。

换句话说,该池化图层对空间维度上的要素进行平均,因此无论HW如何,H x W x 2048都会变得1 x 1 x 2048


也就是说,根据我的经验,以与训练方式非常不同的规模应用 NN 可能会导致准确性有所下降(但网络应该可以工作(

@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

最新更新