创建一个形状仅在运行时确定的变量

时间:2017-05-19 07:21:57

标签: tensorflow

我正在尝试为RNN单元创建输入

  1. 尺寸x
  2. 的输入张量batch_size x time_step x n_classes
  3. 尺寸h
  4. 的初始隐藏状态张量batch_size x hidden_state_size

    现在的问题是,我不确定如何使用tf.get_variable(...)创建h,使其形状为? x hidden_state_size,其中?是当前批量大小。

    x我没有这个问题,因为我可以这样定义x

    x = tf.nn.embedding_lookup(self.pretrained_embeddings, self.input_placeholder)
    x = tf.reshape(x, (-1, self.max_length, Config.n_features * Config.embed_size))
    

    因此,batch_size会自tf.reshape

    自动推断出来

    所以x.get_shape()会给我(?, max_length, n_features * embed_size)

    我必须创建h的唯一解决方法如下:

     # x_ is of shape (max_length, batch_size, n_features * embed_size)
     x_ = tf.unstack(x, axis = 1) 
    
     # h is of shape (batch_size, n_features)
     h = tf.get_variable("h", tf.shape(x_[0]), initializer = 
     tf.constant_initializer(0.0))
    

    然后h.get_shape()会提供所需的(?, n_features * embed_size),其偶然性等于我的hidden_state_size。此解决方法的问题在于,仅当hidden_state_size等于n_features * embed_size时才有效,但并非总是如此。

    有没有办法让我可以定义隐藏的张量h,使其形状为(?, hidden_state_size)而不会出现错误:

      

    ValueError:必须完全定义新变量(pred / h)的形状,   但相反是(?,300)

1 个答案:

答案 0 :(得分:0)

傻傻的我可以做一些像:

h = tf.zeros(shape = (tf.shape(x)[0], n_features * embed_size))