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

2024-01-10

我有一个特定的情况,其中网络相对较小,为了收敛和泛化问题,我应该保持较小的批量大小(例如 256),这导致每个时期要处理数百个批量。

不幸的是,在这种情况下,批量、加载和损失计算成为瓶颈(如timeline工具告诉我)。

在 TensorFlow 中,您可以编写如下代码来将数据加载到 GPU 上:

with tf.device('/gpu:0'):
    train_data = tf.constant(train_data_numpy)

但如果我通过了train_data到喀拉斯Model.predict or Model.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 and 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,这显然是不切实际的。

我想知道在 GPU 上为 Keras 预加载整个数据集的正确方法是什么。

有用的信息:我正在使用 Keras 2.0.6 和 TF 1.3,由于关键的 API 更改,升级到 2.0.8/1.4 堆栈尚不可用,但如果它解决了这个问题,肯定会加快速度。


您不必加载整个数据。您可以使用以下方法逐段摄取数据DataSet https://www.tensorflow.org/api_docs/python/tf/data/Dataset class.

当您的 GPU 处理数字时,Tensorflow 可以负责加载更多数据。您可以按照以下步骤操作。

  1. 将数据集转换为 TFRecord 数据集并将其保存到磁盘。
  2. 使用 TFRecordDataset 类加载此数据集
  3. 将其引入您的 Kerasmodel 中。

您可以检查列出的示例here https://medium.com/@moritzkrger/speeding-up-keras-with-tfrecord-datasets-5464f9836c36.

希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 GPU 上预加载整个数据集以训练 Keras 模型 的相关文章

随机推荐