Keras VGG16预处理输入模式

时间:2018-10-31 22:45:44

标签: tensorflow keras deep-learning vgg-net image-preprocessing

我正在使用Keras VGG16 model

我已经看到有一个preprocess_input method to use in conjunction with the VGG16 model。此方法似乎调用preprocess_input method in imagenet_utils.py,而_preprocess_numpy_input method in imagenet_utils.py(取决于大小写)调用https://github.com/fchollet/deep-learning-models/blob/master/vgg16.py

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

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

此外,用于测试模式的输入图像也应进行此预处理吗?我有信心最后一个问题的答案是肯定的,但我希望得到保证。

我希望弗朗索瓦·乔列(Francois Chollet)能够正确完成操作,但是看着VGG at Oxford是他还是我在使用mode="tf"上是错的。

更新的信息

@FalconUA将我引向information page,其中有一个 Models 部分,其中包含16层模型的链接。通过遵循 Models 中的链接,可以找到有关preprocessing_input mode参数tf缩放到-1到1以及caffe减去一些平均值的信息。 strong> 16层模型:{{3}}。在“说明”部分中说:

  

“在本文中,该模型表示为经过比例抖动训练的配置D。输入图像应以平均像素(而不是平均图像)相减为零。即,应减去以下BGR值: [103.939,116.779,123.68]。”

3 个答案:

答案 0 :(得分:5)

这里的mode与后端无关,而是关于模型在其上训练和移植的框架的keras link到VGG16中,它是指出:

  

这些权重是从VGG at Oxford发布的权重中移植过来的

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

较新的网络(例如 MobileNet ShuffleNet )已在TensorFlow上进行了训练,因此mode'tf',输入是零中心在-1到1之间。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

from keras.applications.vgg16 import VGG16, preprocess_input

这样做,默认将preprocess_input设置为'caffe'模式,但仔细观察keras vgg16 code,我注意到权重名称

  

'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')