【问题标题】:model.predict() - TensorFlow Keras gives same output for all images when the dataset size increases?model.predict() - 当数据集大小增加时,TensorFlow Keras 为所有图像提供相同的输出?
【发布时间】: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=Falsemodel_xception.trainable=False 传递参数,但所有输入的输出仍然相同。
  • 批次中图像数量的增加是问题所在。
  • 不仅对于所有其他模型的 XceptionNet,这个问题都很明显。我还尝试了 EfficientNetV2 模型。

任何人都可以帮助修复错误吗?

【问题讨论】:

  • 由于这个错误,请在下面查看我的答案。

标签: tensorflow machine-learning keras image-classification batch-normalization


【解决方案1】:

1 两个输出不相同,但最后 25 个输入图像相同。

  1. 这是正确的行为,即使相同的图像预测结果不是:

    1.1 学习功能:学习过程的标识,不应超出估计时间训练的范围(工作集输入提供相同的输出模式)

    1.2 在输出层映射标签,重要数据输出示例测量、缩放、缩放、对齐、对比度、0 到 1 输入数据映射、网络类型、字母协作等。

    2 较大批次中每个输入图像的输出是相同的。

    1. 尝试更改数据输入是否提供正确的结果和相同的正确性⁉️
    2. 全局平均,页面上字符的百分比,卷积层,前一步的归一化层⁉️
    3. 训练与否结果不一样,使用训练过的模型范围数据进行预测可提供更好的结果,但可能会产生不稳定的输出。

      3 批次中图像数量的增加是问题所在。

      1. 使用回调函数,您可以使用标准限制可接受的范围。

        4 不仅对于 XceptionNet,对于所有其他模型,这个问题都很明显。我还尝试了 EfficientNetV2 模型。

        1. 它应该可以工作,输出选项数量或使用其他输出层功能。

          图片很容易看出它与文本字母有什么不同,它们是边界信息,作为文本字母输入,请参阅早期归一化层的输出。

【讨论】:

  • 谢谢您的回答!但是我仍然对您为什么提到 tensorflow 的这种行为是正确的感到困惑?你能用不同的词来表达吗?第三点。如果您能提供代码示例,那就太好了。
【解决方案2】:

这个问题似乎出现了,因为我正在使用 tensorflow-macos它有一个主要的预测错误,超过特定数量的输入图像是错误的。

请参阅下面的实际问题:

  • 当使用 57 个输入图像时,预测结果与 56、...、1 个输入图像不同且相同(这是一致的行为,符合预期)。
model.predict(batch[-57:])

1/1 [==============================] - 2s 2s/step

array([[0.00000000e+00, 2.56574154e-02, 1.79693177e-01, ...,
        2.85670068e-03, 1.08444700e-02, 2.34257965e-03],
       [0.00000000e+00, 1.28444552e-03, 0.00000000e+00, ...,
        4.11680201e-03, 4.49061068e-03, 1.83695972e-01],
       [0.00000000e+00, 2.29660165e-03, 7.84890354e-03, ...,
        1.86224483e-04, 1.81426702e-03, 1.54079705e-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[-55:])

2/2 [==============================] - 2s 1s/step

array([[0.00000000e+00, 2.29660165e-03, 7.84890354e-03, ...,
        1.86224483e-04, 1.81426702e-03, 1.54079705e-01],
       [4.94572960e-05, 8.04292504e-04, 5.08825444e-02, ...,
        4.58029518e-03, 2.09121332e-02, 5.57549708e-02],
       [0.00000000e+00, 1.62312540e-03, 0.00000000e+00, ...,
        4.35817856e-05, 2.16606092e-02, 1.30677417e-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)
  • 但是当输入图像更改为 58 或更多时,就会出现上述问题。
model.predict(batch[-58:])

1/1 [==============================] - 2s 2s/step

array([[5.3905282e-04, 2.8516021e-02, 1.2775734e-03, ..., 5.4674568e-03,
        1.7451918e-02, 9.4717339e-02],
       [0.0000000e+00, 2.8345605e-02, 1.2786543e-03, ..., 0.0000000e+00,
        2.4870334e-03, 1.2716405e-01],
       [4.3588653e-03, 8.2868971e-02, 1.8764129e-02, ..., 2.5320805e-03,
        5.9973758e-02, 6.9927111e-02],
       ...,
       [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]], dtype=float32)

如果有人可以在 Mac 上仍然使用 tensorflow 的同时提出修复或解决方法,那将非常有帮助。

还有一个 github 问题仍未修复 here

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 2020-10-27
    • 2018-10-31
    • 1970-01-01
    • 2022-11-29
    • 2016-11-13
    • 2019-07-25
    • 2018-05-27
    • 2017-01-08
    相关资源
    最近更新 更多