【发布时间】:2019-01-15 17:24:17
【问题描述】:
我听说机器学习算法很少陷入局部最小值,但我的 CNN(在 tensorflow 中)预测所有值的输出都是恒定的,而且我使用的是均方误差损失函数,所以我认为这一定是给定 MSE 属性的局部最小值。我有一个具有 2 个卷积层和 1 个密集层(+1 个密集输出层用于回归)的网络,分别有 24、32 和 100 个神经元,但我尝试更改层数/神经元的数量,但问题没有解决。我对隐藏层和输出层的绝对值进行了 relu 激活(我知道这并不常见,但它比仍然存在相同问题的 softplus 函数收敛到更低的 MSE 更快,我需要严格的正输出)。我在密集层和输出层之间还有一个 50% 的 dropout 层,以及两个卷积之间的一个池化层。我也尝试过改变学习率(目前为 0.0001)和批量大小。我正在使用 Adam 优化器。
我看到它建议更改/添加偏差,但我不确定如何在 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。
【问题讨论】:
-
你能分享更多关于你的架构的细节吗?你的图片尺寸是多少?你有多少训练样本?你目前的准确度是多少?你使用什么超参数(准确的学习率,学习率衰减,优化器,...)?您是否在 Conv 层之间使用了批量标准化?另外,你为什么对两个卷积使用不同的操作?
filter_shape的大小是多少? -
另外,我不确定您从哪里得到 ML 算法“很少陷入局部最小值”的想法。从字面上看,每个神经网络都“陷入”局部最小值;只是大多数局部最小值都足够好。我认为您将损失函数的凸性与神经网络的非凸性混淆了。
-
@dennlinger 我的输入只有 5x5,但我可以将它们提高到 7x7,我想这可能会有所帮助吗?我有大约 100, 000 个训练样本,我当前的平均 square 误差在大约 25 的值上大约是 90。我没有使用批量规范,主要是因为我从来没有真正理解它的用途。我使用不同的操作只是因为我起初使用的是 tf.layers 但后来我不知道如何初始化权重所以我将第一层(这是我初始化的唯一一层)切换到 tf.nn(虽然想想看,我可能应该同时初始化两者),filter_shape=[3,3,12,24] :)
-
@ 是的,谢谢我知道你通常只会达到一个“足够好”的最小值,但我被告知你通常不会陷入一个似乎很远的地方发生在这里。
-
请将此信息添加到您的帖子中,而不是在 cmets 中,以便其他用户可以轻松找到它。此外,我不是 100% 确定,但我认为
tf.layers会进行一些自动初始化,或者至少应该这样做。您还没有包含有关重要超参数和优化器的任何信息。
标签: optimization machine-learning neural-network conv-neural-network mean-square-error