Tensorflow:循环神经网络批量训练
Tensorflow: Recurrent Neural Network Batch Training
我正在尝试在 Tensorflow 中实现 RNN。我在写自己的函数,而不是使用 RNN 单元来练习。
问题是序列标记,输入大小是 [32, 48, 900],其中 32 是批量大小,48 是时间步长,900 是单热编码向量的词汇量大小。输出是 [32, 48, 145],其中前两个维度与输入相同,但最后一个维度是输出词汇量大小(one-hot)。基本上这是一个 NLP 标注问题。
我收到以下错误:
InvalidArgumentError (see above for traceback): logits and labels must
be same size: logits_size=[48,145] labels_size=[1536,145]
实际的 labels_size 是 [32, 48, 145] 但它在我无法控制的情况下合并了前两个维度。仅供参考 32*48 = 1536
如果我 运行 我的 RNN 批量大小为 1,它可以正常工作。我不知道如何解决这个问题。我在代码的最后一行遇到问题。
我把相关部分代码贴上来了:
inputs = tf.placeholder(shape=[None, self.seq_length, self.vocab_size], dtype=tf.float32, name="inputs")
targets = tf.placeholder(shape=[None, self.seq_length, self.output_vocab_size], dtype=tf.float32, name="targets")
init_state = tf.placeholder(shape=[1, self.hidden_size], dtype=tf.float32, name="state")
initializer = tf.random_normal_initializer(stddev=0.1)
with tf.variable_scope("RNN") as scope:
hs_t = init_state
ys = []
for t, xs_t in enumerate(tf.split(inputs[0], self.seq_length, axis=0)):
if t > 0: scope.reuse_variables()
Wxh = tf.get_variable("Wxh", [self.vocab_size, self.hidden_size], initializer=initializer)
Whh = tf.get_variable("Whh", [self.hidden_size, self.hidden_size], initializer=initializer)
Why = tf.get_variable("Why", [self.hidden_size, self.output_vocab_size], initializer=initializer)
bh = tf.get_variable("bh", [self.hidden_size], initializer=initializer)
by = tf.get_variable("by", [self.output_vocab_size], initializer=initializer)
hs_t = tf.tanh(tf.matmul(xs_t, Wxh) + tf.matmul(hs_t, Whh) + bh)
ys_t = tf.matmul(hs_t, Why) + by
ys.append(ys_t)
hprev = hs_t
output_softmax = tf.nn.softmax(ys) # Get softmax for sampling
#outputs = tf.concat(ys, axis=0)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=targets, logits=ys))
问题可能出在ys的大小上,ys应该有[32, 48, 145]的大小,但是输出ys只有[48,145]的大小,所以如果batchsize为1,目标大小为[1, 48, 145],降维后大小与[48,145]相同。
为了解决这个问题你可以添加一个循环来处理batchsize ( inputs[0] ) :
例如:
for i in range(inputs.getshape(0)):
for t, xs_t in enumerate(tf.split(inputs[i], self.seq_length, axis=0)):
我正在尝试在 Tensorflow 中实现 RNN。我在写自己的函数,而不是使用 RNN 单元来练习。
问题是序列标记,输入大小是 [32, 48, 900],其中 32 是批量大小,48 是时间步长,900 是单热编码向量的词汇量大小。输出是 [32, 48, 145],其中前两个维度与输入相同,但最后一个维度是输出词汇量大小(one-hot)。基本上这是一个 NLP 标注问题。
我收到以下错误:
InvalidArgumentError (see above for traceback): logits and labels must be same size: logits_size=[48,145] labels_size=[1536,145]
实际的 labels_size 是 [32, 48, 145] 但它在我无法控制的情况下合并了前两个维度。仅供参考 32*48 = 1536
如果我 运行 我的 RNN 批量大小为 1,它可以正常工作。我不知道如何解决这个问题。我在代码的最后一行遇到问题。
我把相关部分代码贴上来了:
inputs = tf.placeholder(shape=[None, self.seq_length, self.vocab_size], dtype=tf.float32, name="inputs")
targets = tf.placeholder(shape=[None, self.seq_length, self.output_vocab_size], dtype=tf.float32, name="targets")
init_state = tf.placeholder(shape=[1, self.hidden_size], dtype=tf.float32, name="state")
initializer = tf.random_normal_initializer(stddev=0.1)
with tf.variable_scope("RNN") as scope:
hs_t = init_state
ys = []
for t, xs_t in enumerate(tf.split(inputs[0], self.seq_length, axis=0)):
if t > 0: scope.reuse_variables()
Wxh = tf.get_variable("Wxh", [self.vocab_size, self.hidden_size], initializer=initializer)
Whh = tf.get_variable("Whh", [self.hidden_size, self.hidden_size], initializer=initializer)
Why = tf.get_variable("Why", [self.hidden_size, self.output_vocab_size], initializer=initializer)
bh = tf.get_variable("bh", [self.hidden_size], initializer=initializer)
by = tf.get_variable("by", [self.output_vocab_size], initializer=initializer)
hs_t = tf.tanh(tf.matmul(xs_t, Wxh) + tf.matmul(hs_t, Whh) + bh)
ys_t = tf.matmul(hs_t, Why) + by
ys.append(ys_t)
hprev = hs_t
output_softmax = tf.nn.softmax(ys) # Get softmax for sampling
#outputs = tf.concat(ys, axis=0)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=targets, logits=ys))
问题可能出在ys的大小上,ys应该有[32, 48, 145]的大小,但是输出ys只有[48,145]的大小,所以如果batchsize为1,目标大小为[1, 48, 145],降维后大小与[48,145]相同。
为了解决这个问题你可以添加一个循环来处理batchsize ( inputs[0] ) :
例如:
for i in range(inputs.getshape(0)):
for t, xs_t in enumerate(tf.split(inputs[i], self.seq_length, axis=0)):