model.predict()-当数据集大小增加时,TensorFlow Keras对所有图像都给出相同的输出?

mbzjlibv  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(189)

我一直在尝试使用一个预先训练好的模型(XceptionNet)来获得一个对应于每个输入图像的特征向量,以完成分类任务。但是,当数据集大小发生变化时,模型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')

现在,该问题出现在以下代码输出中
第一个
这样的行为有两个问题:

  • 两个输出不相同,但最后25个输入图像相同。
  • 较大批次中的每个输入图像的输出是相同的。

我对这个问题的看法是:

  • 我觉得是BatchNormalization层导致了这个问题。但是解决方法是什么呢?我在model_xception中为training=Falsemodel_xception.trainable=False传递参数,但所有输入的输出仍然相同。
  • 问题在于批次中图像数量的增加。
  • 不仅对于XceptionNet,对于所有其他模型,这个问题都很明显。我也对EfficientNetV2模型进行了实验。

有人能帮忙修复这个错误吗?

arknldoa

arknldoa1#

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

1.那就是正确的行为甚至同样的形象预测结果也是不一样的:
1.1学习功能:学习过程的特性,不应与估计的时间培训范围不同(工作集输入提供相同的输出模式)
1.2在输出层Map标签、重要数据输出示例测量、比例、缩放、对齐、对比度、0到1输入数据Map、网络类型、字母协作等。

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

1.尝试更改数据输入是否提供了具有相同正确性的正确结果️
1.全局平均值、页面上字符的百分比、卷积层、在较早步骤中的归一化层️
1.训练或不训练结果不相同,用训练过的模型范围数据预测提供更好的结果,这可能会产生不稳定的输出。

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

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

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

1.它应该工作,选择输出层数或使用其它输出层功能。
图片更容易看出它与文本字母的不同之处,它们是边界信息,作为文本字母输入,请参见早期规范化层的输出。

oug3syen

oug3syen2#

这个问题似乎出现了,因为我使用的是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

相关问题