我想通过包含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每个时间步的输出。
答案 0 :(得分:0)
获取与批量大小相对应的变量的特定形状(使用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])