Как обучить модель Keras на TPU в Google Colab? Нужно ли менять конфигурацию модели? (TinyYolo-v3) - PullRequest
0 голосов
/ 14 апреля 2020

Я не очень знаком с моделированием обучения в Google Google. В настоящее время я пытаюсь обучить модели Keras (tinyYolov3) с использованием TPU, насколько я понимаю, мне нужно получить одно из доступных устройств TPU с использованием

    resolver = tf.contrib.cluster_resolver.TPUClusterResolver(tpu_address)
    tf.contrib.distribute.initialize_tpu_system(resolver)
    strategy = tf.contrib.distribute.TPUStrategy(resolver)

и создайте и скомпилируйте мою модель с помощью Strategy.scope ():

    model = create_tiny_model(input_shape, anchors, num_classes,
    freeze_body, )

    model.load_weights(weights_path, by_name=True, skip_mismatch=True)
    model.compile(optimizer=Adam(lr=1e-3), loss={
    # use custom yolo_loss Lambda layer.
    'yolo_loss': lambda y_true, y_pred: y_pred})
    model.summary()
    print('Load weights {}.'.format(weights_path))

При возникновении проблемы кажется, что приведен следующий код

    def data_generator(annotation_lines, batch_size, input_shape, anchors, num_classes):
    '''data generator for fit_generator'''
    n = len(annotation_lines)
    i = 0
    while True:
        image_data = []
        box_data = []
        for b in range(batch_size):
            if i==0:
                np.random.shuffle(annotation_lines)
            image, box = get_random_data(annotation_lines[i], input_shape, random=True)
            image_data.append(image)
            box_data.append(box)
            i = (i+1) % n
        image_data = np.array(image_data)
        box_data = np.array(box_data)
        y_true = preprocess_true_boxes(box_data, input_shape, anchors, num_classes)
        yield [image_data, *y_true], np.zeros(batch_size)

    def data_generator_wrapper(annotation_lines, batch_size, input_shape, anchors, num_classes):
     n = len(annotation_lines)
     if n==0 or batch_size<=0: return None
     return data_generator(annotation_lines, batch_size, input_shape, anchors, num_classes)

Сообщение об ошибке

         60 
         61 def _pop_per_thread_mode():
    ---> 62   ops.get_default_graph()._distribution_strategy_stack.pop(-1)  # pylint:     disable=protected-access
         63 
         64 

    IndexError: pop from empty list

Я также попробовал TPU_WORKER = 'grp c: //' + os.environ ['COLAB_TPU_ADDR'] tf.logging.set_verbosity (tf.logging.INFO)

    yolo_model = tf.contrib.tpu.keras_to_tpu_model(
        yolo_model,
        strategy=tf.contrib.tpu.TPUDistributionStrategy(
                    tf.contrib.cluster_resolver.TPUClusterResolver(TPU_WORKER)))

и получите следующее сообщение: ValueError: Слой имеет переменную форму в не пакетном измерении. Модели ТПУ должны иметь постоянную форму для всех операций.

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

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