Я не очень знаком с моделированием обучения в 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)