【问题标题】:How to improve CNN model reaching loss plateau?如何改进 CNN 模型达到损失平台期?
【发布时间】:2021-04-22 09:06:57
【问题描述】:

我在 Python 3 中使用 TensorFlow 创建一个 CNN,它基于光子能量形状 (20, 1) 的向量创建一个多类(即预期输出是 92 个概率中的 3 个)。 我下面的模型是多次迭代和逐渐增加复杂性的结果。

但是,无论我做什么添加(或减少),该模型似乎始终达到一定的损失值。

下面的代码是模型以及我正在使用 Keras-Tuner 优化的一些超参数。

hp_learning_rate = hp.Choice('learning_rate', values = [1e-2, 1e-5, 3e-4, 5e-5, 5e-6])

hp_activation_C_1 = hp.Choice('activation_c1', values=["relu", "swish"])
hp_activation_C_2 = hp.Choice('activation_c2', values=["relu", "swish"])
hp_activation_D_1 = hp.Choice('activation_d1', values=["softsign", "relu", "swish"])
hp_activation_D_2 = hp.Choice('activation_d2', values=["softsign", "relu", "swish"])

hp_drop = hp.Choice('dropout_%', values=[0.05, 0.04, 0.03, 0.02])

hp_filters_1 = hp.Choice('num_filters_1', values=[32, 64, 96])
hp_filters_2 = hp.Choice('num_filters_2', values=[64, 96, 128, 256])
hp_filters_3 = hp.Choice('num_filters_3', values=[96, 128, 256, 384])

hp_kernel_size_1 = hp.Choice('kernel_size_1', values=[3, 5])

hp_units_1 = hp.Int('units_1', min_value = 64, max_value = 2624, step = 128)
hp_units_2 = hp.Int('units_2', min_value = 64, max_value = 2624, step = 128)
# hp_pool_size_1 = hp.Choice('pool_size_1', values=[2, 3, 4])



model = Sequential()

model.add(Conv1D(filters=hp_filters_1, kernel_size=hp_kernel_size_1,
                 activation=hp_activation_C_1, input_shape=(20, 1)))
model.add(BatchNormalization())
model.add(Dropout(hp_drop))
model.add(Conv1D(filters=hp_filters_2, kernel_size=3, activation=hp_activation_C_2))
model.add(BatchNormalization())
model.add(Dropout(hp_drop))
model.add(AveragePooling1D(pool_size=3, strides=2))
# model.add(MaxPooling1D(pool_size=hp_pool_size_1,strides=3))


model.add(Conv1D(filters=hp_filters_3, kernel_size=3, activation=hp_activation_C_2))
model.add(BatchNormalization())
model.add(Dropout(hp_drop))
model.add(AveragePooling1D(pool_size=3,strides=2))
# model.add(MaxPooling1D(pool_size=2,strides=2))


model.add(BatchNormalization())
model.add(Dropout(hp_drop))


model.add(Flatten())
model.add(Dense(hp_units_1, activation=hp_activation_D_1))
model.add(BatchNormalization())
model.add(Dropout(hp_drop))
model.add(Dense(hp_units_2, activation=hp_activation_D_2))
model.add(Dense(92, activation='softmax'))

    
early_stop = EarlyStopping(monitor='val_mse',
                           patience=5,
                           restore_best_weights=True,
                           min_delta=0.00005)


reduce_lr = ReduceLROnPlateau(monitor="val_mse",
                              factor=0.5,
                              patience=3,
                              min_lr=1e-6,
                              min_delta=0.00008)

所以我的问题是,我是否使模型过于复杂以实现所需目标?以及如何提高性能以进一步减少损失?

【问题讨论】:

  • 这里有很好的基础知识由 Andrew Ng youtube.com/watch?v=F1ka6a13S9I 解释
  • @user3184950,恐怕这个讲座没有完全回答我的问题。然而,Andrew 谈到的解决方案之一可能是模型需要更大。 你知道他的意思吗(更多数量的过滤器/神经元,更多数量的卷积/密集层,或其他)?
  • 我暗示要仔细检查损失图。无论如何,我希望你学到了一些东西。在 CNN 中,更大可能是两件事:(1) CNN 中的更多过滤器,(2) 更多典型 CNN 层的层/块。您可以添加 2 个内核大小为 3 的 CNN 层,或重复您拥有的典型块(CNN、批处理、丢弃、下采样)
  • 是的,我确实学到了一些东西,非常感谢!好吧,这是有道理的。对于以后可能会阅读本文的任何人,我确实添加了另一个块,到目前为止它显示出更好的性能,但还没有完成。

标签: python python-3.x tensorflow keras conv-neural-network


【解决方案1】:

您可以尝试使用可调整的学习率。 Keras 回调ReduceLROnPlateau 使这很容易做到。文档为here. 设置回调以监控验证丢失。我推荐的代码如下所示:

red_lr=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss",factor=0.5,
    patience=2,verbose=1,mode="auto", min_delta=0.0001, cooldown=0, min_lr=0)

model.fit 中添加callbacks=[red_lr]

【讨论】:

  • 我的代码中已经有了,只是忘记显示了。还有其他建议吗?
猜你喜欢
  • 2020-05-24
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2018-08-03
相关资源
最近更新 更多