在通过网络传播图像之前,我正在尝试应用从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层。


发布于 2018-05-26 20:29:02
我认为这可能是keras代码中的一个bug,但我发现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)。
模型内部或外部的预处理?
我认为最好是在模型之外,在生成器中对图像进行预处理。这样,在训练和预测时,你就能得到更快的执行。
https://stackoverflow.com/questions/50546566
复制相似问题