2015-11-13 2 views
13

В основном это копия пасты из учебника, на веб-сайте. Я получаю сообщение об ошибке:Что мне не хватает в этом читателе csv для TensorFlow?

Invalid argument: ConcatOp : Expected concatenating dimensions in the range [0, 0), but got 0 [[Node: concat = Concat[N=4, T=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"](concat/concat_dim, DecodeCSV, DecodeCSV:1, DecodeCSV:2, DecodeCSV:3)]]

содержимое моего файла CSV является:

3,4,1,8,4

import tensorflow as tf 


filename_queue = tf.train.string_input_producer(["test2.csv"]) 

reader = tf.TextLineReader() 
key, value = reader.read(filename_queue) 

# Default values, in case of empty columns. Also specifies the type of the 
# decoded result. 
record_defaults = [[1], [1], [1], [1], [1]] 
col1, col2, col3, col4, col5 = tf.decode_csv(
    value, record_defaults=record_defaults) 
# print tf.shape(col1) 

features = tf.concat(0, [col1, col2, col3, col4]) 
with tf.Session() as sess: 
    # Start populating the filename queue. 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 

    for i in range(1200): 
    # Retrieve a single instance: 
    example, label = sess.run([features, col5]) 

    coord.request_stop() 
    coord.join(threads) 
+0

К сожалению, пример кода (http://tensorflow.org/how_tos/reading_data/index.md) содержит эту ошибку –

ответ

13

Проблема возникает из-за формы тензоров в вашей программе. TL; DR Вместо tf.concat() вы должны использовать tf.pack(), который преобразуют четыре скалярных col тензоров в тензор 1-D длина 4.

Перед тем, как начать, обратите внимание, что вы можете использовать метод get_shape() на любой объект Tensor, чтобы получить информацию о статической форме об этом тензоре. Например, закомментированная строка в коде может быть:

print col1.get_shape() 
# ==> 'TensorShape([])' - i.e. `col1` is a scalar. 

value тензора возвращаемого reader.read() скалярной строка. tf.decode_csv(value, record_defaults=[...]) производит для каждого элемента record_defaults тензор той же формы, что и value, то есть скаляр в этом случае. Скаляр представляет собой 0-мерный тензор с одним элементом. tf.concat(i, xs) не определен на скалярах: он объединяет список N-мерных тензоров (xs) в новый N-мерный тензор по размеру i, где 0 <= i < N, и нет i, если N = 0.

Оператор tf.pack(xs) предназначен для решения этой проблемы просто. Он принимает список k N-мерных тензоров (с одинаковой формой) и упаковывает их в N + 1-мерный тензор с размером k в 0-м измерении. Если заменить tf.concat() с tf.pack(), ваша программа будет работать:

# features = tf.concat(0, [col1, col2, col3, col4]) 
features = tf.pack([col1, col2, col3, col4]) 

with tf.Session() as sess: 
    # Start populating the filename queue. 
    # ... 
+0

В разделе CSV нуждается в уточнении и расширении, что точно. Мне потребовалось около 15 минут, чтобы узнать достаточно, чтобы кодировать нейронную сеть, которую я разработал для своей конкретной проблемы, используя инфраструктуру tensorflow. Прошло полдня, чтобы выяснить, как читать некоторые очень простые данные csv. – demongolem

+0

Спасибо за отзыв! Пожалуйста, поднимите проблему GitHub, если есть конкретные вещи, которые вы хотели бы нам уточнить: https://github.com/tensorflow/tensorflow/issues – mrry

1

Я также застрял с этим tutorial. Я был в состоянии обменять одну проблему за другой, когда я изменил свой with tf.Session() для:

sess = tf.Session() 
coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(coord=coord) 

for i in range(2): 
    #print i 
    example, label = sess.run([features, col5]) 

coord.request_stop() 
coord.join(threads) 

sess.close() 

исчезла ошибка, TF начал работать, но, похоже, он застрял. Если вы раскомментируете # print, вы увидите, что выполняется только одна итерация. Скорее всего, это не очень полезно (потому что я торгую ошибкой для бесконечного выполнения).

Смежные вопросы