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

时间:2018-08-08 12:28:59

标签: optimization machine-learning neural-network conv-neural-network mean-square-error

我听说机器学习算法很少陷入局部最小值,但是我的CNN(在tensorflow中)正在预测所有值的恒定输出,并且我使用均方误差损失函数,因此我认为这一定是给定MSE的属性的局部最小值。我有一个网络,其中包含2个卷积层和1个密集层(+1个密集输出层用于回归),分别具有24、32和100个神经元,但是我尝试更改层/神经元的数量,但问题尚未解决。我对隐藏层和输出层上的绝对值有relu激活(我知道这很罕见,但是它收敛到比softplus函数还低的MSE速度,后者仍然有相同的问题,我需要严格的正输出)。我在密集层和输出层之间还有50%的丢失层,在两个卷积之间有一个池化层。我还尝试过更改学习率(当前为0.0001)和批量大小。我正在使用Adam优化器。

我已经看到它建议更改/添加偏差,但是我不确定如何在tf.layers.conv2d / tf.layers.dense(对此,我有bias = True)中进行初始化,但是我无法可以在我的第一层中看到tf.nn.conv2d带有bias的任何选项,这样我就可以轻松地初始化内核。

非常感谢您提出任何建议。

这是我与网络相关的代码部分:

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

我的输入是具有12个通道的环境数据的5x5图像,我有大约100,000个训练样本。我当前的MSE是〜90,值为〜25。

1 个答案:

答案 0 :(得分:-1)

我过去常常用较大的图像来面对同样的问题。我增加了卷积层的数量来解决它。也许您应该尝试添加更多的卷积层。

在我看来,问题出在您没有足够的参数,从而陷入局部最小值的事实。如果增加参数数量,则可以帮助更新收敛到更好的最小值。

此外,我看不到您使用的优化程序。是亚当吗?您可以尝试从更高的学习率开始,并使用衰减来减小历时。