我正在使用Keras构建我的第一个多层感知器神经网络。
这是我的输入数据:
这是我用来构建初始模型的代码,基本上是遵循Keras的示例代码:
model = Sequential()model.add(Dense(64, input_dim=14, init='uniform'))model.add(Activation('tanh'))model.add(Dropout(0.5))model.add(Dense(64, init='uniform'))model.add(Activation('tanh'))model.add(Dropout(0.5))model.add(Dense(2, init='uniform'))model.add(Activation('softmax'))sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='mean_squared_error', optimizer=sgd)model.fit(X_train, y_train, nb_epoch=20, batch_size=16)
输出:
Epoch 1/201213/1213 [==============================] - 0s - loss: 0.1760 Epoch 2/201213/1213 [==============================] - 0s - loss: 0.1840 Epoch 3/201213/1213 [==============================] - 0s - loss: 0.1816 Epoch 4/201213/1213 [==============================] - 0s - loss: 0.1915 Epoch 5/201213/1213 [==============================] - 0s - loss: 0.1928 Epoch 6/201213/1213 [==============================] - 0s - loss: 0.1964 Epoch 7/201213/1213 [==============================] - 0s - loss: 0.1948 Epoch 8/201213/1213 [==============================] - 0s - loss: 0.1971 Epoch 9/201213/1213 [==============================] - 0s - loss: 0.1899 Epoch 10/201213/1213 [==============================] - 0s - loss: 0.1957 Epoch 11/201213/1213 [==============================] - 0s - loss: 0.1923 Epoch 12/201213/1213 [==============================] - 0s - loss: 0.1910 Epoch 13/201213/1213 [==============================] - 0s - loss: 0.2104 Epoch 14/201213/1213 [==============================] - 0s - loss: 0.1976 Epoch 15/201213/1213 [==============================] - 0s - loss: 0.1979 Epoch 16/201213/1213 [==============================] - 0s - loss: 0.2036 Epoch 17/201213/1213 [==============================] - 0s - loss: 0.2019 Epoch 18/201213/1213 [==============================] - 0s - loss: 0.1978 Epoch 19/201213/1213 [==============================] - 0s - loss: 0.1954 Epoch 20/201213/1213 [==============================] - 0s - loss: 0.1949
如何训练和调整这个模型,并使我的代码输出最佳预测模型?我对神经网络是新手,对构建模型后的下一步感到非常困惑。我知道我想优化它,但我不确定应该调整哪些特征,或者是否应该手动进行,或者如何编写代码来实现这一点。
回答:
你可以尝试以下几种方法:
- 将损失函数从
mean_squared_error
改为binary_crossentropy
。前者适用于回归问题,而你需要对数据进行分类。 - 在
fit()
函数中添加show_accuracy=True
,这样可以输出每个epoch的模型准确率。这些信息可能比单纯的损失值对你更有用。 - 在
fit()
函数中添加validation_split=0.2
。目前你只在训练集上进行训练,没有进行验证。在机器学习中,这是不行的,因为你无法确定模型是否只是记住了数据集的正确答案(而不是真正理解这些答案为什么是正确的)。 - 将Obama/Romney改为Democrat/Republican,并添加之前选举的数据。大约1200个样本对于神经网络来说是一个相当小的数据集。还可以添加有价值的信息列,如失业率或人口密度。请注意,某些值(如人口数量)可能与提供州名相似,因此例如,你的网络可能会学到Texas意味着
Republican
。 - 如果你还没有这样做,将所有值标准化到0到1的范围内(通过从每个值中减去列的最小值,然后除以列的(最大值 – 最小值))。神经网络处理标准化数据的能力比处理未标准化数据要好。
- 尝试使用
Adam
和Adagrad
代替SGD
。有时候它们表现得更好。(参见优化器文档。) - 尝试使用
Activation('relu')
、LeakyReLU
、PReLU
和ELU
代替Activation('tanh')
。Tanh很少是最佳选择。(参见高级激活函数。) - 尝试增加/减少你的密集层大小(例如,从
64
改为128
)。还可以尝试添加/删除层。 - 尝试添加
BatchNormalization
层(在Activation
层之前)。(参见文档。) - 尝试更改dropout率(例如,从
0.5
改为0.25
)。