【发布时间】:2022-10-04 22:57:52
【问题描述】:
我一直在尝试使用预训练模型(XceptionNet)来获取与分类任务的每个输入图像相对应的特征向量。但是我被卡住了,因为当数据集大小发生变化时,model.predict() 会为同一图像提供不可靠且变化的输出向量。
在下面的代码中,batch 是包含图像的数据,对于这些图像中的每一个,我想要一个使用预训练模型获得的特征向量。
batch.shape
TensorShape([803, 800, 600, 3])
只是为了清楚地说明所有输入图像都不同,这里显示的输入图像很少。
plt.imshow(batch[-23])
plt.figure()
plt.imshow(batch[-15])
我的模型如下
model_xception = Xception(weights="imagenet", input_shape=(*INPUT_SHAPE, 3), include_top=False)
model_xception.trainable = False
inp = Input(shape=(*INPUT_SHAPE, 3)) # INPUT_SHAPE=(800, 600)
out = model_xception(inp, training=False)
output = GlobalAvgPool2D()(out)
model = tf.keras.Model(inp, output, name='Xception-kPiece')
现在问题出现在以下代码输出中
model.predict(batch[-25:]) # prediction on the last 25 images
1/1 [==============================] - 1s 868ms/step
array([[4.99584060e-03, 4.25433293e-02, 9.93836671e-02, ...,
3.21301445e-03, 2.59823762e-02, 9.08260979e-03],
[2.50613055e-04, 1.18759666e-02, 0.00000000e+00, ...,
1.77203789e-02, 7.71604702e-02, 1.28602296e-01],
[3.41954082e-02, 1.82092339e-02, 5.07147610e-03, ...,
7.09404126e-02, 9.45318267e-02, 2.69510925e-01],
...,
[0.00000000e+00, 5.16504236e-03, 4.90547449e-04, ...,
4.62833559e-04, 9.43152513e-03, 1.17826145e-02],
[0.00000000e+00, 4.64747474e-03, 0.00000000e+00, ...,
1.21422185e-04, 4.47714329e-03, 1.92385539e-02],
[0.00000000e+00, 1.29655155e-03, 4.02751788e-02, ...,
0.00000000e+00, 0.00000000e+00, 3.20959717e-01]], dtype=float32)
model.predict(batch)[-25:] # prediction on entire dataset of 803 images and then extracting the vectors corresponding to the last 25 images
26/26 [==============================] - 34s 1s/step
array([[1.7320104e-05, 3.6561250e-04, 0.0000000e+00, ..., 0.0000000e+00,
3.5924271e-02, 0.0000000e+00],
[1.7320104e-05, 3.6561250e-04, 0.0000000e+00, ..., 0.0000000e+00,
3.5924271e-02, 0.0000000e+00],
[1.7320104e-05, 3.6561250e-04, 0.0000000e+00, ..., 0.0000000e+00,
3.5924271e-02, 0.0000000e+00],
...,
[1.7318112e-05, 3.6561041e-04, 0.0000000e+00, ..., 0.0000000e+00,
3.5924841e-02, 0.0000000e+00],
[1.7318112e-05, 3.6561041e-04, 0.0000000e+00, ..., 0.0000000e+00,
3.5924841e-02, 0.0000000e+00],
[1.7318112e-05, 3.6561041e-04, 0.0000000e+00, ..., 0.0000000e+00,
3.5924841e-02, 0.0000000e+00]], dtype=float32)
这种行为有两个问题:
- 两个输出不相同,但最后 25 个输入图像相同。
- 较大批次中每个输入图像的输出是相同的。
我对这个问题的看法:
- 我觉得是 BatchNormalization 层导致了这个问题。但是解决方法是什么?我在
model_xception中为training=False和model_xception.trainable=False传递参数,但所有输入的输出仍然相同。 - 批次中图像数量的增加是问题所在。
- 不仅对于所有其他模型的 XceptionNet,这个问题都很明显。我还尝试了 EfficientNetV2 模型。
任何人都可以帮助修复错误吗?
【问题讨论】:
-
由于这个错误,请在下面查看我的答案。
标签: tensorflow machine-learning keras image-classification batch-normalization