Подтвердить что ты не робот

Что мне не хватает в этом читателе csv для TensorFlow?

В основном это папка с копиями из учебника на веб-сайте. Я получаю сообщение об ошибке:

Недопустимый аргумент: ConcatOp: ожидаемые конкатенирующие измерения в диапазон [0, 0), но получил 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)
4b9b3361

Ответ 1

Проблема возникает из-за формы тензоров в вашей программе. TL; DR Вместо tf.concat() вы должны использовать tf.pack(), который преобразует четыре скалярных тензора col в одномерный тензор длины 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.
  # ...

Ответ 2

Я также придерживаюсь этого учебника. Я смог обменять одну проблему на другую, когда я изменил ваш 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, вы увидите, что выполняется только одна итерация. Скорее всего, это не очень полезно (потому что я торгую ошибкой для бесконечного выполнения).