获得给定优化器在Tensorflow中最小化的损失

iva*_*esp 5 neural-network deep-learning tensorflow

我正在为我的Tensorflow工作区使用单元测试系统,我想知道是否存在任何方法或属性(给定具有优化器操作的图形(在调用.minimize()之后),以获得最终的损失张量)正在优化以及它所控制的变量。

例如,如果我打电话给train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)我,我想只访问train_op来检索cross_entropy。

我可以访问该train_op对象,我只想知道该对象所引用的损失以及哪个变量控制。

Dav*_*rks 3

很简单:

def build_graph():
  cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(...)
  train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
  return cross_entropy, train_op    # both tensorflow OPs

cross_entropy, train_op = build_graph()

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())

  # Evaluate and return cross_entropy, and execute the train_op (update the weights)
  result = sess.run([cross_entropy, train_op], feed_dict={...})

  print(result[0])   # The value of the cross entropy loss function
Run Code Online (Sandbox Code Playgroud)

这里有许多优秀的教程:https ://github.com/aymericdamien/TensorFlow-Examples

您会发现他们在完整的工作模型中正是这样做的。

如果您无权访问张量,则可以按名称在图中查找它,如下所示:

tf.get_default_graph().get_tensor_by_name("example:0")
Run Code Online (Sandbox Code Playgroud)

请参阅此问题:Tensorflow:如何按名称获取张量?

请注意,如果您没有很好地命名张量,这将是一个巨大的麻烦,因此,这是为张量命名的众多好理由之一。张量的默认名称将使用对操作的一些引用、冒号、索引号,例如第三个加法操作的“add:2”。

您可以使用以下命令获取图中所有张量的列表:

[n.name for n in tf.get_default_graph().as_graph_def().node]
Run Code Online (Sandbox Code Playgroud)

该代码是从这个问题复制的:In Tensorflow, get the names of all the Tensors in a graph


在评论中回答这个后续问题:

我想知道哪一个是 train_op 优化的,而不必用特定的名称来命名它们。因此,给定一个 train_op 对象,是否有任何方法可以检索代表 train_op 最小化的最后一个值的张量(或张量的名称)?我需要它,因为我正在自动化一组单元测试,这样如果我将张量流模型插入我的系统,它会在给定优化器的情况下自动找到代表损失的张量(这样我就可以自动执行梯度检查)。

作为我研究的一部分,我编写了一个梯度下降优化器。以下是您可能会考虑的一些想法:

1)这是我在执行相同操作时遵循的优化器的链接: https: //github.com/openai/iaf/blob/master/tf_utils/adamax.py这是在 python 中实现 AdaMax。您会感兴趣的是_apply_dense()它采用梯度及其变量并执行更新。每个可训练变量都会调用它。请注意,tensorflow 中的大多数优化器都是用 C 编写的,而不是使用 python 接口。所以我不确定这是否有帮助,但更好地理解这个过程并不是一件坏事。

2)您可以获得任何变量相对于任何其他变量的梯度。因此,您可以使用 获取可训练变量的集合tf.trainable_variables(),然后调用tf.gradients以获取可训练变量相对于损失函数的梯度。不过,您需要损失函数而不是训练OP。我希望你可以从优化器中自动找到损失。

如果您只是想从训练OP中找到损失函数,您可能会通过遵循图依赖关系来找到您需要的东西,如这个问题中所述:How can I list all Tensorflow variables a node dependents?

这是我之前使用过的一种获取每个变量及其输入和输出的列表的方法。我怀疑你可以弄清楚如何遍历这个数据结构来找到你需要的东西。

tf.get_default_graph().as_graph_def()

Out[6]: 
node {
  name: "x"
  op: "Const"
  attr {
    key: "dtype"
    value {
      type: DT_FLOAT
    }
  }
  attr {
    key: "value"
    value {
      tensor {
        dtype: DT_FLOAT
        tensor_shape {
        }
        float_val: 42.0
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)