使用占位符作为形状

时间:2017-06-28 16:34:24

标签: tensorflow lstm

我想通过包含BatchSize维度初始化Weights变量,BatchSize维度在Training和Prediction阶段之间会有所不同。尝试使用占位符,但似乎不起作用:

    batchsize = tf.placeholder(tf.int32, name='batchsize', shape=[])
    ...
    output, state = tf.nn.dynamic_rnn(multicell, X, dtype=tf.float32, initial_state=inState)
    weights = tf.Variable(tf.truncated_normal([batchsize, CELL_SIZE, 1], 0.0, 1.0), name='weights')
    bias = tf.Variable(tf.zeros(1), name='bias')
    preds = tf.add(tf.matmul(output, weights), bias, name='preds')
    loss = tf.reduce_mean(tf.squared_difference(preds, Y_))
    train_step = tf.train.AdamOptimizer(LR).minimize(loss)

我可以通过将batchsize指定为weights变量维度的常量而不是占位符来使其工作,但这样我在尝试恢复会话时遇到错误预测阶段,因为batchsize是1.如果我指定占位符,我会收到错误:

ValueError: initial_value must have a shape specified: Tensor("truncated_normal:0", shape=(?, 32, 1), dtype=float32)

即使我在运行图的这一部分时确实将batchsize占位符的值传递给feed_dict

如果我在创建权重变量时指定选项validate_shape=False,则图表的该阶段可以正常工作,但稍后我会在AdamOptimizer中收到此错误:

ValueError: as_list() is not defined on an unknown TensorShape.

我怎样才能让它发挥作用?我的最终目标是将dynamic_rnn输出的Cell-Size维度减少到1,以预测RNN每个时间步的输出。

1 个答案:

答案 0 :(得分:0)

  1. 制作变量的整个大小
  2. 获取与批量大小相对应的变量的特定形状(使用tf.gather)

    self.model_X = tf.placeholder(dtype = tf.float32,shape = [None,100],name =' X')

    real_batch_size = tf.cast(tf.shape(self.model_X)[0],tf.int32)

    self.y_dk = tf.get_variable(name =" y_dk",initializer = tf.truncated_normal(shape = [self.num_doc,self.num_topic],mean = 0,stddev = tf.truediv( 1.0,self.lambda_y)),dtype = tf.float32)

    batch_y_dk = tf.reshape(tf.gather(self.y_dk,self.model_batch_data_idx),[real_batch_size,self.num_topic])