【问题标题】:Model loss remains unchaged模型损失保持不变
【发布时间】:2020-07-20 21:29:54
【问题描述】:

我想了解导致这种模型丢失行为的原因。训练一个有 6 个隐藏层的 CNN 网络,在第一个 epoch 之后损失从 1.8 左右猛增到 12 以上,并在剩余的 99 个 epoch 中保持不变。

724504/724504 [==============================] - 358s 494us/step - loss: 1.8143 - acc: 0.7557 - val_loss: 16.1181 - val_acc: 0.0000e+00
Epoch 2/100
724504/724504 [==============================] - 355s 490us/step - loss: 12.0886 - acc: 0.2500 - val_loss: 16.1181 - val_acc: 0.0000e+00
Epoch 3/100
724504/724504 [==============================] - 354s 489us/step - loss: 12.0886 - acc: 0.2500 - val_loss: 16.1181 - val_acc: 0.0000e+00
Epoch 4/100
724504/724504 [==============================] - 348s 481us/step - loss: 12.0886 - acc: 0.2500 - val_loss: 16.1181 - val_acc: 0.0000e+00
Epoch 5/100
724504/724504 [==============================] - 355s 490us/step - loss: 12.0886 - acc: 0.2500 - val_loss: 16.1181 - val_acc: 0.0000e+00

我不敢相信这与我使用的数据集有关,因为我使用不同的公开数据集进行了尝试,性能完全相同(实际上是损失/准确度的确切数字)。

我还使用具有 2 个隐藏层的某种显示网络对此进行了测试,请参见下面的性能:

724504/724504 [==============================] - 41s 56us/step - loss: 0.4974 - acc: 0.8236 - val_loss: 15.5007 - val_acc: 0.0330
Epoch 2/100
724504/724504 [==============================] - 40s 56us/step - loss: 0.5204 - acc: 0.8408 - val_loss: 15.5543 - val_acc: 0.0330
Epoch 3/100
724504/724504 [==============================] - 41s 56us/step - loss: 0.6646 - acc: 0.8439 - val_loss: 15.3904 - val_acc: 0.0330
Epoch 4/100
724504/724504 [==============================] - 41s 57us/step - loss: 8.8982 - acc: 0.4342 - val_loss: 15.5867 - val_acc: 0.0330
Epoch 5/100
724504/724504 [==============================] - 41s 57us/step - loss: 0.5627 - acc: 0.8444 - val_loss: 15.5449 - val_acc: 0.0330

有人能指出这种行为的可能原因吗?需要调整哪些参数/配置?

编辑

模型创建

model = Sequential()
activ = 'relu'
model.add(Conv2D(32, (1, 3), strides=(1, 1), padding='same', activation=activ, input_shape=(1, n_points, 4)))
model.add(Conv2D(32, (1, 3), strides=(1, 1), padding='same', activation=activ))
model.add(MaxPooling2D(pool_size=(1, 2)))
#model.add(Dropout(.5))

model.add(Conv2D(64, (1, 3), strides=(1, 1), padding='same', activation=activ))
model.add(Conv2D(64, (1, 3), strides=(1, 1), padding='same', activation=activ))
model.add(MaxPooling2D(pool_size=(1, 2)))
#model.add(Dropout(.5))

model.add(Conv2D(128, (1, 3), strides=(1, 1), padding='same', activation=activ))
model.add(Conv2D(128, (1, 3), strides=(1, 1), padding='same', activation=activ))
model.add(MaxPooling2D(pool_size=(1, 2)))
model.add(Dropout(.5))


model.add(Flatten())
A = model.output_shape
model.add(Dense(int(A[1] * 1/4.), activation=activ))
model.add(Dropout(.5))

model.add(Dense(NoClass, activation='softmax'))

optimizer = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(X_reample, Y_resample, epochs=100, batch_size=64, shuffle=False,
                           validation_data=(Test_X, Test_Y))

将学习率更改为lr=0.0001 这是100 epochs 之后的结果。

72090/72090 [==============================] - 29s 397us/step - loss: 0.5040 - acc: 0.8347 - val_loss: 4.3529 - val_acc: 0.2072
Epoch 99/100
72090/72090 [==============================] - 28s 395us/step - loss: 0.4958 - acc: 0.8382 - val_loss: 6.3422 - val_acc: 0.1806
Epoch 100/100
72090/72090 [==============================] - 28s 393us/step - loss: 0.5084 - acc: 0.8342 - val_loss: 4.3781 - val_acc: 0.1925
the optimal epoch size: 97, the value of high accuracy 0.20716827656581954

编辑 2

显然,SMOTE 不适合在多分类中对除多数类之外的所有类进行抽样,请参见下面的 trian/test 图:

【问题讨论】:

  • 你的学习率可能太高了
  • 优化器设置:optimizer = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
  • 嗯,看起来不错,您是否尝试过其他优化器,例如 SGD?如果您包含模型并编译语句也会有所帮助
  • 已编辑问题以包含模型编译语句。
  • 所以改变学习率似乎是个问题。

标签: machine-learning scikit-learn deep-learning conv-neural-network learning-rate


【解决方案1】:

您能否也尝试使用BatchNormalization,放在您的池化层之后。最好包含它

【讨论】:

  • 我知道问题是抽样技术的结果。这是一个多分类(5-classes)问题,数据集高度不平衡。所以我应用了 SMOTE 技术,除了 not majority 之外的所有样本都进行了抽样,使每个类都有 20% 的训练集实例。但最终遇到这样的问题
  • 如果高度不平衡的数据集准确率不是很好的指标,请尝试其他指标,如 Precision、Recall、F1 分数等
  • 应用 SMOTE 并不像您上面描述的那样好,因为它使您的 5 类多类数据中多数类的数据点等于少数类
猜你喜欢
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多