【问题标题】:Neural network in keras not convergingkeras 中的神经网络不收敛
【发布时间】:2018-12-15 01:14:39
【问题描述】:

我正在 Keras 中构建一个简单的神经网络,如下所示:

# create model
model = Sequential()
model.add(Dense(1000, input_dim=x_train.shape[1], activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# Compile model
model.compile(loss='mean_squared_error', metrics=['accuracy'], optimizer='RMSprop')
# Fit the model
model.fit(x_train, y_train, epochs=20, batch_size=700, verbose=2)
# evaluate the model
scores = model.evaluate(x_test, y_test, verbose=0)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

所用数据的形状为:

x_train = (49972, 601) 
y_train = (49972, 1)

我的问题是网络没有收敛,精度固定在0.0168,如下:

Epoch 1/20
 - 1s - loss: 3.2222 - acc: 0.0174
Epoch 2/20
 - 1s - loss: 3.1757 - acc: 0.0187
Epoch 3/20
 - 1s - loss: 3.1731 - acc: 0.0212
Epoch 4/20
 - 1s - loss: 3.1721 - acc: 0.0220
Epoch 5/20
 - 1s - loss: 3.1716 - acc: 0.0225
Epoch 6/20
 - 1s - loss: 3.1711 - acc: 0.0235
Epoch 7/20
 - 1s - loss: 3.1698 - acc: 0.0245
Epoch 8/20
 - 1s - loss: 3.1690 - acc: 0.0251
Epoch 9/20
 - 1s - loss: 3.1686 - acc: 0.0257
Epoch 10/20
 - 1s - loss: 3.1679 - acc: 0.0261
Epoch 11/20
 - 1s - loss: 3.1674 - acc: 0.0267
Epoch 12/20
 - 1s - loss: 3.1667 - acc: 0.0277
Epoch 13/20
 - 1s - loss: 3.1656 - acc: 0.0285
Epoch 14/20
 - 1s - loss: 3.1653 - acc: 0.0288
Epoch 15/20
 - 1s - loss: 3.1653 - acc: 0.0291

我使用 Sklearn 库用相同的数据构建了相同的结构,并且效果很好,显示的准确率高于 0.5:

model = Pipeline([
        ('classifier', MLPClassifier(hidden_layer_sizes=(1000), activation='relu',
                                     max_iter=20, verbose=2, batch_size=700, random_state=0))
    ])

我完全确定我为两个模型使用了相同的数据,这就是我准备它的方式:

def load_data():
    le = preprocessing.LabelEncoder()
    with open('_DATA_train.txt', 'rb') as fp:
        train = pickle.load(fp)
    with open('_DATA_test.txt', 'rb') as fp:
        test = pickle.load(fp)

    x_train = train[:,0:(train.shape[1]-1)]
    y_train = train[:,(train.shape[1]-1)]
    y_train = le.fit_transform(y_train).reshape([-1,1])

    x_test = test[:,0:(test.shape[1]-1)]
    y_test = test[:,(test.shape[1]-1)]
    y_test = le.fit_transform(y_test).reshape([-1,1])

    print(x_train.shape, '  ' , y_train.shape)
    print(x_test.shape, '  ' , y_test.shape)
    return x_train, y_train, x_test, y_test

Keras 结构有什么问题?

已编辑:

这是一个多类分类问题:y_training [0 ,1, 2, 3]

【问题讨论】:

  • 一些问题: - 您确定需要 601 功能吗?你检查过相关性吗? - 考虑减少神经元的数量并添加一个隐藏层。 - 你的数据速率是多少?我的意思是,正数/总数。
  • 你的优化器和学习率是多少?您是否尝试过降低学习率?
  • 在我看来,您没有在训练之前对数据集进行洗牌,因此您可能会看到方差较小的类的过度拟合。
  • 我会尝试另一个损失函数,二进制 cross_entropy 应该适用于 2 个标签,如果我在这里理解得很好,您期望一个真实值作为输出,也许您应该尝试 mean_squared_error。
  • @Minion 你可以回答你自己的问题;将来,如果您的答案是详尽且有据可查的,其他人可以通过参考它而受益

标签: python scikit-learn neural-network keras


【解决方案1】:

对于多类问题,您的标签应该是一种热编码。例如,如果选项是 [0 ,1, 2, 3] 并且标签是 1 那么它应该是 [0, 1, 0, 0]。

你的最后一层应该是一个有 4 个单元的密集层,并且激活了 softmax。

model.add(Dense(4, activation='softmax'))

你的损失应该是 categorical_crossentropy

model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='RMSprop')

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 2016-05-13
    • 2019-02-20
    • 2016-05-13
    • 1970-01-01
    • 2016-07-10
    • 2018-02-20
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多