我正在尝试使用无法容纳在内存中的大量数据来训练gpflow模型。
我当时正在考虑将SVGP与minibatch选项一起使用,但似乎需要一个完整数据的numpy数组,并且我不想一次加载所有内容。
是否可以使用gpflow对内存中不适合的数据进行训练? 有没有这样做的例子?
感谢您的帮助。
答案 0 :(得分:0)
您可以传递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的更多信息,您可以找到here。