Tensorflow RNN形状不匹配 - logits_size = [5,2] labels_size = [50,2] - 批量大小为10

时间:2017-03-14 07:49:07

标签: tensorflow lstm

我正在使用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列的2-D张量。现在,我为每个条目都有一个分类标签。我已将它们转换为单热格式。如果我从数据中提供总共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

查看完整代码

由于

1 个答案:

答案 0 :(得分:1)

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

您的代码中还有其他错误。您正尝试在3D张量上应用softmax_cross_entropy_with_logits。不幸的是,你不能这样做,所以你需要做以下事情:

  1. 将张量重塑为尺寸(batch_size * time_steps,num_classes);
  2. 使用softmax_cross_entropy_with_logits(现在可以正确应用)为每个batch_size * time_steps示例应用损失函数;
  3. 平均损失值(这只是一种可能性,您可以根据需要汇总损失值)。
  4. 我无法在此提供完整的解决方案,因为我没有您的数据,因此我无法准确执行您的代码。但是,我将报告以下简化代码段:

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