Маска R-CNN для ТПУ на Google Colab - PullRequest
0 голосов
/ 17 октября 2018

Мы пытаемся построить модель глубокого обучения сегментации изображений с использованием Google Colab TPU.Наша модель - маска R-CNN.

TPU_WORKER = 'grpc://' + os.environ['COLAB_TPU_ADDR']

import tensorflow as tf
tpu_model = tf.contrib.tpu.keras_to_tpu_model(
model.keras_model,
strategy=tf.contrib.tpu.TPUDistributionStrategy(
tf.contrib.cluster_resolver.TPUClusterResolver(TPU_WORKER)))

Однако я сталкиваюсь с проблемами при преобразовании нашей модели Mask R-CNN в модель TPU, как показано ниже.

ValueError: 
Layer <keras.engine.topology.InputLayer object at 0x7f58574f1940> has a 
variable shape in a non-batch dimension.  TPU models must
have constant shapes for all operations.

You may have to specify `input_length` for RNN/TimeDistributed layers.

Layer: <keras.engine.topology.InputLayer object at 0x7f58574f1940>
Input shape: (None, None, None, 3)
Output shape: (None, None, None, 3)

Благодарим за любую помощь.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Google недавно выпустил учебник по запуску Mask R-CNN на своих TPU .Для этого они используют экспериментальную модель для Mask RCNN в github-репозитории Google TPU (в разделе models / экспериментальный / mask_rcnn ).Просматривая код , кажется, что они определяют модель с фиксированным размером ввода для преодоления проблемы, с которой вы сталкиваетесь.

Более подробное объяснение см. Ниже:

Как@ aman2930 указывает, что форма вашего входного тензора не является статичной.Это не будет работать, потому что Tensorflow компилирует модели с XLA для использования TPU , а XLA должен иметь все тензорные формы, определенные во время компиляции.В приведенной выше ссылке веб-сайт специально указывает на это:

Статические фигуры

Во время регулярного использования TensorFlow пытается определить формы каждого tf.Tensor во время построения графика.Во время выполнения любые неизвестные размеры формы определяются динамически, см. Подробности в разделе Тензорные формы.

Для запуска на облачных TPU Модели TensorFlow компилируются с использованием XLA.XLA использует аналогичную систему для определения форм во время компиляции.XLA требует, чтобы все тензорные измерения были статически определены во время компиляции.Все фигуры должны быть постоянными и не зависеть от внешних данных или операций с состоянием, таких как переменные или генератор случайных чисел.

На той стороне, далее по документу, упоминается, что функция вводаработать на процессоре, поэтому не ограничен статическими размерами XLA.Они указывают на размер пакета, а не на размер изображения:

Статические формы и размер пакета

Входной конвейер, сгенерированный вашим input_fn, запускается на CPU.Таким образом, он в основном не содержит строгих статических требований к форме, предъявляемых средой XLA / TPU.Единственное требование состоит в том, чтобы пакеты данных, передаваемые из входного конвейера в TPU, имели статическую форму, как это определено стандартным алгоритмом вывода формы TensorFlow.Промежуточные тензоры свободны, чтобы иметь динамические формы.Если вывод формы не удался, но форма известна, можно наложить правильную форму с помощью tf.set_shape ().

Таким образом, вы можете исправить это, переформулировав свою модель, чтобы иметь фиксированный размер пакета илииспользовать tf.contrib.data.batch_and_drop_remainder , как они предлагают.

0 голосов
/ 21 октября 2018

Не могли бы вы поделиться функцией ввода данных.Трудно сказать точную проблему, но кажется, что форма тензора, представляющего входную выборку, не является статичной.

...