Обучение модели seq2seq в Google Colab TPU с большим набором данных - Керас

Я пытаюсь обучить последовательность для модели последовательности для машинного перевода с помощью Keras в Google Colab TPU. У меня есть набор данных, который я могу загрузить в память, но мне нужно предварительно обработать его, чтобы передать его модели. В частности, мне нужно преобразовать целевые слова в одни горячие векторы, и со многими примерами я не могу загрузить все преобразование в память, поэтому мне нужно создавать пакеты данных.

Я использую эту функцию как пакетный генератор:

def generate_batch_bert(X_ids, X_masks, y, batch_size = 1024):
    ''' Generate a batch of data '''
    while True:
        for j in range(0, len(X_ids), batch_size):
          # batch of encoder and decoder data
          encoder_input_data_ids = X_ids[j:j+batch_size]
          encoder_input_data_masks = X_masks[j:j+batch_size]
          y_decoder = y[j:j+batch_size]
          

          # decoder target and input for teacher forcing
          decoder_input_data = y_decoder[:,:-1]
          decoder_target_seq = y_decoder[:,1:]
          
          # batch of decoder target data
          decoder_target_data = to_categorical(decoder_target_seq, vocab_size_fr)
          # keep only with the right amount of instances for training on TPU
          if encoder_input_data_ids.shape[0] == batch_size:
            yield([encoder_input_data_ids, encoder_input_data_masks, decoder_input_data], decoder_target_data)

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

model.fit(x=generate_batch_bert(X_train_ids, X_train_masks, y_train, batch_size = batch_size),
                    steps_per_epoch = train_samples//batch_size,
                    epochs=epochs,
                    callbacks = callbacks,
                    validation_data = generate_batch_bert(X_val_ids, X_val_masks, y_val, batch_size = batch_size),
                    validation_steps = val_samples//batch_size)

Я получаю следующую ошибку:

/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor_util.py:445 make_tensor_proto
    raise ValueError("None values not supported.")

ValueError: None values not supported.

Не уверен, что случилось и как я могу решить эту проблему.

ИЗМЕНИТЬ

Я попытался загрузить в память меньшее количество данных, чтобы преобразование в одну горячую кодировку целевых слов не приводило к сбою ядра и оно действительно работало. Итак, очевидно, что что-то не так с тем, как я генерирую партии.


person Marco Ripamonti    schedule 13.02.2021    source источник
comment
было много проблем с тем, чтобы заставить генераторы работать с TPU github.com/tensorflow/tensorflow/issues/ 32712. Мне не удалось заставить работать генераторы. И всегда используйте файлы   -  person Andrey    schedule 14.02.2021
comment
Что ты имеешь в виду под файлами?   -  person Marco Ripamonti    schedule 14.02.2021
comment
Я загружаю информацию из файлов   -  person Andrey    schedule 14.02.2021
comment
Работает ли на CPU / GPU?   -  person Andrey    schedule 14.02.2021
comment
Он работает на CPU / GPU   -  person Marco Ripamonti    schedule 14.02.2021
comment
чтобы уточнить на основе вашего редактирования: этот код работает, если используется небольшой объем данных, но если вы используете больший объем данных, он вылетает с ошибкой ValueError: None values not supported.? Если это так, возможно ли, что где-то в наборе данных есть неправильный элемент данных, и вы не встретите его при использовании подмножества набора данных   -  person Zachary Cain    schedule 23.02.2021


Ответы (1)


Трудно сказать, что не так, поскольку вы не предоставляете определение модели или какие-либо образцы данных. Однако я вполне уверен, что вы столкнулись с той же ошибкой TensorFlow, которая Меня недавно укусили.

Обходной путь - использовать tensorflow.data API, который намного лучше работает с TPU. Нравится:

from tensorflow.data import Dataset
import tensorflow as tf

def map_fn(X_id, X_mask, y):
    decoder_target_data = tf.one_hot(y[1:], vocab_size_fr)
    return (X_id, X_mask, y[:-1]), decoder_target_data
...
X_ids = Dataset.from_tensor_slices(X_ids)
X_masks = Dataset.from_tensor_slices(X_masks)
y = Dataset.from_tensor_slices(y)
ds = Dataset.zip((X_ids, X_masks, y)).map(map_fn).batch(1024)
model.fit(x = ds, ...)
person Björn Lindqvist    schedule 14.03.2021