我的数据集如下:训练集:5589张图像验证集:1398张图像测试集:1996张图像尺寸:1156,256,1这是一个二元分类问题。我使用独热编码的目标数组[0,1],[1,0]获得了一些结果(在测试集上达到约83%的准确率)。意识到这种做法有多愚蠢后,我将目标数组改成了二进制形式[0]或1,并将分类交叉熵改成了二元交叉熵。
采用这种方法后,无论我使用什么学习率,验证准确率都卡在了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)
而训练的历程看起来像这样:历程
回答:
将你最后的激活函数从softmax改为sigmoid,像这样
dense1 = Dense(1, activation="sigmoid")(out)
并尝试降低你的学习率
model.compile(optimizer=Adam(lr=0.0001), loss='binary_crossentropy', metrics=['accuracy'])