首页 文章

Tensorflow:循环神经网络批量训练

提问于
浏览
2

我正在尝试在Tensorflow中实现RNN . 我正在编写自己的函数,而不是使用RNN单元来练习 .

问题是序列标记,输入大小是[32,48,900],其中32是批量大小,48是时间步长,900是词汇大小,这是一个热编码的向量 . 输出为[32,48,145],其中前两个维度与输入相同,但最后一个维度是输出词汇量大小(一个热点) . 基本上这是一个NLP标记问题 .

我收到以下错误:

InvalidArgumentError(请参见上面的回溯):logits和label必须大小相同:logits_size = [48,145] labels_size = [1536,145]

实际的labels_size是[32,48,145],但它合并前两个维度而没有我的控制 . 仅供参考32 * 48 = 1536

如果我运行批量大小为1的RNN,它可以正常工作 . 我无法弄清楚如何解决这个问题 . 我在代码的最后一行得到了问题 .

我粘贴了代码的相关部分:

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))

1 回答

  • 0

    问题可能在于ys的大小,ys应该具有[32,48,145]的大小,但是输出ys的大小只有[48,145],所以如果batchsize是1,则taget大小为[ 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)):
    

相关问题