【问题标题】:tf.get_variable doesn't accept Tensors for shapetf.get_variable 不接受张量的形状
【发布时间】:2017-04-18 20:59:06
【问题描述】:

似乎tf.get_variable 不接受Tensor 的形状,只接受int。这与可以接受Tensorstf.Variable 不同。这是正确的吗?如果是这样,当形状为Tensor 时,是否有解决方法让tf.get_variable 工作?我不想在图构建的这个阶段运行session,因为它会使下游的许多事情变得复杂。

我正在尝试将 cuDNN 绑定用于 RNN,这涉及在使用 CudnnLSTM 创建的模型上调用 params_size()。这会以Tensor 的形式返回要保存在参数缓冲区中的参数数量,然后用于创建保存参数的变量。我不想使用 tf.Variable 以及所有警告,而是使用 tf.get_variable 来保存参数值,以便我可以使用与 tf.get_variable 等兼容的所有各种初始化程序轻松初始化它们。所有新的机器是围绕tf.get_variable构建的,所以不得不回到底层的tf.Variable非常麻烦。 tf.get_variable 不接受 Tensorstf.Variable 接受似乎是一个非常奇怪的限制。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    解决方法是提供一个具有形状但动态的构造器。例如,而不是

    s = tf.placeholder(tf.int32, shape=())
    init = tf.random_normal_initializer()
    tf.get_variable('foo', shape=(s,), initializer=init) # error, shape cannot be a Tensor
    

    你会使用

    s = tf.placeholder(tf.int32, shape=())
    init = tf.random_normal((s,))
    tf.get_variable('foo', initializer=init, validate_shape=False)
    

    但是请注意,变量的初始化现在很棘手。调用tf.global_variables_initializer() 将尝试初始化'foo',因此您需要确保它可以被初始化(必要时提供一些值)或自己处理初始化。

    另一种解决方法是将变量初始化为任何值(例如零标量),然后在已知形状时将tf.assign 初始化为具有所需形状的值。在初始化过程中使用起来会更容易一些,因为在 fir assign 之后会丢弃初始值,因此它可能是一个不错的选择。

    【讨论】:

      【解决方案2】:

      你可以做一些类似的事情

      input = tf.constant([[1,2,3]])
      dim = input.get_shape()[1]
      w = tf.get_variable('foo', shape=(dim, dim))
      

      【讨论】:

        猜你喜欢
        • 2019-09-01
        • 2018-12-13
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        • 2018-02-26
        相关资源
        最近更新 更多