【问题标题】:Keras CNN instantly overfitting, not dataset issueKeras CNN 立即过拟合,而不是数据集问题
【发布时间】:2021-03-17 07:08:14
【问题描述】:

一直在尝试构建 CNN 来对 MFCC 数据进行分类,但模型立即过拟合。

数据:

  • 18 000 个文件(80% 训练,20% 测试)
  • 5 个标签

数据中的 5 个类别都是等量的。这个模型被创建用来处理比 18k 更多的文件,所以我被告知要尽我所能减少网络,这可能会有所帮助。

将过滤器从 (3,3) 减少到 (1,1),尝试减少隐藏神经元数量甚至减少层数量。我只是卡住了,有人有什么想法吗?

无论发生什么,在使用测试数据测量准确度时,我的准确度从未超过 60-65%。

型号代码:

time_start_train = time.time()
i = Input(shape=(feature_count,feature_count,1))
m = Conv2D(16, d, activation='elu', padding='same')(i)
m = MaxPooling2D()(m)
m = Conv2D(32, d, activation='elu', padding='same')(m)
m = MaxPooling2D()(m)
m = Conv2D(64, d, activation='elu', padding='same')(m)
m = MaxPooling2D()(m)
m = Conv2D(128, d, activation='elu', padding='same')(m)
m = MaxPooling2D()(m)
m = Conv2D(256, d, activation='elu', padding='same')(m)
m = MaxPooling2D()(m)
m = Flatten()(m)
m = Dense(512, activation='elu')(m)
m = Dropout(0.2)(m)
o = Dense(out_dim, activation='softmax')(m)

model = Model(inputs=i, outputs=o)

model.compile(loss='categorical_crossentropy', optimizer=Nadam(lr=1e-3), metrics=['accuracy'])

history = model.fit(data_train[0], data_train[1], epochs=10, verbose=1, validation_split = 0.1, shuffle=True)

模型总结:

    _________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 192, 192, 1)       0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 192, 192, 16)      32        
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 96, 96, 16)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 96, 96, 32)        544       
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 48, 48, 32)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 48, 48, 64)        2112      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 24, 24, 64)        0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 24, 24, 128)       8320      
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 12, 12, 128)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 12, 12, 256)       33024     
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 6, 6, 256)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 9216)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 512)               4719104   
_________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 2565      
=================================================================
Total params: 4,765,701
Trainable params: 4,765,701
Non-trainable params: 0

MFCC example (192x192)

model accuracy

model loss

【问题讨论】:

  • 您的模型在其中一层中仍有 512 个隐藏单元。试着只留下 16 个隐藏单位?
  • 刚刚做了,结果完全相同。
  • 嗯...过拟合是验证损失开始增加的时候,这里只是一段时间的平稳期,也许只是训练一段时间?
  • 尝试了多达 100 个 epoch,最终准确度结果完全相同(大约 50-60%)。
  • 好的,抱歉,我最初的建议不够有力。到处留下 1 个过滤器和 1 个隐藏单元,并使用 kernel_regularizer=regularizers.l2(10)。

标签: python tensorflow keras conv-neural-network overfitting-underfitting


【解决方案1】:

尝试应用 L1/L2 正则化。

【讨论】:

  • 对这段代码有什么建议吗?
  • 刚刚实现了,结果大致相同。
  • 你也试过L1吗?使用不同的值调整参数。也试试 l1_l2。结果应该来了。
  • 你为什么认为它过拟合了?请显示每个时期的训练损失和验证损失
【解决方案2】:

如果您对 ML/DL 模型没有深入了解,请使用 AUTOML 而不是 KERAS。在 AUTOML 中,无需过多考虑不同的参数。

【讨论】:

  • 遗憾的是,我需要完成这个系统以供大学研究。
猜你喜欢
  • 1970-01-01
  • 2019-02-10
  • 2019-09-29
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
相关资源
最近更新 更多