我听说机器学习算法很少陷入局部最小值,但我的 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。