【问题标题】:Tensorflow: Recurrent Neural Network Batch TrainingTensorflow:递归神​​经网络批量训练
【发布时间】:2017-07-05 23:42:49
【问题描述】:

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

问题是序列标记,输入大小是 [32, 48, 900],其中 32 是批量大小,48 是时间步长,900 是词汇大小,它是一个热编码向量。输出为 [32, 48, 145],其中前两个维度与输入相同,但最后一个维度是输出词汇量大小(one-hot)。基本上这是一个 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))

【问题讨论】:

    标签: python tensorflow tensor rnn


    【解决方案1】:

    问题可能落在ys的大小上,ys应该有[32,48,145]的大小,但是输出的ys只有[48,145]的大小,所以如果batchsize为1,则taget size 为 [1, 48, 145],降维后与 [48,145] 大小相同。

    要解决这个问题,您可以添加一个循环来处理批量大小(输入[0]):

    如:

    for i in range(inputs.getshape(0)):
       for t, xs_t in enumerate(tf.split(inputs[i], self.seq_length, axis=0)):
    

    【讨论】:

    • 谢谢,它解决了问题,但语法如下:for i in range(inputs.get_shape()[0])
    猜你喜欢
    • 2012-03-15
    • 2017-05-23
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2013-03-28
    • 2010-11-20
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多