【问题标题】:Tensorflow RNN shape mismatch- logits_size=[5,2] labels_size=[50,2] - Batch size is 10Tensorflow RNN 形状不匹配 - logits_size=[5,2] labels_size=[50,2] - 批量大小为 10
【发布时间】:2017-03-14 07:49:06
【问题描述】:

我正在 Tensorflow 中进行简单的 LSTM 实现,但在尺寸方面遇到了一些问题。所以,我的

batch size = 10
time_steps = 5
num_classes = 2 
input_size = 4

占位符是

x = tf.placeholder('float',[None,time_steps,input_size])

y = tf.placeholder('float',[None,None,num_classes])

我通过从 csv 文件中输入数据来运行它

_, c = sess.run([optimizer, cost], feed_dict={x: _x, y: _y}) 我设置了_x.shape = (10, 5, 4)_y.shape = (10, 5, 2) 符合TF的(batch,time_steps, input_size)要求。

我已经在互联网和博客文章上完成了一些实现(主要是在 MNIST 数据集上),我想我已经理解了它的工作原理。 TF 期望 logits 和 labels 参数是具有 batch_size 行和 num_classes 列的二维张量。现在,我为每个条目都有一个分类标签。我已将它们转换为 one-hot 格式。如果我提供总共 50 个数据条目,我也应该提供 50 个标签,对吧?

将 y 占位符更改为 [None,num_classes],因此其他一些内容也会出错。

但如果我将batch_size 更改为1,我可以让代码运行,直到行

correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) 我在哪里出错 ValueError: Dimensions must be equal, but are 5 and 2 for 'Equal' (op: 'Equal') with input shapes: [5], [?,2]. 因为预测形状是(5, 2) 而y 是(?, ?, 2)

我对它应该如何工作的理解是否存在根本性错误?

完整代码可以在Simple RNN Gist查看

谢谢

【问题讨论】:

    标签: tensorflow lstm


    【解决方案1】:

    代码的第 30 行对 RNN 的输出做了一些奇怪的事情。 RNN 输出其典型的 3D 张量(batch_size、time_steps、cell_output_dim),通过切片操作(输出 [-1])变为 2D。显然,损失函数并不期望这种张量,所以你得到了一个错误。如果你想在多维张量上应用前馈神经网络,我建议你使用tf.contrib.layers.fully_connected 函数,它会自动为你的网络创建权重,并对输入张量应用正确的操作。

    您的代码中还有另一个错误。您正在尝试将 softmax_cross_entropy_with_logits 应用于 3D 张量。不幸的是,您不能这样做,因此您需要执行以下操作:

    1. 将张量重塑为维度(batch_size * time_steps, num_classes);
    2. 使用 softmax_cross_entropy_with_logits 对每个 batch_size * time_steps 示例应用损失函数(现在可以正确应用);
    3. 平均损失值(这只是一种可能性,您可以根据需要汇总损失值)。

    我无法在此处提供完整的解决方案,因为我没有您的数据,因此无法准确执行您的代码。但是,我将报告以下简化的sn-p:

    import tensorflow as tf
    import numpy as np
    from tensorflow.contrib import rnn 
    
    num_classes = 2
    batch_size  = 10
    time_steps = 5
    
    #input has 4 features
    input_size = 4
    num_hidden = 6
    
    x = tf.placeholder('float',[None,time_steps,input_size])
    y = tf.placeholder('float',[None,None,num_classes])
    
    def neural_net_model(data):
        lstmCell = rnn.BasicLSTMCell(num_hidden)
    
        outputs, state = tf.nn.dynamic_rnn(lstmCell,x, dtype=tf.float32)
        print(outputs)
    
        output = tf.contrib.layers.fully_connected(
            outputs,
            num_classes,
            weights_initializer=tf.random_normal_initializer()
        )
        return output
    
    def train_neural_net(x):
        num_epochs = 2
        num_examples = 1000 #np_df.shape[0] - reduced to 1000 for debugging 
        with tf.Session() as sess:
            predictions = neural_net_model(x)
            reshaped_predictions = tf.reshape(predictions, (-1, num_classes))
            reshaped_targets = tf.reshape(y, (-1, num_classes))
            cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=reshaped_predictions,labels=reshaped_targets))
    

    【讨论】:

    • 谢谢 :) 这似乎有效。因此,从我收集的信息来看,如果我提供我的标签,在本例中为 _y,以 3D 矩阵的形式(在我的情况下为 10x5x2)我需要在应用成本函数之前将其减少为 2D 张量(此处为 50x2) ?对预测也需要做同样的事情,以 3D 矩阵的形式返回
    • 没错,没错。事实上,这就是我在我报告的简化的 sn-p 中所做的。如果您对答案感到满意,请随时将其标记为已解决:)
    • 有点疑问,所以我不妨在这里问一下。在这种情况下,我如何计算某些测试数据(或训练本身)的准确性,我从 csv 文件中获取行,格式化并将其提供给模型。简单的sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) 是不够的。我更新了要点以提供一些清晰的信息非常感谢
    • 您需要定义相关的准确性操作(在从头开始实施之前查看 TF 指标),并且您需要完全按照您在 TF 中定义的所有其他操作来执行它。显然,您需要在 session.run() 调用中指定要计算指标的输入数据。
    猜你喜欢
    • 2019-05-25
    • 2017-09-12
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2019-03-22
    • 2021-11-25
    相关资源
    最近更新 更多