为什么我的卷积神经网络卡在局部最小值?



我听说机器学习算法很少卡在局部最小值中,但我的 CNN(在 tensorflow 中(预测所有值的常量输出,并且我正在使用均方误差损失函数,所以我认为考虑到 MSE 的属性,这一定是局部最小值。我有一个具有 2 个卷积层和 1 个密集层(+1 个用于回归的密集输出层(的网络,分别具有 24、32 和 100 个神经元,但我尝试更改层/神经元的数量,但问题没有解决。我对隐藏层和输出层的绝对值进行了 relu 激活(我知道这并不常见,但它收敛到比仍然存在相同问题的 softplus 函数更快地收敛到更低的 MSE,我需要严格的正输出(。我在密集层和输出层之间还有一个 50% 的辍学层,在 2 个卷积之间有一个池化层。我还尝试更改学习率(目前为 0.0001(和批量大小。我正在使用亚当优化器。

我已经看到它建议更改/添加偏差,但我不确定如何在 tf.layers.conv2d/tf.layers.dense 中初始化它(我有 bias=True(,并且我看不到任何偏置选项与 tf.nn.conv2d 我用于我的第一层,所以我可以轻松初始化内核。

任何建议将不胜感激,谢谢。

这是我的网络代码部分:

filter_shape = [3,3,12,24]
def nn_model(input):
    weights = tf.Variable(tf.truncated_normal(filter_shape, mean=10, 
stddev=3), name='weights')    
    conv1 = tf.nn.conv2d(input, weights, [1,1,1,1], padding='SAME')
    conv2 = tf.layers.conv2d(inputs=conv1, filters=32, kernel_size=[3,3], 
padding="same", activation=tf.nn.relu)
    pool = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2, 
padding='same')
    flat = tf.reshape(pool, [-1, 32*3*3])
    dense_3 = tf.layers.dense(flat, neurons, activation = tf.nn.relu)
    dropout_2 = tf.layers.dropout(dense_3, rate = rate)
    prediction = tf.layers.dense(dropout_2, 1, activation=tf.nn.softplus)    
    return prediction

我的输入是 5x5 图像和 12 个通道的环境数据,我有 ~100,000 个训练样本。我目前的 MSE 在 ~25 的值上是 ~90。

我曾经在更大的图像上遇到同样的问题。我增加了卷积层的数量来解决它。也许你应该尝试添加更多的卷积层。

在我看来,问题来自您没有足够的参数,因此卡在局部最小值中。如果增加参数数量,则可以帮助更新收敛到更好的最小值。

另外,我看不到您正在使用的优化器。是亚当吗?您可以尝试从更大的学习率开始,并使用衰减来减少一个又一个的时期。

最新更新