我正在使用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]。”
答案 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]
。我尝试过以-1
到1
为中心的输入进行转移学习(冻结底部并在顶部堆叠分类器),结果比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,我注意到权重名称
两次引用张量流。我认为预处理模式应为'tf'
。
processed_img = preprocess_input(img, mode='tf')