keras中的preprocess_input()方法

时间:2017-11-29 15:03:39

标签: python keras

我正在尝试以下keras文档页面中的示例keras代码, https://keras.io/applications/

preprocess_input(x)模块的keras函数在下面的代码中做了什么?为什么我们必须先将expand_dims(x, axis=0)传递给preprocess_input()方法?

from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input
import numpy as np

model = ResNet50(weights='imagenet')

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

是否有任何文档可以很好地解释这些功能?

谢谢!

3 个答案:

答案 0 :(得分:34)

Keras适用于批量图像。因此,第一个维度用于您拥有的样本(或图像)的数量。

加载单张图片时,您会获得一张图片的形状,即(size1,size2,channels)

要创建一批图片,您需要一个额外的维度:(samples, size1,size2,channels)

preprocess_input功能旨在使您的图像适合模型所需的格式。

某些模型使用的值为0到1的图像。其他从-1到+1。其他人使用" caffe"风格,没有规范化,但是居中。

来自source code,Resnet正在使用caffe风格。

您不必担心preprocess_input的内部细节。但理想情况下,您应该使用keras函数加载图像(这样可以保证加载的图像与preprocess_input兼容)。

答案 1 :(得分:4)

此负载的图像并调整图像以(224,224):

 img = image.load_img(img_path, target_size=(224, 224))

img_to_array()函数添加通道:x.shape = (224, 224, 3)用于RGB和(224, 224, 1)用于灰度图像

 x = image.img_to_array(img) 

expand_dims()用于增加图象的数目:x.shape = (1, 224, 224, 3)

x = np.expand_dims(x, axis=0)

preprocess_input减去imagenet数据集的平均RGB通道。这是因为要使用的模型已在一个不同的数据集训练:x.shape是{仍然{1}}

(1, 224, 224, 3)

如果您将x = preprocess_input(x) 添加到数组x,则在循环结束时,需要添加images,以使images = np.vstack(images)作为图像的暗淡其中(n, 224, 224, 3)是已处理图像的数量

答案 2 :(得分:0)

我发现,在预处理数据时,与预处理过的模型/数据集相比,预处理数据太不同了,那么这可能会以某种方式损害您的准确性。如果您确实转移了学习并冻结了预先训练的模型/他们的权重中的某些层,则只需/255.0,原始数据集就可以很好地完成工作,至少对于大型1/2百万样本食品数据集而言。理想情况下,您应该了解数据集的标准差/均值并使用它,而不要使用预先训练的模型预处理的标准差/经度。

我的2美分。

史蒂夫