gpt4 book ai didi

python - 在GPU上预加载整个数据集以训练Keras模型

转载 作者:行者123 更新时间:2023-12-01 07:41:32 25 4
gpt4 key购买 nike

我有一个特殊的情况,即网络相对较小,出于收敛和泛化的考虑,我应保持较小的批次大小(例如256),这会导致每个时期处理数百个批次。
不幸的是,在这种情况下,批次,装载和损失计算成为瓶颈(就像timeline工具告诉我的那样)。
在TensorFlow中,您可以编写如下代码以将数据加载到GPU:

with tf.device('/gpu:0'):
train_data = tf.constant(train_data_numpy)
但是,如果我将 train_data传递给Keras Model.predictModel.fit函数,则会出现以下错误:
keras/engine/training.pyc in predict(self, x, batch_size, verbose)
1515 f = self.predict_function
1516 return self._predict_loop(f, ins,
-> 1517 batch_size=batch_size, verbose=verbose)
1518
1519 def train_on_batch(self, x, y,

keras/engine/training.pyc in _predict_loop(self, f, ins, batch_size, verbose)
1129 if verbose == 1:
1130 progbar = Progbar(target=samples)
-> 1131 batches = _make_batches(samples, batch_size)
1132 index_array = np.arange(samples)
1133 for batch_index, (batch_start, batch_end) in enumerate(batches):

keras/engine/training.pyc in _make_batches(size, batch_size)
368 A list of tuples of array indices.
369 """
--> 370 num_batches = int(np.ceil(size / float(batch_size)))
371 return [(i * batch_size, min(size, (i + 1) * batch_size))
372 for i in range(0, num_batches)]

AttributeError: 'Dimension' object has no attribute 'ceil'
这是有道理的,因为Keras期望只提供类似NumPy的数组和此类列表。
话虽如此,我也尝试了pyCUDA和cupy数组,因为它们说是类似NumPy的...但是它们会产生以下错误:
keras/engine/training.pyc in predict(self, x, batch_size, verbose)
1515 f = self.predict_function
1516 return self._predict_loop(f, ins,
-> 1517 batch_size=batch_size, verbose=verbose)
1518
1519 def train_on_batch(self, x, y,

keras/engine/training.pyc in _predict_loop(self, f, ins, batch_size, verbose)
1139 ins_batch = _slice_arrays(ins, batch_ids)
1140
-> 1141 batch_outs = f(ins_batch)
1142 if not isinstance(batch_outs, list):
1143 batch_outs = [batch_outs]

keras/backend/tensorflow_backend.pyc in __call__(self, inputs)
2266 updated = session.run(self.outputs + [self.updates_op],
2267 feed_dict=feed_dict,
-> 2268 **self.session_kwargs)
2269 return updated[:len(self.outputs)]
2270

tensorflow/python/client/session.pyc in run(self, fetches, feed_dict, options, run_metadata)
893 try:
894 result = self._run(None, fetches, feed_dict, options_ptr,
--> 895 run_metadata_ptr)
896 if run_metadata:
897 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

tensorflow/python/client/session.pyc in _run(self, handle, fetches, feed_dict, options, run_metadata)
1091 feed_handles[subfeed_t] = subfeed_val
1092 else:
-> 1093 np_val = np.asarray(subfeed_val, dtype=subfeed_dtype)
1094
1095 if (not is_tensor_handle_feed and

numpy/core/numeric.pyc in asarray(a, dtype, order)
529
530 """
--> 531 return array(a, dtype, copy=False, order=order)
532
533

ValueError: object __array__ method not producing an array
我尝试使用谷歌搜索这个问题,但是唯一合理的匹配是一些中文博客文章,该文章基本上建议修补Keras,这显然是不切实际的。
我想知道在Keras上将整个数据集预加载到GPU上的正确方法是什么。
有用的信息:我在TF 1.3上使用Keras 2.0.6,由于关键的API更改,无法升级到2.0.8/1.4堆栈,但是如果它解决了这个问题,肯定会加速。

最佳答案

您不必加载整个数据。您可以使用DataSet类逐段摄取数据。
当您的GPU处理数字时,Tensorflow可以帮助加载更多数据。您可以按照以下步骤操作。

  • 将您的数据集转换为TFRecord数据集并将其保存到磁盘。
  • 使用TFRecordDataset类
  • 加载此数据集
  • 将其摄取到您的Kerasmodel中。

  • 您可以检查列出的示例 here
    希望这会有所帮助。

    关于python - 在GPU上预加载整个数据集以训练Keras模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46688822/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com