【发布时间】:2022-01-06 00:16:07
【问题描述】:
---更新:问题已解决(部分)-----------
谁能解释一下为什么会产生如此巨大的差异:
我更改了以下内容:
output = Dense(3, activation='softmax')(batchnorm)
model = Model(
inputs=[model_one_input, model_two_input],
outputs=output
)
到
output = Dense(3)(batchnorm)
softmax = Activation("softmax")(output)
model = Model(
inputs=[model_one_input, model_two_input],
outputs=softmax
)
现在我得到的结果仍然很奇怪,但在测试时会更好:
# Epoch 2:
loss: 0.0069 - accuracy: 1.0000 - val_loss: 1.0632 - val_accuracy: 0.6667
# Epoch 10:
loss: 0.0069 - accuracy: 1.0000 - val_loss: 1.0570 - val_accuracy: 1.0000
我有一个浅层卷积模型,用于预测 3 个不同的图像。
我有两个数据集,我已经平衡了数据,以便所有三个类分布相同。
我的问题是模型训练 acc 和验证 acc 不能超过 80%。 当我运行模型预测时,它只预测我觉得奇怪的三个类之一。
我尝试了许多不同的设置并检查了图像的标签等。一切看起来都很好。所以我开始认为这可能是我的架构有问题?
def get_covn_base(input_layer, img_shape):
input = Conv2D(64, (3, 3), input_shape=img_shape)(input_layer)
acti01 = Activation("relu")(input)
pool01 = MaxPooling2D(pool_size=(2, 2))(acti01)
covn02 = Conv2D(128, (3, 3))(pool01)
acti02 = Activation("relu")(covn02)
pool02 = MaxPooling2D(pool_size=(2, 2))(acti02)
covn03 = Conv2D(256, (3, 3))(pool02)
acti03 = Activation("relu")(covn03)
pool03 = MaxPooling2D(pool_size=(2,2))(acti03)
covn04 = Conv2D(64, (3, 3))(pool03)
acti04 = Activation("relu")(covn04)
pool04 = MaxPooling2D(pool_size=(2,2))(acti04)
flatten = Flatten()(pool04)
return flatten
def get_shallow_cnn(img_shape):
model_one_input = Input(shape=img_shape)
model_one = get_covn_base(model_one_input, img_shape)
model_two_input = Input(shape=img_shape)
model_two = get_covn_base(model_two_input, img_shape)
concat_feature_layer = concatenate([model_one, model_two])
fully_connected_dense_big = Dense(1024, activation="relu")(concat_feature_layer)
batchnorm = BatchNormalization()(fully_connected_dense_big)
#acti = Activation('relu')(fully_connected_dense_big)
fully_connected_dense_medium = Dense(512, activation="relu")(batchnorm)
batchnorm = BatchNormalization()(fully_connected_dense_medium)
fully_connected_dense_small = Dense(256, activation="relu")(batchnorm)
batchnorm = BatchNormalization()(fully_connected_dense_small)
output = Dense(3, activation='softmax')(batchnorm)
model = Model(
inputs=[model_one_input, model_two_input],
outputs=output
)
return model
model = get_shallow_cnn(get_img_input_shape(True))
opt = Adam(learning_rate=start_lr)
model.compile(
loss=loss_function,
optimizer=opt,
metrics=[tensorflow.keras.metrics.CategoricalAccuracy()]
)
这是上面的测试和训练:
预测和真实的标签对我来说看起来不错,所以如果有人遇到过这个问题或对此有什么建议?
-----------更新------------
我刚刚运行了一些测试,只有 3 张图片,一张图片公关。班级。我使用相同的图像进行训练和验证,没有洗牌。指标 acc 给了我以下信息
标签:
#labels
i = [1. 0. 0.]
i = [0. 0. 1.]
i = [0. 1. 0.]
# Model result 10 epochs:
epoch 2:
loss: 0.0110 - accuracy: 1.0000 - val_loss: 1.0467 - val_accuracy: 0.3333
epoch 10:
loss: 0.0021 - accuracy: 1.0000 - val_loss: 1.0331 - val_accuracy: 0.6667
所以有些东西显然是错误的......当它的完全相同的图像时,它怎么只能预测 33%?
【问题讨论】:
-
好吧,很多问题,你的损失函数是什么? (您还没有显示),目标类分布是什么? (测试和训练数据中每个类有多少样本)。如果您的模型在大多数情况下仅预测 1 个类别,则可能是您没有平衡数据,否则您的准确率将在 33% 左右,您可以仔细检查一下吗?
-
我的损失是分类交叉熵,我正在使用 ADAM 优化器。我有一个自定义数据生成器,它为网络提供每个类的 1000 张图像。对于测试,我每个类只有 70 个图像,验证每个类大约有 200 个图像。每个类都有一个分类标签 = [0, 1, 0](示例)
-
70 张图片的测试数据和 200 张的验证数据,这些的类分布是什么?这些平衡吗?
-
是的,我的意思是,对于测试,我有 3 个相同的 x70 类图像用于验证。看看我的更新,我发现了一些很奇怪的东西。
标签: python tensorflow keras deep-learning data-science