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

Python 在gpu上预加载整个数据集以训练Keras模型,python,tensorflow,keras,Python,Tensorflow,Keras,我有一个具体的例子,网络相对较小,对于收敛和泛化问题,我应该保持小批量(例如256),这导致每个历元处理数百批 不幸的是,在这个场景中,批处理、加载和损失计算成为瓶颈(正如timelinetool告诉我的那样) 在TensorFlow中,您可以编写类似这样的内容来在GPU上加载数据: 与tf.device('/gpu:0'): 列车数据=tf.常数(列车数据) 但是如果我将train_data传递给KerasModel.predict或Model.fit函数,我会得到以下错误: 预测中的ker

我有一个具体的例子,网络相对较小,对于收敛和泛化问题,我应该保持小批量(例如256),这导致每个历元处理数百批

不幸的是,在这个场景中,批处理、加载和损失计算成为瓶颈(正如
timeline
tool告诉我的那样)

在TensorFlow中,您可以编写类似这样的内容来在GPU上加载数据:

与tf.device('/gpu:0'):
列车数据=tf.常数(列车数据)
但是如果我将
train_data
传递给Keras
Model.predict
Model.fit
函数,我会得到以下错误:

预测中的keras/engine/training.pyc(self,x,批量大小,详细) 1515 f=自预测函数 1516返回自循环(f,ins, ->1517批次大小=批次大小,详细=详细) 1518 1519 def序列在批次上(自身、x、y、, keras/engine/training.pyc in\u predict\u循环(self、f、ins、批量大小、详细) 1129如果详细==1: 1130 progbar=progbar(目标=样本) ->1131批次=\u制造\u批次(样本、批次大小) 1132索引数组=np.arange(样本) 1133对于枚举(批次)中的批次索引,(批次开始,批次结束): keras/engine/training.pyc批量生产(尺寸、批量) 368数组索引的元组列表。 369 """ -->370个批次=整数(np.ceil(大小/浮动(批次大小))) 371返回[(i*批次大小,最小值(大小,(i+1)*批次大小)) 372适用于范围内的i(0,数量批次)] AttributeError:“Dimension”对象没有属性“ceil” 这是有道理的,因为Keras只期望类似NumPy的数组和列表

话虽如此,我也尝试了pyCUDA和cupy数组,因为它们说是NumPy-like…但它们会产生以下错误:

预测中的keras/engine/training.pyc(self,x,批量大小,详细) 1515 f=自预测函数 1516返回自循环(f,ins, ->1517批次大小=批次大小,详细=详细) 1518 1519 def序列在批次上(自身、x、y、, keras/engine/training.pyc in\u predict\u循环(self、f、ins、批量大小、详细) 1139 ins\U batch=\U切片\U数组(ins,批次\U ID) 1140 ->1141批次输出=f(输入批次) 1142如果不存在(批次,列表): 1143批次输出=[批次输出] keras/backend/tensorflow_backend.pyc在调用中(self,输入) 2266 updated=session.run(self.outputs+[self.updates\u op], 2267馈送指令=馈送指令, ->2268**self.session_kwargs) 2269返回更新[:len(自输出)] 2270 运行中的tensorflow/python/client/session.pyc(self、fetches、feed\u dict、options、run\u元数据) 893尝试: 894结果=self.\u运行(无、取数、输入、选项、, -->895运行(元数据) 896如果运行\u元数据: 897 proto_data=tf_session.tf_GetBuffer(run_metadata_ptr) 运行中的tensorflow/python/client/session.pyc(self、handle、fetches、feed\u dict、options、run\u元数据) 1091进纸手柄[副进纸]=副进纸值 1092其他: ->1093 np_val=np.asarray(子进纸值,数据类型=子进纸类型) 1094 1095如果(非张量)为 asarray中的numpy/core/numeric.pyc(a、数据类型、顺序) 529 530 """ -->531返回数组(a,数据类型,copy=False,order=order) 532 533 ValueError:对象_数组_方法未生成数组 我试着用谷歌搜索这个问题,但唯一合理的匹配是一些中文博客文章,这基本上意味着修补Keras,这显然是不切实际的

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


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

您不必加载整个数据。您可以使用该类一块一块地摄取数据

Tensorflow可以在您的gpu处理您的数字时加载更多数据

  • 将数据集转换为TFRecord数据集并将其保存到磁盘
  • 使用TFRecordDataset类加载此数据集
  • 将其摄入您的Kerasmodel
  • 您可以查看下面列出的示例

    希望这是有帮助的