gpflow: возможно ли использовать данные, которые не помещаются в памяти?

Я пытаюсь обучить модель gpflow с огромным количеством данных, которые не помещаются в памяти.

Я думал об использовании SVGP с опцией минибата, но, похоже, для этого требуется полный массив полных данных, и я не хочу загружать все сразу.

Можно ли проводить тренировки с данными, которые не помещаются в память, используя gpflow? Есть ли пример, который делает это?

Спасибо за вашу помощь.

1 ответ

Вы можете пройти tf.data.Dataset итераторы вместо пустых данных. Вот пример:

buffer_size = 10000
batch_size = 128

# x_shape is a feature shape, e.g. for CIFAR it will be [32, 32, 3]
xy_shapes = ([], [])
xy_dtypes = (tf.float32, tf.float32)

# Read data from disk
def read_data():
    # Do something, read from disk or anything else...
    yield x, y

# Make dataset, do batching and shuffling
ds = tf.data.Dataset.from_generator(read_data, xy_dtypes, xy_shapes)
ds = ds.prefetch(buffer_size)
ds = ds.repeat()
ds = ds.shuffle()
ds = ds.batch(batch_size)

# Get data iterators
x_iter, y_iter = ds.make_one_shot_iterator().get_next()

Теперь вы можете создать модель с итераторами TensorFlow. Единственное отличие от стандартного подхода в том, что вы должны пройти num_data аргумент для правильного вычисления коэффициента масштабирования.

kernel = ...
likelihood = ...
feature = ...

num_data = ... # size of your dataset
model = gpflow.models.SVGP(x_iter, y_iter, kernel, likelihood, feature, num_data=num_data)

Более подробную информацию о том, как работать с tf.data, вы можете найти здесь.

Другие вопросы по тегам