【发布时间】: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