首页 > 解决方案 > 神经网络不收敛于明确的线性可分问题

问题描述

我正在 Keras 开发一个神经网络,我想测试以确保它有效。特征集显然是线性可分的(下图中的“A”和“N”),但由于某种原因,当我使用心率变异性(图中的 HRV)作为唯一特征运行我的神经网络时,它不认为正训练示例(“A”训练示例)是独一无二的:

明显线性可分

我的神经网络架构很简单:

model = Sequential()

model.add(Dense(10, input_shape=(None, X_train.shape[1]),
           activation='sigmoid'))

model.add(Dense(10, activation='sigmoid'))

model.add(Dense(1, activation='sigmoid'))

opt = tf.keras.optimizers.Adam(lr=learning_rate, decay=decay_rate)

model.compile(loss=loss_fn, optimizer=opt, metrics=['acc'])

model.fit(X_train, y_train, epochs=n_epochs, validation_data=(X_test, y_test))

当我使用混淆矩阵测试准确性时,NN 会过度拟合负训练示例:

          precision    recall  f1-score   support

     0.0       0.72      1.00      0.84     20774
     1.0       0.00      0.00      0.00      8126

accuracy                           0.72     28900
macro avg       0.36      0.50      0.42     28900
weighted avg       0.52      0.72      0.60     28900

有什么建议么?

编辑:附加超参数

Training vector shape:(67432, 1, 1)
Example of first element:[[72.710655]

loss_fn = 'binary_crossentropy'
learning_rate = 1e-2
decay_rate = 1e-8
n_epochs = 10 (have varied this but still converges to negative training example)

编辑:附加信息

我想包括我如何格式化我的数组,以防出现问题:

X_train = np.asarray(X_train).reshape(
    X_train.shape[0], 1, X_train.shape[1])

X_test = np.asarray(X_test).reshape(
    X_test.shape[0], 1, X_test.shape[1])

标签: pythonpython-3.xtensorflowkerasneural-network

解决方案


由于您的数据不平衡,您可能希望在 model.fit 中使用 class_weight

model.fit(X_train, y_train, epochs=n_epochs, validation_data=(X_test, y_test), class_weight=class_weight)

class_weight是一本字典。您可以尝试的一个选项是将类权重设置为与类大小成反比,即每个类的数据点数。


推荐阅读