我正在尝试以下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)
是否有任何文档可以很好地解释这些功能?
谢谢!
答案 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美分。
史蒂夫