【问题标题】:Tensor Flow passing a tensor to optimizer minimize function trains better将张量传递给优化器的张量流可以更好地最小化函数训练
【发布时间】:2018-08-22 23:53:22
【问题描述】:

我在 tensorflow 中遇到了一些(对我来说)有点奇怪的事情,希望有人能对这种情况有所了解。

我有一个处理图像的简单神经网络。我最小化的成本函数是简单的 MSE。

起初我实现了以下内容:

cost = tf.square(DECONV - Y)

然后我将其传递给我的优化器,如下所示:

optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)

我能够通过这个实现获得很好的结果。然而,当我尝试实现正则化器时,我意识到我并没有将标量值传递给 optimizer.minimize(),而是实际上传递了一个形状为 [batch, dim_x, dim_y] 的张量。

我将实现更改为以下内容:

cost = tf.losses.mean_squared_error(Y, DECONV)

还有很多这样的变体:

cost = tf.reduce_mean(tf.square(tf.subtract(DECONV, Y))) 

等等

我的问题是,对于 MSE 的这些新实现,我什至无法接近使用原始“错误”实现获得的结果。

原始方式是一种有效的训练方式吗?如果是这样,我该如何实现正则化器?如果没有,我在新实现中做错了什么?为什么我不能复制结果?

【问题讨论】:

    标签: python tensorflow deep-learning conv-neural-network


    【解决方案1】:

    你能准确地说出你的意思吗

    我能够取得更大的成果[..]

    我假设您有除 cost 之外的另一个指标 - 这次是一个实际的标量,它使您能够比较每种方法训练的模型。

    另外,您是否尝试过调整第二种方法的学习率?我问这个是因为我的直觉是,当您要求 tensorflow 最小化张量(据我所知没有数学意义)时,它会最小化通过对张量的所有轴求和获得的标量。这就是tf.gradients 的工作方式,也是我认为发生这种情况的原因。所以也许在第二种方法中,如果你将学习率乘以batch*dim_x*dim_y,你会得到与第一种方法相同的行为。

    即使这样可行,我不认为将张量传递给minimize 函数是一个好主意 - 最小化 d 维值没有任何意义,因为您在这些空间中没有顺序规则。

    【讨论】:

    • 感谢您的回复。通过更好的结果,我的意思是总成本要好大约 2 个数量级(即 0.00002 对 0.002)。比较图像还显示了第一种更好地复制标记图像的方法。第一种方法的学习率约为 0.0005...所以将其乘以一个非常大的数字似乎不对...?我已经尝试调整第二种方法的学习率,并找到了一种可以训练的方法,但我无法将成本降低到 2e-5。
    • 我不知道你的网络架构是什么,但确实使用这么大的学习率似乎并不合理。
    • 其他优化器(adam、sgd、..)是否也会出现同样的现象?
    • 我确认了,您对优化器所做的事情确实是正确的。如果我实现cost = tf.reduce_sum(tf.square(DECONV - Y)),它会给我与第一种情况相同的结果。出于某种原因,将平均值添加到此(在这种情况下除以元素的数量batch * dim_x * dim_y)完全阻碍了训练。不幸的是,我仅限于使用 rmsprop。
    • 实际上,你想要的不是tf.reduce_mean(tf.square(DECONV - Y)),而是tf.reduce_mean(tf.reduce_sum(tf.square(DECONV - Y), axis=[1,2]), axis=0),因此是数据集上的平均L2损失)。然后将您的学习率乘以 batch_size 以获得您注意到的第一种方法的良好行为,以及有意义的损失公式。
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2021-06-28
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多