-2

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

我已经看到它建议更改/添加偏差,但我不确定如何在 tf.layers.conv2d/tf.layers.dense 中初始化它(为此我有偏差 = 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

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

4

1 回答 1

-1

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

在我看来,问题在于你没有足够的参数,因此陷入了局部最小值。如果增加参数数量,它可以帮助更新收敛到更好的最小值。

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

于 2018-08-08T12:38:59.843 回答