我正在尝试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)
Run Code Online (Sandbox Code Playgroud)
有没有对这些功能有很好解释的文档?
谢谢!
Dan*_*ler 44
Keras适用于批量图像.因此,第一个维度用于您拥有的样本(或图像)的数量.
当您加载单个图像时,您将获得一个图像的形状,即(size1,size2,channels).
要创建一批图像,您需要一个额外的维度: (samples, size1,size2,channels)
该preprocess_input功能旨在使您的图像适合模型所需的格式.
某些模型使用值为0到1的图像.其他从-1到+1.其他人使用"caffe"风格,这种风格不是标准化的,而是集中的.
从源代码中,Resnet使用了caffe样式.
您无需担心内部细节preprocess_input.但理想情况下,您应该使用keras函数加载图像(这样可以保证加载的图像兼容preprocess_input).
这将加载图像并将图像调整为(224,224):
img = image.load_img(img_path, target_size=(224, 224))
Run Code Online (Sandbox Code Playgroud)
img_to_array()函数添加通道:x.shape = (224, 224, 3)用于RGB和(224, 224, 1)用于灰度图像
x = image.img_to_array(img)
Run Code Online (Sandbox Code Playgroud)
expand_dims()用于添加图像数量x.shape = (1, 224, 224, 3):
x = np.expand_dims(x, axis=0)
Run Code Online (Sandbox Code Playgroud)
preprocess_input减去imagenet数据集的平均RGB通道。这是因为您使用的模型已经在其他数据集上进行了训练:x.shape仍然(1, 224, 224, 3)
x = preprocess_input(x)
Run Code Online (Sandbox Code Playgroud)
如果在循环末尾添加x到数组images,则需要添加images = np.vstack(images),以使(n, 224, 224, 3)图像变暗,其中n已处理的图像数
我发现预处理你的数据而你的数据与 pre_trained 模型/数据集的数据集太不同了,那么它可能会以某种方式损害你的准确性。如果您进行迁移学习并从 pre_trained 模型/它们的权重中冻结一些层,只需 /255.0 您的原始数据集就可以很好地完成工作,至少对于 1/2 百万个样本食品数据集是这样。理想情况下,您应该知道数据集的标准/平均值并使用它而不是使用预训练模型预处理的标准/mdean。
| 归档时间: |
|
| 查看次数: |
34403 次 |
| 最近记录: |