python - 作为 Keras lambda 层进行图像预处理与单独进行预处理

标签 python keras resnet

在通过网络传播图像之前,我尝试应用从 Keras 中的 resnet50 模块导入的预处理。由于我在尝试将其应用到生成器对象时遇到错误,因此我将其作为 lambda 层添加到网络中。

但是由于该模型比我之前在对每张图像分别应用预处理时训练的模型更差,因此我比较了两种方法的结果,它们看起来非常不同,尽管我看不出所应用的操作有什么不同.

import keras
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input

model = keras.models.Sequential()
model.add(keras.layers.Lambda(preprocess_input, name='preprocessing', input_shape=(224, 224, 3)))

file = '/path/to/an/image.jpeg'
x = np.array(image.img_to_array(image.load_img(file, target_size=(224, 224))))

preprocessed_x = preprocess_input(x)
predicted_x = model.predict(x.reshape(1,224,224,3)).reshape(224,224,3)

结果(左:直接使用预处理函数;右:作为 lambda 层进行预处理。

Using the preprocessing function directly Using preprocessing function in a model as a lambda function

最佳答案

我认为这可能是 keras 代码中的错误,但我发现 preprocess_input(x) 正在适当修改 x

参见:

x = np.array(image.img_to_array(image.load_img(file, target_size=(224, 224))))
print("x before preprocess - max: " + str(x.max()) + " / min: " + str(x.min()))
preprocessed_x = preprocess_input(x)
print("x after preprocess - max: " + str(x.max()) + " / min: " + str(x.min()))

结果:

x before preprocess - max: 255.0 / min: 0.0
x after preprocess - max: 151.061 / min: -123.68

一开始我当然不会想到这种行为,但三思而后行,它节省了内存(这在神经网络时很有值(value)......)。

如果您使用 numpy 版本之前的模型版本运行测试,则不会发生问题(因为模型在张量中工作,不会就地修改 x)。

在模型内部还是外部进行预处理?

我想说最好在模型外部的生成器中对图像进行预处理。 这样您就可以在训练和预测时获得更快的执行速度。

关于python - 作为 Keras lambda 层进行图像预处理与单独进行预处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546566/

相关文章:

python - 数据帧的 asfreq 函数不工作 Python

python - PyTorch 中的嵌入会创建范数大于 max_norm 的嵌入

Python:遍历多个csv文件并制作多个新的csv文件

python - 报告实验室布局错误 : too large on page

keras - 使用 Keras 和 Google Cloud ML 进行 Base64 图像

python - 数组相等但视觉上不一样

python - 如何对张量的每个切片运行迭代 2D 卷积?

tensorflow - 使用预训练模型(Keras、Tensorflow)的 Mask R-CNN、Faster R-CNN 的最佳图像大小

python - Faster R-CNN torchvision 实现的澄清

python - SimCLR 不学习表示