Python keras中的神经网络不收敛
我正在Keras中构建一个简单的神经网络,如下所示:Python keras中的神经网络不收敛,python,scikit-learn,neural-network,keras,Python,Scikit Learn,Neural Network,Keras,我正在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=['accurac
# 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 library使用相同的数据构建相同的结构,它工作得非常完美,向我展示了高于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_培训[0,1,2,3]对于多类别问题,您的标签应该是一个热编码标签。例如,如果选项为[0,1,2,3],标签为1,则标签应为[0,1,0,0] 你的最后一层应该是4个单位的密集层,并激活softmax
model.add(Dense(4, activation='softmax'))
你的损失应该是绝对的
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='RMSprop')
一些问题:-您确定需要601功能吗?你查过相关性了吗考虑减少神经元的数量并添加隐藏层。您的数据传输速率是多少?我的意思是,正/总。你的优化器和学习率是多少?你试过降低你的学习率吗?在我看来,你没有在训练前对数据集进行洗牌,因此你可能会在方差较小的课堂上看到过度拟合。我会尝试另一个损失函数,二进制交叉熵应该与两个标签一起工作,如果我在这里理解得很好,您期望一个实际值作为输出,也许您应该尝试一下均方误差。@Minion您可以回答自己的问题;将来,如果你的答案是彻底的,并且有很好的文档记录,那么其他人可以通过参考它来受益