【问题标题】:Validation loss increase and constant training accuracy 1D cnn验证损失增加和恒定训练精度 1D cnn
【发布时间】:2018-12-13 10:10:25
【问题描述】:

我正在实现一个用于语音识别的 CNN。输入是形状为 (85314, 99, 1) 的 MEL 频率,标签是使用 35 个输出类(形状:(85314, 35))进行单键编码的。当我运行模型时,训练准确度(图 2)开始很高,并且在 epoch 的数量上保持不变,而验证的损失(图 1)会增加。因此,它可能过度拟合,但我找不到问题的根源。我已经降低了学习率并使用了批量大小,但结果保持不变。训练数据的数量也应该足够。我的超参数设置是否还有其他问题?

我的模型和超参数定义如下:

#hyperparameters
input_dimension = 85314
learning_rate = 0.0000025
momentum = 0.85
hidden_initializer = random_uniform(seed=1)
dropout_rate = 0.2

# create model
model = Sequential()
model.add(Convolution1D(nb_filter=32, filter_length=3, input_shape=(99, 1), activation='relu'))
model.add(Convolution1D(nb_filter=16, filter_length=1, activation='relu'))
model.add(Flatten())
model.add(Dropout(0.2))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(64, activation='relu'))
model.add(Dense(35, activation='softmax'))


model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['acc'])
history = model.fit(frequencies_train, labels_hot, validation_split=0.2, epochs=10, batch_size=50)

【问题讨论】:

  • 你检查过你的训练数据和测试数据是否在相同的范围和格式吗?

标签: python validation keras conv-neural-network


【解决方案1】:

您正在使用“binary_crossentropy”来解决多类问题。将其更改为“categorical_crossentrop”。

Keras 使用带有超过 2 个标签的模型的 binary_crossentropy 计算的准确度是错误的。

【讨论】:

  • 注意,“categorical_crossentropy”将在多个类中“只有一个”正确时使用。 (如果是这样,那就去吧)。
  • Pfff 真是个愚蠢的错误...有时您专注于它太久而不再看到这些东西。谢谢你。现在 val 的损失在增加,准确率保持为 0。你可能知道为什么会这样吗?不,有 35 个输出类都是正数……那我应该使用哪个损失函数?
  • keras 的默认损失在这里:keras.io/losses,mean_squared_error 应该可以工作(可能不是最好的选择,你需要尝试其他人看看哪个更好。)
  • 谢谢我想通了,我使用了 keras 验证拆分,但没有使用分层抽样,因此它在 val 集中只有一个类。现在使用 sklearn 训练测试拆分,它正在工作!谢谢大家的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2021-06-20
  • 2016-07-18
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多