【问题标题】:How does one initialize a variable with tf.get_variable and a numpy value in TensorFlow?如何在 TensorFlow 中使用 tf.get_variable 和 numpy 值初始化变量?
【发布时间】:2016-11-06 12:27:49
【问题描述】:

我想用 numpy 值初始化我网络上的一些变量。为了这个例子考虑:

init=np.random.rand(1,2)
tf.get_variable('var_name',initializer=init)

当我这样做时,我得到一个错误:

ValueError: Shape of a new variable (var_name) must be fully defined, but instead was <unknown>.

为什么会出现这个错误?

为了尝试修复它,我尝试这样做:

tf.get_variable('var_name',initializer=init, shape=[1,2])

这产生了一个更奇怪的错误:

TypeError: 'numpy.ndarray' object is not callable

我尝试阅读the docs and examples,但并没有真正帮助。

TensorFlow中的get_variable方法不能用numpy数组初始化变量吗?

【问题讨论】:

    标签: python numpy tensorflow


    【解决方案1】:

    如果将常量 NumPy 数组转换为常量Tensor,则以下工作:

    init = tf.constant(np.random.rand(1, 2))
    tf.get_variable('var_name', initializer=init)
    

    get_variable 的文档确实有点欠缺。仅供参考,initializer 参数必须是 TensorFlow Tensor 对象(在您的情况下,可以通过在 numpy 值上调用 tf.constant 来构造),或者是带有两个参数的“可调用” 、shapedtype,它应该返回的值的形状和数据类型。同样,在您的情况下,您可以编写以下内容以防您想使用“可调用”机制:

    init = lambda shape, dtype: np.random.rand(*shape)
    tf.get_variable('var_name', initializer=init, shape=[1, 2])
    

    【讨论】:

    • This 很好地回答了您的问题。
    • A callable 是一个函数或可以像函数一样调用的东西。
    • tf.get_variable('var_name', initializer=np.random.rand(1, 2)) 现在似乎可以在 r0.10 上使用。
    • 现在看来这已经稍微改变了,以至于lambda 需要一个名为partition_info 的额外输入,所以我不得不将定义修改为init = lambda shape, dtype, partition_info: np.random.rand(*shape)
    【解决方案2】:

    如果变量已经创建(即从一些复杂的函数),只需使用load

    https://www.tensorflow.org/api_docs/python/tf/Variable#load

    x_var = tf.Variable(tf.zeros((1, 2), tf.float32))
    x_val = np.random.rand(1,2).astype(np.float32)
    
    sess = tf.Session()
    x_var.load(x_val, session=sess)
    
    # test
    assert np.all(sess.run(x_var) == x_val)
    

    【讨论】:

      【解决方案3】:

      @keveman 回答的很好,补充一下,还有tf.get_variable('var_name', initializer=init)的用法,tensorflow文档确实给出了全面的例子。

      import numpy as np
      import tensorflow as tf
      
      value = [0, 1, 2, 3, 4, 5, 6, 7]
      # value = np.array(value)
      # value = value.reshape([2, 4])
      init = tf.constant_initializer(value)
      
      print('fitting shape:')
      tf.reset_default_graph()
      with tf.Session() :
          x = tf.get_variable('x', shape = [2, 4], initializer = init)
          x.initializer.run()
          print(x.eval())
      
          fitting shape :
      [[0.  1.  2.  3.]
      [4.  5.  6.  7.]]
      
      print('larger shape:')
      tf.reset_default_graph()
      with tf.Session() :
          x = tf.get_variable('x', shape = [3, 4], initializer = init)
          x.initializer.run()
          print(x.eval())
      
          larger shape :
      [[0.  1.  2.  3.]
      [4.  5.  6.  7.]
      [7.  7.  7.  7.]]
      
      print('smaller shape:')
      tf.reset_default_graph()
      with tf.Session() :
          x = tf.get_variable('x', shape = [2, 3], initializer = init)
      
          * <b>`ValueError`< / b > : Too many elements provided.Needed at most 6, but received 8
      

      https://www.tensorflow.org/api_docs/python/tf/constant_initializer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-30
        • 2017-06-16
        • 2017-05-22
        • 2019-01-23
        • 2016-12-21
        • 2017-11-30
        • 2016-05-01
        • 1970-01-01
        相关资源
        最近更新 更多