首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >图像预处理作为Keras lambda层与其本身的预处理

图像预处理作为Keras lambda层与其本身的预处理
EN

Stack Overflow用户
提问于 2018-05-26 20:03:36
回答 1查看 1.2K关注 0票数 2

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

但是,由于模型比我以前训练过的模型更糟糕,当我分别对每幅图像进行预处理时,我比较了这两种方法的结果,它们看起来非常不同,尽管我看不出应用的操作有什么不同。

代码语言:javascript
运行
复制
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层。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-26 20:29:02

我认为这可能是keras代码中的一个bug,但我发现preprocess_input(x)正在修改x

请参见:

代码语言:javascript
运行
复制
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()))

结果:

代码语言:javascript
运行
复制
x before preprocess - max: 255.0 / min: 0.0
x after preprocess - max: 151.061 / min: -123.68

一开始我当然不会期望这种行为,但是仔细考虑一下,它会消耗掉记忆(这在神经网络中是有价值的.)。

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

模型内部或外部的预处理?

我认为最好是在模型之外,在生成器中对图像进行预处理。这样,在训练和预测时,你就能得到更快的执行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50546566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档