Tensorflow:从大于 2 GB 的 numpy 数组创建小批量
Tensorflow: create minibatch from numpy array > 2 GB
我正在尝试将 numpy 数组的小批量输入到我的模型中,但我受困于批处理。使用 'tf.train.shuffle_batch' 会引发错误,因为 'images' 数组大于 2 GB。我试图绕过它并创建占位符,但是当我尝试提供数组时,它们仍然由 tf.Tensor 对象表示。我主要担心的是我在模型 class 下定义了操作,并且在 运行 会话之前不会调用对象。有谁知道如何处理这个问题?
def main(mode, steps):
config = Configuration(mode, steps)
if config.TRAIN_MODE:
images, labels = read_data(config.simID)
assert images.shape[0] == labels.shape[0]
images_placeholder = tf.placeholder(images.dtype,
images.shape)
labels_placeholder = tf.placeholder(labels.dtype,
labels.shape)
dataset = tf.data.Dataset.from_tensor_slices(
(images_placeholder, labels_placeholder))
# shuffle
dataset = dataset.shuffle(buffer_size=1000)
# batch
dataset = dataset.batch(batch_size=config.batch_size)
iterator = dataset.make_initializable_iterator()
image, label = iterator.get_next()
model = Model(config, image, label)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(iterator.initializer,
feed_dict={images_placeholder: images,
labels_placeholder: labels})
# ...
for step in xrange(steps):
sess.run(model.optimize)
您正在使用 tf.Data
的 initializable iterator 向您的模型提供数据。这意味着您可以根据占位符对数据集进行参数化,然后为迭代器调用初始化操作以准备使用。
如果您使用可初始化迭代器或 tf.Data
中的任何其他迭代器将输入提供给您的模型,则不应使用 sess.run
的 feed_dict
参数来尝试做数据馈送。相反,根据 iterator.get_next()
的输出定义模型并从 sess.run
.
中省略 feed_dict
大致如下:
iterator = dataset.make_initializable_iterator()
image_batch, label_batch = iterator.get_next()
# use get_next outputs to define model
model = Model(config, image_batch, label_batch)
# placeholders fed in while initializing the iterator
sess.run(iterator.initializer,
feed_dict={images_placeholder: images,
labels_placeholder: labels})
for step in xrange(steps):
# iterator will feed image and label in the background
sess.run(model.optimize)
迭代器将在后台向您的模型提供数据,不需要通过 feed_dict
进行额外的提供。
我正在尝试将 numpy 数组的小批量输入到我的模型中,但我受困于批处理。使用 'tf.train.shuffle_batch' 会引发错误,因为 'images' 数组大于 2 GB。我试图绕过它并创建占位符,但是当我尝试提供数组时,它们仍然由 tf.Tensor 对象表示。我主要担心的是我在模型 class 下定义了操作,并且在 运行 会话之前不会调用对象。有谁知道如何处理这个问题?
def main(mode, steps):
config = Configuration(mode, steps)
if config.TRAIN_MODE:
images, labels = read_data(config.simID)
assert images.shape[0] == labels.shape[0]
images_placeholder = tf.placeholder(images.dtype,
images.shape)
labels_placeholder = tf.placeholder(labels.dtype,
labels.shape)
dataset = tf.data.Dataset.from_tensor_slices(
(images_placeholder, labels_placeholder))
# shuffle
dataset = dataset.shuffle(buffer_size=1000)
# batch
dataset = dataset.batch(batch_size=config.batch_size)
iterator = dataset.make_initializable_iterator()
image, label = iterator.get_next()
model = Model(config, image, label)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(iterator.initializer,
feed_dict={images_placeholder: images,
labels_placeholder: labels})
# ...
for step in xrange(steps):
sess.run(model.optimize)
您正在使用 tf.Data
的 initializable iterator 向您的模型提供数据。这意味着您可以根据占位符对数据集进行参数化,然后为迭代器调用初始化操作以准备使用。
如果您使用可初始化迭代器或 tf.Data
中的任何其他迭代器将输入提供给您的模型,则不应使用 sess.run
的 feed_dict
参数来尝试做数据馈送。相反,根据 iterator.get_next()
的输出定义模型并从 sess.run
.
feed_dict
大致如下:
iterator = dataset.make_initializable_iterator()
image_batch, label_batch = iterator.get_next()
# use get_next outputs to define model
model = Model(config, image_batch, label_batch)
# placeholders fed in while initializing the iterator
sess.run(iterator.initializer,
feed_dict={images_placeholder: images,
labels_placeholder: labels})
for step in xrange(steps):
# iterator will feed image and label in the background
sess.run(model.optimize)
迭代器将在后台向您的模型提供数据,不需要通过 feed_dict
进行额外的提供。