我一直在尝试使用一个预先训练好的模型(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=False
和model_xception.trainable=False
传递参数,但所有输入的输出仍然相同。 - 问题在于批次中图像数量的增加。
- 不仅对于XceptionNet,对于所有其他模型,这个问题都很明显。我也对EfficientNetV2模型进行了实验。
有人能帮忙修复这个错误吗?
2条答案
按热度按时间arknldoa1#
1两个输出不相同,但最后25个输入图像相同。
1.那就是正确的行为甚至同样的形象预测结果也是不一样的:
1.1学习功能:学习过程的特性,不应与估计的时间培训范围不同(工作集输入提供相同的输出模式)
1.2在输出层Map标签、重要数据输出示例测量、比例、缩放、对齐、对比度、0到1输入数据Map、网络类型、字母协作等。
2较大批次中每个输入图像的输出都相同。
1.尝试更改数据输入是否提供了具有相同正确性的正确结果️
1.全局平均值、页面上字符的百分比、卷积层、在较早步骤中的归一化层️
1.训练或不训练结果不相同,用训练过的模型范围数据预测提供更好的结果,这可能会产生不稳定的输出。
3批次中图像数量的增加是问题所在。
1.使用回调函数,您可以使用条件限制可接受的范围。
4不仅对于XceptionNet,对于所有其他模型,这个问题都很明显。我也试验过EfficientNetV2模型。
1.它应该工作,选择输出层数或使用其它输出层功能。
图片更容易看出它与文本字母的不同之处,它们是边界信息,作为文本字母输入,请参见早期规范化层的输出。
oug3syen2#
这个问题似乎出现了,因为我使用的是tensorflow-macos,它有一个主要的错误预测,这是错误的超过一个特定数量的输入图像。
请参阅下面的实际问题:
如果有人能在Mac上仍然使用TensorFlow的同时提出一个修复或变通方案,那将会非常有帮助。
还有一个github问题,仍然没有修复here。