【问题标题】:How to print weights in Tensorflow?如何在 Tensorflow 中打印权重?
【发布时间】:2018-08-25 04:58:31
【问题描述】:

我正在尝试获取 hidden_​​layer2 的权重矩阵并打印它。 似乎我能够获得权重矩阵,但我无法打印它。

当使用tf.Print(w, [w]) 时,它什么也不打印。 当使用print(tf.Print(w,[w]) 时,它至少会打印出有关张量的信息:

Tensor("hidden_layer2_2/Print:0", shape=(3, 2), dtype=float32)

我也尝试在 with-Statement 之外使用tf.Print(),结果相同。

完整代码在这里,我只是在前馈神经网络中处理随机数据:https://pastebin.com/KiQUBqK4

我的代码的一部分:

hidden_layer2 = tf.layers.dense(
        inputs=hidden_layer1,
        units=2,
        activation=tf.nn.relu,
        name="hidden_layer2")


with tf.variable_scope("hidden_layer2", reuse=True):
        w = tf.get_variable("kernel")
        tf.Print(w, [w])
        # Also tried tf.Print(hidden_layer2, [w])

【问题讨论】:

  • 你后来运行图表了吗? tf.Print() 是图表上的另一个 OP,在您评估图表之前不会执行。检查this answer
  • 我想我做到了,因为网络产生了输出。我使用 tf.app.run() 来运行我的整个 main 函数。

标签: python tensorflow


【解决方案1】:

为 TENSORFLOW 2.X 更新

从 TensorFlow 2.0 (>= 2.0) 开始,由于 Session 对象已被移除,并且推荐的高级后端是 Keras,因此获取权重的方法是:

from tensorflow.keras.applications import MobileNetV2

model = MobileNetV2(input_shape=[128, 128, 3], include_top=False) #or whatever model
print(model.layers[0].get_weights()[0])

【讨论】:

    【解决方案2】:

    我认为这里有多个问题需要解决。

    1. 运行 eval() 应该伴随一个会话。正如In TensorFlow, what is the difference between Session.run() and Tensor.eval()? 中所建议的那样,.eval() 期望默认会话正在运行,这在您之前的情况下不太可能。所以,这里最好的选择是在代码之前加上一个会话。从您的评论中,我们可以看到这已经完成了。

    2. 一旦图形完成,隐藏层中的变量(即权重/内核)需要初始化。因此,您可能想要使用类似的东西:

      init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) with tf.variable_scope("hidden_layer2", reuse=True): w = tf.get_variable("kernel") print(w.eval(session=sess))

    【讨论】:

    • 我还认为最好在函数之外的任何地方使用它的名称打印张量。可以使用[node.name for node in tf.get_default_graph().as_graph_def().node] 获得图中的现有张量,并打印张量tf.get_default_graph().get_tensor_by_name("<<some tensor name>>:<<its index>>").eval(session=<<session name>>),例如tf.get_default_graph().get_tensor_by_name("const:0").eval(session=sess).
    【解决方案3】:

    尝试这样做,

    w = tf.get_variable("kernel")
    print(w.eval())
    

    【讨论】:

    • Eval 对我不起作用。如果我使用您的代码,它会显示“未注册默认会话,请使用 eval(session=sess)”,如果我创建会话并将其传递给 eval,则会显示“尝试使用未初始化的值 hidden_​​layer2/kernel”
    • 试试这个 import tensorflow as tf ; sess = tf.InteractiveSession() ; a = tf.print(w,[w]) ;打印(a.eval()); #我用分号来显示一个新行,因为它是一个注释
    • 感谢您的回答,但这也不起作用。它说我想从中获取权重的层尚未初始化。也许我需要在其他地方运行它。我在我的问题中添加了完整的代码。
    • 希望有更合格的人尽快回答并帮助您。 :) 祝你好运。如果您找到解决方案,请在此处提及。 :)
    • 好的,我没有找到任何其他可行的解决方案。我现在切换到 keras,它可以在几秒钟内工作,并且对于模型中第 0 层的权重没有这样的问题: layer0 = model.layers[0];权重 = layer0.get_weights()[0];
    【解决方案4】:

    我采取了不同的方法。首先,我列出所有可训练变量并使用所需变量的索引并使用当前会话运行它。下面附上代码:

    variables = tf.trainable_variables()
    
    init = tf.global_variables_initializer()
    sess = tf.Session()
    sess.run(init)
    
    print("Weight matrix: {0}".format(sess.run(variables[0])))  # For me the variable at the 0th index was the one I required
    

    【讨论】:

      【解决方案5】:

      关于如何在tensorflow.js 中打印每层权重的示例:

      // 
      const model = tf.sequential();
      ...
      
      // kernel:
      model.layers[0].getWeights()[0].print()
      
      // bias:
      model.layers[0].getWeights()[1].print()
      

      【讨论】:

        【解决方案6】:

        作为 Tensorflow 2 中 Timbus Calin 答案的更新,也可以使用 get_weights(),特别是 get_weights()[1] 访问偏差。

        例如在前馈网络中访问和打印权重和偏差:

        for layer in self.model.layers:
              print(layer.get_weights()[0]) # weights
              print(layer.get_weights()[1]) # biases
        

        【讨论】:

          猜你喜欢
          • 2018-01-06
          • 2017-07-26
          • 2023-04-02
          • 2016-10-03
          • 2022-06-12
          • 2020-06-05
          • 1970-01-01
          • 1970-01-01
          • 2016-09-01
          相关资源
          最近更新 更多