我试图在通过网络传播图像之前应用从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层进行预处理。
最佳答案
我认为这可能是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)。
在模型内部还是外部进行预处理?
我想说最好在生成器中对模型外部的图像进行预处理。
这样,您可以在训练和预测时更快地执行。
关于python - 图像作为Keras Lambda层的预处理与单独进行预处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50546566/