首页 > 解决方案 > 验证准确度在波动

问题描述

数据由时间序列传感器数据和不平衡数据集组成。该数据集包含 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 的值(有点上下)但是,它并不能阻止波动。谁能帮我弄清楚我哪里出错了?

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


看起来对我来说也过拟合

以下是可以在此处找到的内容的摘要: 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 之间的哪个值效果最好。


推荐阅读