python - 验证准确度在波动
问题描述
数据由时间序列传感器数据和不平衡数据集组成。该数据集包含 12 类数据,需要预测人类的身体活动。
架构:
注意:LSTM 输出直接馈送到输出
con_l1 = tf.keras.layers.Conv2D(64, (5, 1), activation="relu")(
input_layer)
con_l2 = tf.keras.layers.Conv2D(64, (5, 1), activation="relu")(con_l1)
con_l3 = tf.keras.layers.Conv2D(64, (5, 1), activation="relu")(con_l2)
con_l4 = tf.keras.layers.Conv2D(64, (5, 1), activation="relu")(con_l3)
rl = Reshape((int(con_l4.shape[1]), int(con_l4.shape[2]) * int(con_l4.shape[3])))(con_l4)
lstm_l5 = tf.keras.layers.LSTM(128, activation='tanh',
recurrent_initializer=tf.keras.initializers.Orthogonal(seed=0), dropout=0.5,
recurrent_dropout=0.25, return_sequences=True)(
rl) # required output of each cell to feed into second LSTM layer, so thats why return_sequences=True
lstm_l6 = tf.keras.layers.LSTM(128, activation='tanh',
recurrent_initializer=tf.keras.initializers.Orthogonal(seed=1), dropout=0.5,
recurrent_dropout=0.25, return_sequences=True)(lstm_l5)
每 10 个 epoch 后学习率衰减 0.9 -
tf.keras.optimizers.Adam(learning_rate=0.001)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["acc"])
early_Stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', mode = 'min', patience=10, restore_best_weights=True)
训练准确率和损失分别单调递增和递减。但是,我的验证数据准确性开始剧烈波动。可以在随附的屏幕截图中看到验证损失和准确性的波动。
我已经设置了300 个epoch,但是训练在一些迭代之后停止了,比如这里只有21。我已阅读这篇文章为什么验证准确度会波动?,不知何故认为这是一个过拟合问题,可以通过使用 dropout 来克服。所以,改变 dropout 的值(有点上下)但是,它并不能阻止波动。谁能帮我弄清楚我哪里出错了?
解决方案
看起来对我来说也过拟合
以下是可以在此处找到的内容的摘要: https ://www.tensorflow.org/tutorials/keras/overfit_and_underfit#strategies_to_prevent_overfitting
缩小网络规模
与复杂模型相比,更简单的模型不太可能过度拟合。
这个非常简单,较小的网络没有足够的空间来进行导致记住训练集的脆弱学习
权重正则化
减轻过拟合的一种常见方法是通过强制其权重仅取小的值来限制网络的复杂性
L2 权重正则化更常见,也称为权重衰减,您可以使用 kernel_regularizer 参数将其添加到您的层,例如:
tf.keras.layers.Conv2D(64, (5, 1), activation="relu", kernel_regularizer=regularizers.l2(0.001))
退出
对 dropout 的直观解释是,由于网络中的单个节点不能依赖其他节点的输出,因此每个节点必须输出对自己有用的特征
您已经在使用一些 dropout,但也尝试在每个 conv2d 层之间放置一个 dropout 层,实验找出 0.2 和 0.5 之间的哪个值效果最好。
推荐阅读
- woocommerce - woocommerce 上的产品描述文本未与左侧对齐
- javascript - 如何在 omegle 上获取随机人的地址/位置?
- javascript - 数组不返回推送值
- reactjs - 如何使用 useEffect 加载
- vue.js - 在 vue-router 中使用组路由时,Vue 转换失败
- python - 如何使用 keras 加载保存的模型?(错误: : TypeError: __init__() 得到了一个意外的关键字参数“可训练”)
- vba - VBA:如何在嵌套循环中跳过包含不包含“A”的行?
- html - 如何在更改屏幕宽度的同时保持响应式背景图像高度?
- php - 标记日历 php mysql
- c# - 有没有办法在通过服务器端处理呈现的 Jquery 数据表中指定用户权限?