本文为为????365天深度学习训练营内部文章
原作者:K同学啊
与上篇一样,依然是二维数据结构。这里通过构建基础的网络块来做天气类别的预测,网络如下:
'''
预测是否下雨
'''
# 1.搭建神经网络
model = Sequential()
# 添加第一密集层,包含 24 个神经元(units),激活函数为双曲正切(tanh)
model.add(Dense(units=24,activation='tanh'))
model.add(Dense(units=18,activation='tanh'))
model.add(Dense(units=23,activation='tanh'))
# 添加一个 Dropout 层,其比例为 50%。这是为了防止模型过拟合,随机丢弃一定比例的神经元以增强模型的泛化能力
model.add(Dropout(0.5))
model.add(Dense(units=12,activation='tanh'))
model.add(Dropout(0.2))
# 输出层,包含 1 个神经元,激活函数为 Sigmoid。这通常用于二分类问题,因为它的输出将被限制在 0 和 1 之间
model.add(Dense(units=1,activation='sigmoid'))
optimizer = Adam(learning_rate=1e-4)
# 定义损失函数为二元交叉熵(binary_crossentropy),适用于二分类任务。使用先前定义的优化器,并设置监控指标为准确率
model.compile(loss='binary_crossentropy',optimizer=optimizer,metrics='accuracy')
利用早停法,绘制准确率和loss图
Epoch 1/10
3410/3410 [==============================] - 6s 1ms/step - loss: 0.4577 - accuracy: 0.7886 - val_loss: 0.3800 - val_accuracy: 0.8378
Epoch 2/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3945 - accuracy: 0.8334 - val_loss: 0.3763 - val_accuracy: 0.8395
Epoch 3/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3887 - accuracy: 0.8353 - val_loss: 0.3737 - val_accuracy: 0.8408
Epoch 4/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3844 - accuracy: 0.8378 - val_loss: 0.3717 - val_accuracy: 0.8405
Epoch 5/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3814 - accuracy: 0.8391 - val_loss: 0.3705 - val_accuracy: 0.8422
Epoch 6/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3790 - accuracy: 0.8407 - val_loss: 0.3686 - val_accuracy: 0.8425
Epoch 7/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3772 - accuracy: 0.8409 - val_loss: 0.3679 - val_accuracy: 0.8426
Epoch 8/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3749 - accuracy: 0.8416 - val_loss: 0.3669 - val_accuracy: 0.8427
Epoch 9/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3737 - accuracy: 0.8419 - val_loss: 0.3659 - val_accuracy: 0.8434
Epoch 10/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3728 - accuracy: 0.8416 - val_loss: 0.3646 - val_accuracy: 0.8431
总结:
1. 多层结构
- 网络采用了多个 Dense(全连接)层,包括 24、18、23 和 12 个神经元,这种多层结构让网络具有了足够的 表达能力,可以学习到复杂的特征和数据模式。
- 每一层的神经元数量递减的结构,也有助于减少模型的复杂度,从而控制模型的 训练效率。
2. 激活函数:tanh
- 网络中的每个隐藏层都使用了 tanh(双曲正切) 激活函数,它是一个常见的非线性激活函数。它的输出范围在 -1 到 1 之间,这有助于模型捕捉更复杂的非线性关系。
- 使用
tanh
激活函数的优点是能够 避免过度激活,并且由于其零中心化的特性,它有助于加速梯度下降过程。3. Dropout 层
- Dropout 是一种常用的正则化技术,用于防止 过拟合。通过随机丢弃一定比例的神经元,网络不会过度依赖某一特定的神经元,从而提高模型的 泛化能力。
- 网络在两个不同位置使用了 Dropout 层:一个在隐藏层后(丢弃比例 50%),另一个在最后的隐藏层之后(丢弃比例 20%)。这种配置进一步增强了网络的鲁棒性,减少了训练时的过拟合现象。
4. 输出层与激活函数:Sigmoid
- 输出层使用 Sigmoid 激活函数,这对于 二分类任务(如判断某个输入属于两个类别中的一个)是标准选择。Sigmoid 的输出范围在 0 到 1 之间,适合输出概率值,用于二分类任务。
- 由于 Sigmoid 的输出是概率,因此它非常适合用在 二元交叉熵损失函数(
binary_crossentropy
)配合下进行训练。5. 优化器:Adam
- 使用了 Adam 优化器,它结合了 Momentum 和 RMSProp 的优势,具有自适应的学习率调整机制。
- 由于 Adam 可以自动调整每个参数的学习率,它通常比传统的 梯度下降法 收敛得更快,尤其在训练复杂模型时表现尤为突出。
- 此外,Adam 对初始学习率不那么敏感,默认设置的学习率(1e-4)通常对大多数任务都能达到较好的性能。
6. 损失函数:Binary Cross-Entropy
- 使用了 二元交叉熵(binary_crossentropy) 损失函数,这正是为 二分类任务设计的标准损失函数。
- 该损失函数可以量化模型输出与实际标签之间的差异,随着模型训练的进行,损失值不断减少,从而推动模型性能的提升。
7. 使用了 Keras 高层 API
- 代码使用了 Keras 高层 API(
Sequential
和Dense
等),简洁且易于理解。Keras 提供了高效的神经网络构建和训练接口,使得模型的搭建更加直观和快速。