【问题标题】:how to reduce overfitting in neural networks?如何减少神经网络中的过拟合?
【发布时间】:2020-07-28 12:32:15
【问题描述】:

我正在做一个声音识别项目。

我有 5 个类别的 1500 个标记的声音样本。 (每个类别 300 个持续时间为 2 秒的声音样本)。

我正在使用在线工具来计算 MFCC 系数(Egde 脉冲)(所以我无法提供代码)然后 我正在训练一个神经网络。

数据集被拆分:

  • 80% --> 80/20 分割的训练集 - 训练/验证

  • 20% --> 一个测试集

经过 200 个训练周期后,我的网络的第一个版本具有(非常糟糕的)以下性能:

训练准确度 = 100 % / 验证准确度 = 30 %

通过在网上和这个论坛上搜索,我找到了减少过度拟合的方法:

我上次发布的神经网络的最终表现如下:

训练准确度 = 80 % / 验证准确度 = 60 %(在 200 个训练周期后)

如您所见,训练准确率和验证准确率之间仍然存在显着差异..

我的问题是如何继续提高我的验证准确性?

我的神经网络代码:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Dropout, Conv1D, Flatten, Reshape, MaxPooling1D, BatchNormalization
from tensorflow.keras import regularizers
from tensorflow.keras.optimizers import Adam

# model architecture
model = Sequential()
model.add(InputLayer(input_shape=(X_train.shape[1], ), name='x_input'))
model.add(Reshape((int(X_train.shape[1] / 13), 13), input_shape=(X_train.shape[1], )))
model.add(Conv1D(30, kernel_size=1, activation='relu',kernel_regularizer=regularizers.l2(0.001)))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=1, padding='same'))
model.add(Conv1D(10, kernel_size=1, activation='relu',kernel_regularizer=regularizers.l2(0.001)))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=1, padding='same'))
model.add(Flatten())
model.add(Dense(classes, activation='softmax', name='y_pred'))

# this controls the learning rate
opt = Adam(lr=0.005, beta_1=0.9, beta_2=0.999)
#opt = Adadelta(learning_rate=1.0, rho=0.95)

# train the neural network
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(X_train, Y_train, batch_size=50, epochs=200, validation_data=(X_test, Y_test), verbose=2)

谢谢你,

问候,

莱昂内尔

【问题讨论】:

  • 训练和验证性能本身的差异does not signify overfitting
  • @desertnaut,感谢您的帖子。既然您已经做出了诊断,那么解决方案是什么?也许我必须执行额外的录音来增加我的训练集的大小???你怎么看?
  • 在这些问题中从来没有一个简单的答案,更不用说一个适合 SO 评论的答案了 :)
  • 好的,我明白了!,@desertnaut

标签: machine-learning neural-network classification


【解决方案1】:

一般来说,为了减少过拟合,你可以这样做:

  1. 添加更多正则化(例如,具有更高辍学率的多层辍学)
  2. 减少特征数量
  3. 降低网络容量(例如减少层数或隐藏单元数)
  4. 减少批量大小

【讨论】:

    【解决方案2】:
    1. 尝试使用分层 K 折叠验证 this
    2. 选择不同的批量大小{16,32,64}
    3. 尝试使用 sigmoid
    4. BatchNormalization()

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 2020-01-13
      • 2021-07-07
      • 2018-12-09
      • 1970-01-01
      • 2018-07-16
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多