Python 在预测单个图像时,Keras模型特征输出为全零

Python 在预测单个图像时,Keras模型特征输出为全零,python,tensorflow,keras,Python,Tensorflow,Keras,对于一个项目,我正在提取图像的特征,但遇到了一个问题。在efficientnet上使用迁移学习后,我加载模型,移除最后两层(dropout和softmax),然后使用model.predict获得特征数组。这在成批工作时效果很好,但在使用单个图像时会中断。以下是我的单幅图像代码: model = load_model('best_model.h5') model = Model(inputs=model.input,outputs=model.layers[-3].output) model.

对于一个项目,我正在提取图像的特征,但遇到了一个问题。在efficientnet上使用迁移学习后,我加载模型,移除最后两层(dropout和softmax),然后使用model.predict获得特征数组。这在成批工作时效果很好,但在使用单个图像时会中断。以下是我的单幅图像代码:

model = load_model('best_model.h5')
model = Model(inputs=model.input,outputs=model.layers[-3].output)

model.summary()

#img_path = 'test_img_new/大葱/20113.jpg'
img_path = '1359.jpg'

img = image.load_img(img_path, target_size=(260,260,3))
x = image.img_to_array(img)
x = preprocess_input_E(x)
x = np.array(x,dtype=np.float32)
#x = x/255
x = np.expand_dims(x, axis=0)


res = model.predict(x,batch_size=1)

print(res.tolist())
输出结果是:

[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]

有人有什么建议吗?

在浏览stackoverflow和github很长时间后,我找到了解决方案

结果表明,批处理规范化在推理过程中没有正确执行。根据,批次标准化层应使用移动平均值和训练的标准偏差。然而,现在发生这种情况是因为在培训期间,我手动设置了
trainable=True
。解决方案是再次加载模型,然后指定将层设置为
trainable=False

for layer in model.layers:
    if "BatchNormalization" in layer.__class__.__name__:
        layer.trainable=False
        print(layer.weights)
然后,直接保存和使用模型。这似乎不需要编译就可以生效,这可能是一个bug,应该在将来进行调查


注意:这似乎适用于tensorflow 2.3,但不适用于2.1。这可能是由于模型正在TF2.3上进行训练,但我不确定其推理。

请定义
preprocess\u input\u E
?当您没有为
模型指定
batch\u size
参数时,输出是什么。predict()
function?@m.Innat preprocess是efficientnet的预处理函数。它现在是多余的,因为喀拉拉在模型中实现了它。@Kishore它是一个接近全零的数组,但不是零。无论如何,这是不对的。奇怪的是,当我使用一批64幅图像运行模型时,它工作得很好。那你为什么要使用它呢?