如何使用 Keras 训练和调整人工多层感知器神经网络?
How to train and tune an artificial multilayer perceptron neural network using Keras?
我正在使用 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/20
1213/1213 [==============================] - 0s - loss: 0.1760
Epoch 2/20
1213/1213 [==============================] - 0s - loss: 0.1840
Epoch 3/20
1213/1213 [==============================] - 0s - loss: 0.1816
Epoch 4/20
1213/1213 [==============================] - 0s - loss: 0.1915
Epoch 5/20
1213/1213 [==============================] - 0s - loss: 0.1928
Epoch 6/20
1213/1213 [==============================] - 0s - loss: 0.1964
Epoch 7/20
1213/1213 [==============================] - 0s - loss: 0.1948
Epoch 8/20
1213/1213 [==============================] - 0s - loss: 0.1971
Epoch 9/20
1213/1213 [==============================] - 0s - loss: 0.1899
Epoch 10/20
1213/1213 [==============================] - 0s - loss: 0.1957
Epoch 11/20
1213/1213 [==============================] - 0s - loss: 0.1923
Epoch 12/20
1213/1213 [==============================] - 0s - loss: 0.1910
Epoch 13/20
1213/1213 [==============================] - 0s - loss: 0.2104
Epoch 14/20
1213/1213 [==============================] - 0s - loss: 0.1976
Epoch 15/20
1213/1213 [==============================] - 0s - loss: 0.1979
Epoch 16/20
1213/1213 [==============================] - 0s - loss: 0.2036
Epoch 17/20
1213/1213 [==============================] - 0s - loss: 0.2019
Epoch 18/20
1213/1213 [==============================] - 0s - loss: 0.1978
Epoch 19/20
1213/1213 [==============================] - 0s - loss: 0.1954
Epoch 20/20
1213/1213 [==============================] - 0s - loss: 0.1949
如何训练和调整此模型并让我的代码输出我的最佳预测模型?我是神经网络的新手,完全不知道构建模型后的下一步是什么。我知道我想优化它,但我不确定要调整哪些功能,或者我是否应该手动执行或如何编写代码来执行此操作。
您可以做的一些事情是:
- 将损失函数从
mean_squared_error
更改为 binary_crossentropy
。 mean_squared_error
用于回归,但您想对数据进行分类。
- 将
show_accuracy=True
添加到您的 fit()
函数,它会在每个时期输出您的模型的准确性。该信息可能比损失值对您更有用。
- 将
validation_split=0.2
添加到您的 fit()
函数中。目前,您只在训练集上进行训练,什么都不做验证。这是机器学习中的一个 no-go,因为您不能确定您的模型没有简单地记住数据集的正确答案(没有真正理解为什么这些答案是正确的)。
- 从 Obama/Romney 更改为 Democrat/Republican 并添加以前选举的数据。 ~1200 个示例对于神经网络来说是一个非常小的数据集。还要添加包含有价值信息的列,例如失业率或人口 密度。请注意,相当多的值(如人口数量)可能类似于提供州名,例如您的网络可能会了解到 Texas 的意思是
Republican
.
- 如果您还没有这样做,请将所有值归一化到 0 到 1 的范围内(通过从每个值中减去列的最小值,然后除以列的(最大值 - 最小值)) .神经网络可以比非规范化数据更好地处理规范化数据。
- 尝试
Adam
和 Adagrad
而不是 SGD
。有时他们表现得更好。 (参见 documentation about optimizers。)
- 尝试
Activation('relu')
、LeakyReLU
、PReLU
和 ELU
而不是 Activation('tanh')
。 Tanh 很少是最佳选择。 (参见 advanced activation functions。)
- 尝试 increasing/decreasing 密集层大小(例如从
64
到 128
)。也可以尝试 adding/removing 层。
- 尝试添加
BatchNormalization
层(在 Activation
层之前)。 (参见 documentation。)
- 尝试改变辍学率(例如从
0.5
到 0.25
)。
我正在使用 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/20
1213/1213 [==============================] - 0s - loss: 0.1760
Epoch 2/20
1213/1213 [==============================] - 0s - loss: 0.1840
Epoch 3/20
1213/1213 [==============================] - 0s - loss: 0.1816
Epoch 4/20
1213/1213 [==============================] - 0s - loss: 0.1915
Epoch 5/20
1213/1213 [==============================] - 0s - loss: 0.1928
Epoch 6/20
1213/1213 [==============================] - 0s - loss: 0.1964
Epoch 7/20
1213/1213 [==============================] - 0s - loss: 0.1948
Epoch 8/20
1213/1213 [==============================] - 0s - loss: 0.1971
Epoch 9/20
1213/1213 [==============================] - 0s - loss: 0.1899
Epoch 10/20
1213/1213 [==============================] - 0s - loss: 0.1957
Epoch 11/20
1213/1213 [==============================] - 0s - loss: 0.1923
Epoch 12/20
1213/1213 [==============================] - 0s - loss: 0.1910
Epoch 13/20
1213/1213 [==============================] - 0s - loss: 0.2104
Epoch 14/20
1213/1213 [==============================] - 0s - loss: 0.1976
Epoch 15/20
1213/1213 [==============================] - 0s - loss: 0.1979
Epoch 16/20
1213/1213 [==============================] - 0s - loss: 0.2036
Epoch 17/20
1213/1213 [==============================] - 0s - loss: 0.2019
Epoch 18/20
1213/1213 [==============================] - 0s - loss: 0.1978
Epoch 19/20
1213/1213 [==============================] - 0s - loss: 0.1954
Epoch 20/20
1213/1213 [==============================] - 0s - loss: 0.1949
如何训练和调整此模型并让我的代码输出我的最佳预测模型?我是神经网络的新手,完全不知道构建模型后的下一步是什么。我知道我想优化它,但我不确定要调整哪些功能,或者我是否应该手动执行或如何编写代码来执行此操作。
您可以做的一些事情是:
- 将损失函数从
mean_squared_error
更改为binary_crossentropy
。mean_squared_error
用于回归,但您想对数据进行分类。 - 将
show_accuracy=True
添加到您的fit()
函数,它会在每个时期输出您的模型的准确性。该信息可能比损失值对您更有用。 - 将
validation_split=0.2
添加到您的fit()
函数中。目前,您只在训练集上进行训练,什么都不做验证。这是机器学习中的一个 no-go,因为您不能确定您的模型没有简单地记住数据集的正确答案(没有真正理解为什么这些答案是正确的)。 - 从 Obama/Romney 更改为 Democrat/Republican 并添加以前选举的数据。 ~1200 个示例对于神经网络来说是一个非常小的数据集。还要添加包含有价值信息的列,例如失业率或人口 密度。请注意,相当多的值(如人口数量)可能类似于提供州名,例如您的网络可能会了解到 Texas 的意思是
Republican
. - 如果您还没有这样做,请将所有值归一化到 0 到 1 的范围内(通过从每个值中减去列的最小值,然后除以列的(最大值 - 最小值)) .神经网络可以比非规范化数据更好地处理规范化数据。
- 尝试
Adam
和Adagrad
而不是SGD
。有时他们表现得更好。 (参见 documentation about optimizers。) - 尝试
Activation('relu')
、LeakyReLU
、PReLU
和ELU
而不是Activation('tanh')
。 Tanh 很少是最佳选择。 (参见 advanced activation functions。) - 尝试 increasing/decreasing 密集层大小(例如从
64
到128
)。也可以尝试 adding/removing 层。 - 尝试添加
BatchNormalization
层(在Activation
层之前)。 (参见 documentation。) - 尝试改变辍学率(例如从
0.5
到0.25
)。