12

我正在使用Keras VGG16 模型

我已经看到有一个preprocess_input 方法可以与 VGG16 模型结合使用。此方法似乎调用 imagenet_utils.py 中的preprocess_input 方法(视情况而定)调用imagenet_utils.py 中的 _preprocess_numpy_input 方法

preprocess_input一个mode参数需要“caffe”、“tf”或“torch”。如果我在 Keras 中使用带有 TensorFlow 后端的模型,我绝对应该使用mode="tf"吗?

如果是,这是因为 Keras 加载的 VGG16 模型是用经过相同预处理的图像训练的(即将输入图像的范围从 [0,255] 更改为输入范围 [-1,1])?

另外,测试模式的输入图像是否也应该进行这种预处理?我相信最后一个问题的答案是肯定的,但我想要一些保证。

我希望 Francois Chollet 能正确地做到这一点,但是看看https://github.com/fchollet/deep-learning-models/blob/master/vgg16.py是他还是我在使用mode="tf".

更新信息

@FalconUA 将我带到牛津的 VGG,它有一个模型部分,其中包含 16 层模型的链接。有关preprocessing_input mode参数tf缩放到 -1 到 1 并caffe减去一些平均值的信息,请访问Models 16 层模型中的链接:信息页面。在描述部分它说:

“在论文中,模型表示为使用尺度抖动训练的配置 D。输入图像应通过平均像素(而不是平均图像)减法以零为中心。即,应减去以下 BGR 值:[103.939, 116.779、123.68]。”

4

3 回答 3

17

这里mode不是关于后端,而是关于模型是在什么框架上训练和移植的。在 VGG16 的keras 链接中,声明:

这些权重来自牛津大学 VGG发布的权重

所以 VGG16 和 VGG19 模型在 Caffe 中训练并移植到 TensorFlow,因此mode == 'caffe'在这里(范围从 0 到 255,然后提取均值[103.939, 116.779, 123.68])。

较新的网络,如MobileNetShuffleNet是在 TensorFlow 上训练的,对它们来说也是如此mode'tf'输入在 -1 到 1 的范围内以零为中心。

于 2018-11-01T01:51:09.460 回答
6

根据我在 Keras 训练 VGG16 的经验,输入应该是从 0 到 255,减去均值[103.939, 116.779, 123.68]。我尝试过迁移学习(冻结底部并在顶部堆叠分类器),输入以 为中心-11结果比0..255 - [103.939, 116.779, 123.68].

于 2018-11-01T01:55:41.970 回答
1

最近尝试自己再次使用 VGG16,我很难通过preprocess_input像这样从 vgg16 导入来获得下降结果:

from keras.applications.vgg16 import VGG16, preprocess_input

这样做,默认情况下 preprocess_input 设置为'caffe'模式,但仔细查看keras vgg16 代码,我注意到权重名称

' https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5 '

是指两次张量流。我认为预处理模式应该是'tf'.

processed_img = preprocess_input(img, mode='tf')
于 2019-02-01T16:34:00.220 回答