【问题标题】:Keras multi input CNN only predicts one classKeras 多输入 CNN 只预测一类
【发布时间】: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()]
    )


这是上面的测试和训练:

training

test

预测和真实的标签对我来说看起来不错,所以如果有人遇到过这个问题或对此有什么建议?

Arhcitecture

-----------更新------------

我刚刚运行了一些测试,只有 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


【解决方案1】:

对于可能遇到多分类问题(3 类)的任何其他人,其中模型仅预测 33-66% 的类并在等式之外留下一个,然后将所有激活函数添加为层而不是字符串。在我使用 keras 函数 api 的情况下,tensorflow 2.7 中没有添加激活函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2020-03-13
    • 2020-01-02
    • 2020-11-10
    相关资源
    最近更新 更多