Форма изменения выхода при обучении TPU Функциональный API Keras - PullRequest
0 голосов
/ 28 апреля 2020

ValueError: Несоответствие между ожидаемым размером пакета и размером выходного пакета модели. Выходная форма = (16, 6248), ожидаемая выходная форма = форма (1, 6248)

Я определил в последних плотных слоях моей модели (Нет, 6248)

Я не могу понять, что такое число 16 в этом выводе. Весь код без номера 16.

Описание: Я использую TPU V3 в kaggle для обучения. но если я использую графический процессор, то я не получаю никакой ошибки, когда я делаю прогноз "model.predict (...)" .

Я создаю модель с функциональным API Keras

Пожалуйста, дайте мне понять. Поблагодарить! Вот моя модель.

    embedding_layer = Embedding(len(word_index) + 1,
                                EMBEDDING_DIM,
                                weights=[embedding_matrix],
                                input_length= max_sequence_len - 1,
                                trainable=False)

    sequence_1_input = Input(shape=(max_sequence_len - 1,), dtype='int32')
    embedded_sequences_1 = embedding_layer(sequence_1_input)

    activations = Bidirectional(LSTM(num_lstm, dropout=rate_drop_lstm, recurrent_dropout=rate_drop_lstm, return_sequences=True))(embedded_sequences_1)
    activations = LSTM(num_lstm, dropout=rate_drop_lstm, recurrent_dropout=rate_drop_lstm)(activations)

    merged = Dense(num_dense, activation=act)(activations)
    merged = Dropout(rate_drop_dense)(merged)
    merged = BatchNormalization()(merged)

    preds = Dense(vocab_size, activation='softmax')(merged)


    model = Model(inputs=sequence_1_input, outputs=preds)
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])

Вот мои данные:

train = predictors[0:10240]
test = label[0:10240]

dataset = tf.data.Dataset.from_tensor_slices((train, test))
dataset = dataset.shuffle(200).batch(1024).repeat()
dataset = dataset.prefetch(AUTO)

#Here is the shape of dataset:

<PrefetchDataset shapes: ((None, 87), (None, 6248)), types: (tf.int32, tf.float32)>

Подходящая модель:

model.fit(dataset, epochs=100, steps_per_epoch=10240//1024, verbose=1)

Резюме

enter image description here

1 Ответ

1 голос
/ 28 апреля 2020

Просто хочу упомянуть, что я получаю похожую ошибку.

Это заставляет меня поверить, что в тензорном потоке должна быть ошибка (также получая "16" в качестве первой формы вывода)

Я уже дал «batch_size» «1» в функции предсказания просто для того, чтобы сделать shure.

К сожалению, это никак не влияет.

Может быть, он получает партию из 16 из ТПУ?

Это может привести к тому, что self.results будет неожиданным в этом месте: https://github.com/tensorflow/tensorflow/blob/e5bf8de410005de06a7ff5393fafdf832ef1d4ad/tensorflow/python/keras/engine/training_utils.py#L346

Но в настоящее время я не знаю, как это исправить, не исправляя сам тензорный поток.

РЕДАКТИРОВАТЬ:

Это чертовски сложно отладить ... в настоящее время я думаю, что ошибка где-то рядом с этим:

https://github.com/tensorflow/tensorflow/blob/e5bf8de410005de06a7ff5393fafdf832ef1d4ad/tensorflow/python/keras/engine/training_v2_utils.py#L262

Так как он каким-то образом обрабатывает форму вывода, основанную на «num_replicas_in_syn c».

Но не может понять это без отладки.

Некоторый Debuginfo с pdb:

(Pdb) b /opt/conda/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py:262
Breakpoint 7 at /opt/conda/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py:262
(Pdb) c
> /opt/conda/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py(262)_aggregate_predict_results()
-> nested_outs = batch_outs[i * num_replicas:i * num_replicas + num_replicas]
(Pdb) print(len(batch_outs))
8
(Pdb) print(batch_outs[0].shape)
(2, 7, 355, 235, 1)

«2» уже неправильно для меня в начале, не знаю, почему это происходит (позже) изменяется на 16, что приводит к «batch_outs» с несколькими дубликатами)

Редактировать снова (28.04.2020):

Проблема, кажется, возникла раньше:

(Pdb) b /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py:128
Breakpoint 3 at /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py:128
(Pdb) c
> /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py(128)run_one_epoch()
-> batch_outs = execution_function(iterator)
(Pdb) n
> /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py(159)run_one_epoch()
-> if mode != ModeKeys.PREDICT:
(Pdb) print(len(batch_outs))
16
(Pdb) print(batch_outs[14].shape)
(2, 7, 355, 235, 1)
(Pdb) np.array_equal(batch_outs[14],batch_outs[15])
True

Отредактируйте снова (29.04.2020):

В качестве альтернативы, похоже, работает следующее:

  from tensorflow.python.tpu import device_assignment as device_assignment_lib
  tf.keras.backend.set_floatx('float32')
  tpu = tf.distribute.cluster_resolver.TPUClusterResolver()  # TPU detection
  tf.config.experimental_connect_to_cluster(tpu)
  topology = tf.tpu.experimental.initialize_tpu_system(tpu)
  device_assignment = device_assignment_lib.DeviceAssignment(
          topology, core_assignment=device_assignment_lib.
          SINGLE_CORE_ASSIGNMENT)
  strategy = tf.distribute.experimental.TPUStrategy(tpu,device_assignment)

Конечно, это не Лучшее решение, так как вы используете только одно ядро. По крайней мере, это подтверждает мое предположение, что тензор потока не правильно фильтрует результаты со всех ядер.

...