Изменение формы вывода во время обучения TPU Функциональный API Keras

ValueError: Несоответствие между ожидаемым размером пакета и размером пакета вывода модели. Форма вывода = (16, 6248), ожидаемая форма вывода = shape (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)

Резюме

введите здесь описание изображения


person SangLe    schedule 28.04.2020    source источник
comment
16 - размер вашей партии. Или вы вводите данные неправильно, или модель где-то выполняет одно полное сокращение, а не просто сокращение по одной из осей. У вас есть еще код, который нужно показать?   -  person fabrizioM    schedule 28.04.2020
comment
Благодарю за ответ. я только что добавил свой код. Покажите, пожалуйста, мою ошибку. Благодарить   -  person SangLe    schedule 28.04.2020


Ответы (1)


Сразу хочу отметить, что получаю аналогичную ошибку.

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

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

К сожалению, это не имеет никакого значения.

Может получает партию 16 от тпу?

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

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

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

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

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

Немного 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)

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

person CrazyT    schedule 28.04.2020
comment
Благодарю за ответ. Но когда я конвертирую X в наборы данных, подобные этому X = tf.data.Dataset.from_tensor_slices(X), тогда я делаю прогноз, например: model.predict(X), тогда я получаю результат прогнозирования - это массив из 16 элементов. Не понимаю, как получилось! - person SangLe; 29.04.2020
comment
Ну, я сам до сих пор не могу понять, почему его 16, а не 8. Я предполагаю, что он запрашивает прогноз у всех ядер. И все отвечают с тем же результатом, но где-то в бэкэнде тензорных потоков результат увеличивается, потому что он считает, что результат каждого ядра является новым результатом. (alteast это мое предположение) - person CrazyT; 29.04.2020
comment
для некоторой справочной информации: я использую kaggle. Но согласно информации на kaggle.com/docs/tpu у них должно быть 8 ядер. (так что результат 16 для первой формы результата все еще сбивает с толку) - person CrazyT; 29.04.2020
comment
В основном проблема в том, что размер пакета равен 1. Обычно они проверяют размер пакета InputLayer (github.com/tensorflow/tensorflow/blob/), но поскольку batch_size по умолчанию равен None, и они не проверяют реальную форму ввода по какой-то причине у вас возникли проблемы, поэтому я думаю, вы вынуждены создать вторую стратегию (которая использует SINGLE_CORE_ASSINGMENT) и модель только для прогнозирования. Хорошо, что вы вводите ее с 1-й степенью, кратной количеству реплик. . - person CrazyT; 01.05.2020
comment
Спасибо за ответ, думаю, у меня есть идея. Я попробую это. - person SangLe; 01.05.2020