【问题标题】:Tensorflow: optimize over input with gradient descentTensorflow:使用梯度下降优化输入
【发布时间】:2016-09-13 08:32:44
【问题描述】:

我有一个 TensorFlow 模型(一个卷积神经网络),我成功地使用梯度下降 (GD) 对一些输入数据进行了训练。

现在,在第二步中,我想提供一个输入图像作为初始化,然后使用 GD 使用固定网络参数优化这个输入图像。损失函数会有所不同,但这是一个细节。

所以,我的主要问题是如何告诉梯度下降算法

  • 停止优化网络参数
  • 对输入图像进行优化

第一个可以用这个完成 Holding variables constant during optimizer

你们对第二点有什么想法吗?

我想我可以使用 TF 梯度函数自己重新编码梯度下降算法,但我的直觉告诉我应该有一个更简单的方法,这也让我可以从更复杂的 GD 变体(Adam 等)中受益。

【问题讨论】:

  • 你找到答案了吗?
  • 不,我没有。实际上,我自己编写了 SGD 算法。

标签: tensorflow


【解决方案1】:

无需您自己实施可持续发展目标。 TensorFlow 提供所有功能:

import tensorflow as tf
import numpy as np

# some input
data_pldhr = tf.placeholder(tf.float32)
img_op = tf.get_variable('input_image', [1, 4, 4, 1], dtype=tf.float32, trainable=True)
img_assign = img_op.assign(data_pldhr)

# your starting image
start_value = (np.ones((4, 4), dtype=np.float32) + np.eye(4))[None, :, :, None]


# override variable_getter
def nontrainable_getter(getter, *args, **kwargs):
    kwargs['trainable'] = False
    return getter(*args, **kwargs)


# all variables in this scope are not trainable
with tf.variable_scope('myscope', custom_getter=nontrainable_getter):
    x = tf.layers.dense(img_op, 10)
    y = tf.layers.dense(x, 10)

# the usual stuff
cost_op = tf.losses.mean_squared_error(x, y)
train_op = tf.train.AdamOptimizer(0.1).minimize(cost_op)

# fire up the training process
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(img_assign, {data_pldhr: start_value})

    print(sess.run(img_op))
    for i in range(10):
        _, c = sess.run([train_op, cost_op])
        print(c)
    print(sess.run(img_op))

【讨论】:

    【解决方案2】:
    1. 将图像表示为tf.Variabletrainable=True
    2. 用起始图像初始化这个变量(初始猜测)
    3. 使用带有trainable=False 的TF 变量重新创建NN 图,并使用tf.assign 从经过训练的NN 图中复制权重
    4. 计算损失函数
    5. 将损失插入到任何您想要的 TF 优化器算法中

    【讨论】:

    • 谢谢。我使用我自己的 SGD 版本解决了这个问题……然后切换到 PyTorch。
    • 使用'tf.get_variable'!
    【解决方案3】:

    另一种选择是使用ScipyOptimizerInterface,它允许使用 scipy 的最小化器。这支持约束最小化。

    【讨论】:

      【解决方案4】:

      我正在寻找相同问题的解决方案,但我的模型并不容易,因为我有一个 LSTM 网络,其中包含使用 MultiRNNCell 创建的单元格,我认为不可能获得权重并克隆网络。有什么解决方法可以让我计算输入的梯度吗?

      【讨论】:

        猜你喜欢
        • 2018-08-18
        • 2016-10-30
        • 2021-07-16
        • 1970-01-01
        • 2019-01-31
        • 2023-03-11
        • 1970-01-01
        • 2019-04-19
        • 1970-01-01
        相关资源
        最近更新 更多