为什么二元Keras CNN总是预测为1?

我想使用Keras CNN构建一个二元分类器。我有大约6000行的输入数据,数据看起来像这样:

>> print(X_train[0]) [[[-1.06405307 -1.06685851 -1.05989663 -1.06273152]  [-1.06295958 -1.06655996 -1.05969803 -1.06382503]  [-1.06415248 -1.06735609 -1.05999593 -1.06302975]  [-1.06295958 -1.06755513 -1.05949944 -1.06362621]  [-1.06355603 -1.06636092 -1.05959873 -1.06173742]  [-1.0619655  -1.06655996 -1.06039312 -1.06412326]  [-1.06415248 -1.06725658 -1.05940014 -1.06322857]  [-1.06345662 -1.06377347 -1.05890365 -1.06034568]  [-1.06027557 -1.06019084 -1.05592469 -1.05537518]  [-1.05550398 -1.06038988 -1.05225064 -1.05676692]]]>>> print(y_train[0])[1]

然后我通过这种方式构建了一个CNN:

model = Sequential()model.add(Convolution1D(input_shape = (10, 4),                        nb_filter=16,                        filter_length=4,                        border_mode='same'))model.add(BatchNormalization())model.add(LeakyReLU())model.add(Dropout(0.2))model.add(Convolution1D(nb_filter=8,                        filter_length=4,                        border_mode='same'))model.add(BatchNormalization())model.add(LeakyReLU())model.add(Dropout(0.2))model.add(Flatten())model.add(Dense(64))model.add(BatchNormalization())model.add(LeakyReLU())model.add(Dense(1))model.add(Activation('softmax'))reduce_lr    = ReduceLROnPlateau(monitor='val_acc', factor=0.9, patience=30, min_lr=0.000001, verbose=0)model.compile(optimizer='adam',               loss='binary_crossentropy',              metrics=['accuracy'])history = model.fit(X_train, y_train,           nb_epoch = 100,           batch_size = 128,           verbose=0,           validation_data=(X_test, y_test),          callbacks=[reduce_lr],          shuffle=True)y_pred = model.predict(X_test)

但它返回以下结果:

>> print(confusion_matrix(y_test, y_pred))[[  0 362] [  0 608]]

为什么所有预测结果都是1?为什么CNN的表现如此糟糕?这是损失和准确率图表:enter image description here


回答:

它总是预测为1是因为网络的输出设置。你有一个包含一个神经元的Dense层,并使用Softmax激活函数。Softmax通过每个输出的指数和进行归一化。由于只有一个输出,因此唯一可能的输出是1.0。

对于二元分类器,你可以使用带有“binary_crossentropy”损失的sigmoid激活函数,或者在最后一层设置两个输出单元,继续使用softmax并将损失改为categorical_crossentropy。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注