图像预处理作为Keras lambda层与自己的预处理

时间:2018-05-26 20:03:37

标签: python keras resnet

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

但由于模型比我之前在单独对每个图像应用预处理时训练的模型差,我比较了两种方法的结果,它们看起来非常不同,尽管我看不出应用操作有什么不同

*/

结果(左:直接使用预处理功能;右:预处理为lambda层。

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

1 个答案:

答案 0 :(得分:2)

我认为这可能是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

我一开始肯定不会期待这种行为,但是考虑两次,它会节省内存(这在神经网络中很有价值......)。

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

模型内外的预处理?

我说在发生器中预处理模型外部的图像会更好。 这样,您在训练和预测时可以更快地执行。