Статическая ошибка компоновки RNN логического вывода Tensorflow - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над программным обеспечением OCR, оптимизированным для изображений с камер телефона.

В настоящее время каждое изображение размером 300 x 1000 x 3 (RGB) переформатируется в виде массива 900 x 1000. У меня есть планы относительно более сложной модели архитектуры, но сейчас я просто хочу, чтобы базовая работа работала. Я хочу начать с тренировки статического RNN на сгенерированных мной данных.

Формально, я кормлю n_t на каждом временном шаге t для T временных шагов, где n_t - вектор 900, а T = 1000 (аналогично чтению всего изображения слева направо). Вот код Tensorflow, в котором я создаю партии для обучения:

sequence_dataset = tf.data.Dataset.from_generator(example_generator, (tf.int32, 
tf.int32))
sequence_dataset = sequence_dataset.batch(experiment_params['batch_size'])
iterator = sequence_dataset.make_initializable_iterator() 
x_batch, y_batch = iterator.get_next()

В документации tf.nn.static_bidirectional_rnn утверждается, что входные данные должны быть «списком входов длины T, каждый из которых представляет собой тензор формы [batch_size, input_size] или вложенный кортеж таких элементов». Итак, я делаю следующие шаги, чтобы получить данные в правильном формате.

# Dimensions go from [batch, n , t] -> [t, batch, n]
x_batch = tf.transpose(x_batch, [2, 0, 1])

# Unpack such that x_batch is a length T list with element dims [batch_size, n]
x_batch = tf.unstack(x_batch, experiment_params['example_t'], 0)

Не изменяя пакет дальше, я делаю следующий вызов:

output, _, _ = tf.nn.static_rnn(lstm_fw_cell, x_batch, dtype=tf.int32)

Обратите внимание, что я не указываю явно Tensorflow размеры матриц (это может быть проблемой). Все они имеют одинаковую размерность, но я получаю следующую ошибку:

ValueError: Input size (dimension 0 of inputs) must be accessible via shape 
inference, but saw value None.

В какой момент в моем стеке я должен объявлять размеры моего ввода? Поскольку я использую набор данных и надеюсь получить его пакеты непосредственно в RNN, я не уверен, что маршрут "placeholder -> feed_dict" имеет смысл. Если это действительно тот метод, который имеет больше смысла, дайте мне знать, как это выглядит (я точно не знаю). В противном случае, дайте мне знать, если у вас есть другие идеи по этой проблеме. Спасибо!

1 Ответ

0 голосов
/ 03 мая 2018

Причиной отсутствия статической информации о форме является то, что TensorFlow недостаточно понимает функцию example_generator для определения форм массивов, которые она выдает, и поэтому предполагает, что формы могут полностью отличаться от одного элемента к следующий. Лучший способ ограничить это - указать необязательный аргумент output_shapes для tf.data.Dataset.from_generator(), который принимает вложенную структуру фигур, соответствующую структуре полученных элементов (и аргумент output_types).

В этом случае вы передадите кортеж из двух фигур, который можно указать частично. Например, если элементы x являются массивами 900 x 1000, а элементы y являются скалярами:

sequence_dataset = tf.data.Dataset.from_generator(
    example_generator, (tf.int32, tf.int32),
    output_shapes=([900, 1000], []))
...