0

我一直在嘗試做一個簡單的2層神經網絡。我研究了tensorflow api和官方教程,我做了一個分層模型,但在神經網絡中遇到了麻煩。下面是導致錯誤的我的代碼段:TensorFlow concat中的排名不匹配錯誤

with graph.as_default(): 
    tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size * image_size)) 
    tf_train_labels = tf.placeholder(tf.int32, shape=(batch_size, num_labels)) 
    tf_valid_dataset = tf.constant(valid_dataset) 
    tf_test_dataset = tf.constant(test_dataset) 

    weights0 = tf.Variable(tf.truncated_normal([image_size**2, num_labels])) 
    biases0 = tf.Variable(tf.zeros([num_labels])) 

    hidden1 = tf.nn.relu(tf.matmul(tf_test_dataset, weights0) + biases0) 

    weights1 = tf.Variable(tf.truncated_normal([num_labels, image_size * image_size])) 
    biases1 = tf.Variable(tf.zeros([image_size**2])) 

    hidden2 = tf.nn.relu(tf.matmul(hidden1, weights1) + biases1) 


    logits = tf.matmul(hidden2, weights0) + biases0 

    labels = tf.expand_dims(tf_train_labels, 1) 

    indices = tf.expand_dims(tf.range(0, batch_size), 1) 

    concated = tf.concat(1, [indices, tf.cast(labels,tf.int32)]) 

    onehot_labels = tf.sparse_to_dense(concated, tf.pack([batch_size, num_labels]), 1.0, 0.0) 


    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, onehot_labels)) 

    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 

    train_prediction = tf.nn.softmax(logits) 
    valid_prediction = tf.nn.softmax(tf.matmul(tf.nn.relu(tf.matmul(tf.nn.relu(tf.matmul(tf_valid_dataset,weights0) + biases0),weights1)+biases1),weights0)+biases0) 
    test_prediction = tf.nn.softmax(tf.matmul(tf.nn.relu(tf.matmul(tf.nn.relu(tf.matmul(tf_test_dataset,weights0) + biases0),weights1)+biases1),weights0)+biases0) 

的錯誤是:

Traceback (most recent call last): 
    File "./test1.py", line 60, in <module> 
    concated = tf.concat(1, [indices, tf.cast(labels,tf.int32)]) 
    File "/Users/username/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 309, in concat 
    name=name) 
    File "/Users/username/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 70, in _concat 
    name=name) 
    File "/Users/username/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 664, in apply_op 
    op_def=op_def) 
    File "/Users/username/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1836, in create_op 
    set_shapes_for_outputs(ret) 
    File "/Users/username/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1476, in set_shapes_for_outputs 
    shapes = shape_func(op) 
    File "/Users/username/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 364, in _ConcatShape 
    concat_dim + 1:].merge_with(value_shape[concat_dim + 1:]) 
    File "/Users/username/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/tensor_shape.py", line 527, in merge_with 
    self.assert_same_rank(other) 
    File "/Users/username/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/tensor_shape.py", line 570, in assert_same_rank 
    "Shapes %s and %s must have the same rank" % (self, other)) 
    ValueError: Shapes TensorShape([]) and TensorShape([Dimension(10)]) must have the same rank 

下面是完整的代碼:http://pastebin.com/sX7RqbAf

我已經使用TensorFlow和Python 2.7。我對神經網絡和機器學習頗爲陌生,所以請原諒我的任何錯誤。

回答

2

在您的例子:

  • tf_train_labels具有形狀[batch_size, num_labels]
  • 因此labels已經塑造[batch_size, 1, num_labels]
  • indices已經塑造[batch_size, 1]

因此,當你寫:

concated = tf.concat(1, [indices, tf.cast(labels,tf.int32)]) 

它會拋出錯誤,因爲labelsindices的第三維不同。 labels具有尺寸爲num_labels(推測爲10)的第三維,並且indices沒有第三維。

+0

你能告訴我如何解決這個問題嗎? –

+2

很難知道如何解決它,而不知道你想要完成什麼。根據你試圖將稀疏轉化爲密集的事實來判斷,並且你正在使用softmax交叉熵(而不是sigmoid),我猜你正在建模一個單一標籤而不是多個標籤分類網絡。在那種情況下,你的'tf_train_labels'張量已經很密集了,'logits'也是如此,所以我認爲你不需要將任何東西從稀疏轉換爲稠密。所以我只是省略'onehot_labels'的計算,直接根據'tf_train_labels'和'logits'計算'loss'。 –