1

我正在尝试使用大量不适合内存的数据来训练 gpflow 模型。

我正在考虑使用带有 minibatch 选项的 SVGP,但它似乎需要一个完整数据的 numpy 数组,而且我不想一次加载所有内容。

是否可以使用 gpflow 对不适合内存的数据进行训练?有没有这样做的例子?

谢谢你的帮助。

4

1 回答 1

3

您可以传递tf.data.Dataset迭代器而不是 numpy 数据。这是一个例子:

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 的更多信息,您可以在此处找到。

于 2019-05-28T10:25:57.940 回答