Python 在gpu上预加载整个数据集以训练Keras模型
我有一个具体的例子,网络相对较小,对于收敛和泛化问题,我应该保持小批量(例如256),这导致每个历元处理数百批 不幸的是,在这个场景中,批处理、加载和损失计算成为瓶颈(正如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
timeline
tool告诉我的那样)
在TensorFlow中,您可以编写类似这样的内容来在GPU上加载数据:
与tf.device('/gpu:0'):
列车数据=tf.常数(列车数据)
但是如果我将train_data
传递给KerasModel.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处理您的数字时加载更多数据