我正在使用keras应用程序中的VGG19模型。我原本期望图像被缩放到[-1, 1]
,但似乎preprocess_input
函数做了其他处理。
为了预处理输入,我使用以下2行代码来加载并缩放图像:
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
img = image.load_img("./img.jpg", target_size=(256, 256))
img = preprocess_input(np.array(img))
print(img)
>>> array([[[151.061 , 138.22101, 131.32 ],
... ]]]
输出似乎在[0,255]区间内,但是原来的255被映射到了大约151左右的值(可能是中心化)。VGG实际需要的输入是什么?根据源代码(对于
mode='tf'
),我认为它应该在[-1,1]范围内。它非常灵活,我可以使用任何我想要的缩放吗?(我正在使用VGG提取中层特征-Conv4块)。当查看
preprocess_input
的源代码时,我看到:...
if mode == 'tf':
x /= 127.5
x -= 1.
return x
...
这段话意味着,在使用Keras时,若使用Tensorflow后端,则应该将其缩放至[-1,1]范围内。
我需要创建一个名为restore_original_image_from_array()的函数,可以接收img并且重新构建出之前输入的原始图像。问题在于我不确定VGG19的缩放方式。
总之,我的需求是:
img = image.load_img("./img.jpg", target_size=(256, 256))
scaled_img = preprocess_input(np.array(img))
restore_original_image_from_array(scaled_img) == np.array(img)
>>> True
preprocess_input()
函数,那么缩放范围很明显是[-1, 1]吧?如果您看到的输出范围是[0,255],那么您一定在使用与您发布的不同的函数。 - Gabriel Ibagonarray([[[255, 255, 255], ...
被映射为array([[[151.061 , 138.22101, 131.32 ], ...
。 - GRS