【问题标题】:Validation accuracy does not make sense验证准确性没有意义
【发布时间】:2018-05-22 03:05:52
【问题描述】:

我的数据集如下: 训练集:5589 张图片 验证集:1398 张图片 测试集:1996 张图片 尺寸:1156,256,1 该问题是一个二元分类问题。我使用热编码的目标数组 [0,1],[1,0] 得到了一些结果(在测试集中达到了约 83% 的准确率)。意识到这是多么愚蠢,我将目标数组更改为二进制形式 [0] 或 1,并将 categorical_crossentropy 更改为二进制交叉熵。

使用这种方法,无论我使用什么学习率,验证准确率都会停留在 82.05%,而训练准确率会停留在 25.80%。当然,这没有任何意义,在测试集中的准确率约为 30%。

为什么会发生这种情况?我检查了训练数据和元数据,它们是正确的。我在下面发布我的代码。

inp = Input(shape=input_shape)
out = Conv2D(16, (5, 5),activation = 'relu', kernel_initializer='glorot_uniform', kernel_regularizer=regularizers.l2(0.01), padding='same')(inp)
out = MaxPooling2D(pool_size=(2, 2))(out)
out = Dropout(0.5)(out)

out = Conv2D(32, (3, 3),activation = 'relu',kernel_initializer='glorot_uniform',kernel_regularizer=regularizers.l2(0.01), padding='same')(out)
out = MaxPooling2D(pool_size=(2, 2))(out)
out = Dropout(0.5)(out)

out = Conv2D(32, (3, 3),activation = 'relu',kernel_initializer='glorot_uniform',kernel_regularizer=regularizers.l2(0.01), padding='same')(out)
out = Dropout(0.5)(out)

out = Conv2D(64, (3, 3), activation = 'relu',kernel_initializer='glorot_uniform',kernel_regularizer=regularizers.l2(0.01), padding='same')(out)
out = Conv2D(64, (3, 3),activation = 'relu', kernel_initializer='glorot_uniform',kernel_regularizer=regularizers.l2(0.01), padding='same')(out)
out = MaxPooling2D(pool_size=(2, 2))(out)

out = Conv2D(128, (3, 3), activation = 'relu',kernel_initializer='glorot_uniform',kernel_regularizer=regularizers.l2(0.01), padding='same')(out)
out = Conv2D(128, (3, 3),activation = 'relu', kernel_initializer='glorot_uniform',kernel_regularizer=regularizers.l2(0.01), padding='same')(out)
out = MaxPooling2D(pool_size=(2, 2))(out)

out = Conv2D(256, (3, 3),activation = 'relu', kernel_initializer='glorot_uniform',kernel_regularizer=regularizers.l2(0.01), padding='same')(out)
out = Conv2D(256, (3, 3), activation = 'relu',kernel_initializer='glorot_uniform',kernel_regularizer=regularizers.l2(0.01), padding='same')(out)
out = MaxPooling2D(pool_size=(2, 2))(out)
out = Conv2D(512, (3, 3), activation = 'relu',kernel_initializer='glorot_uniform', kernel_regularizer=regularizers.l2(0.01), padding='same')(out)
out = MaxPooling2D(pool_size=(2, 2))(out)

out = Flatten()(out)
out = Dropout(0.5)(out)
dense1 = Dense(1, activation="softmax")(out)
model = Model(inputs = inp, outputs = dense1)

时代看起来像这样: Epochs

【问题讨论】:

  • 最后一个密集层activation='sigmoid'

标签: machine-learning neural-network deep-learning keras conv-neural-network


【解决方案1】:

将上次激活从 softmax 更改为 sigmoid,例如

dense1 = Dense(1, activation="sigmoid")(out)

并尝试降低你的学习率

model.compile(optimizer=Adam(lr=0.0001), loss='binary_crossentropy',  metrics=['accuracy'])  

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多