我正在尝试在通过网络传播图像之前应用从Keras中的resnet50模块导入的预处理。由于我在尝试将其应用于生成器对象时遇到错误,因此我将其作为lambda层添加到网络中。
但由于模型比我之前在单独对每个图像应用预处理时训练的模型差,我比较了两种方法的结果,它们看起来非常不同,尽管我看不出应用操作有什么不同
*/
结果(左:直接使用预处理功能;右:预处理为lambda层。
答案 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)。
我说在发生器中预处理模型外部的图像会更好。 这样,您在训练和预测时可以更快地执行。