keras系列︱利用fit_generator最小化显存占用比率/数据Batch化
来源:互联网 发布:Mac放视频全屏就黑屏 编辑:程序博客网 时间:2024/06/05 11:05
本文主要参考两篇文献:
1、《深度学习theano/tensorflow多显卡多人使用问题集》
2、基于双向LSTM和迁移学习的seq2seq核心实体识别
运行机器学习算法时,很多人一开始都会有意无意将数据集默认直接装进显卡显存中,如果处理大型数据集(例如图片尺寸很大)或是网络很深且隐藏层很宽,也可能造成显存不足。
这个情况随着工作的深入会经常碰到,解决方法其实很多人知道,就是分块装入。以keras为例,默认情况下用fit方法载数据,就是全部载入。换用fit_generator方法就会以自己手写的方法用yield逐块装入。这里稍微深入讲一下fit_generator方法。
.
— fit_generator源码
def fit_generator(self, generator, samples_per_epoch, nb_epoch, verbose=1, callbacks=[], validation_data=None, nb_val_samples=None, class_weight=None, max_q_size=10, **kwargs):
.
— generator 该怎么写?
其中generator参数传入的是一个方法,validation_data参数既可以传入一个方法也可以直接传入验证数据集,通常我们都可以传入方法。这个方法需要我们自己手写,伪代码如下:
def generate_batch_data_random(x, y, batch_size): """逐步提取batch数据到显存,降低对显存的占用""" ylen = len(y) loopcount = ylen // batch_size while (True): i = randint(0,loopcount) yield x[i * batch_size:(i + 1) * batch_size], y[i * batch_size:(i + 1) * batch_size]
.
为什么推荐在自己写的方法中用随机呢?
- 因为fit方法默认shuffle参数也是True,fit_generator需要我们自己随机打乱数据。
- 另外,在方法中需要用while写成死循环,因为每个epoch不会重新调用方法,这个是新手通常会碰到的问题。
当然,如果原始数据已经随机打乱过,那么可以不在这里做随机处理。否则还是建议加上随机取数逻辑(如果数据集比较大则可以保证基本乱序输出)。深度学习中随机打乱数据是非常重要的,具体参见《深度学习Deep Learning》一书的8.1.3节:《Batch and Minibatch Algorithm》。(2017年5月25日补充说明)
.
调用示例:
model.fit_generator(self.generate_batch_data_random(x_train, y_train, batch_size), samples_per_epoch=len(y_train)//batch_size*batch_size, nb_epoch=epoch, validation_data=self.generate_valid_data(x_valid, y_valid,batch_size), nb_val_samples=(len(y_valid)//batch_size*batch_size), verbose=verbose, callbacks=[early_stopping])
这样就可以将对显存的占用压低了,配合第一部分的方法可以方便同时执行多程序。
.
来看看一个《基于双向LSTM和迁移学习的seq2seq核心实体识别》实战案例:
'''gen_matrix实现从分词后的list来输出训练样本gen_target实现将输出序列转换为one hot形式的目标超过maxlen则截断,不足补0'''gen_matrix = lambda z: np.vstack((word2vec[z[:maxlen]], np.zeros((maxlen-len(z[:maxlen]), word_size))))gen_target = lambda z: np_utils.to_categorical(np.array(z[:maxlen] + [0]*(maxlen-len(z[:maxlen]))), 5)#从节省内存的角度,通过生成器的方式来训练def data_generator(data, targets, batch_size): idx = np.arange(len(data)) np.random.shuffle(idx) batches = [idx[range(batch_size*i, min(len(data), batch_size*(i+1)))] for i in range(len(data)/batch_size+1)] while True: for i in batches: xx, yy = np.array(map(gen_matrix, data[i])), np.array(map(gen_target, targets[i])) yield (xx, yy)batch_size = 1024history = model.fit_generator(data_generator(d['words'], d['label'], batch_size), samples_per_epoch=len(d), nb_epoch=200)model.save_weights('words_seq2seq_final_1.model')
延伸一:edwardlib/observations 规范数据导入、数据Batch化
def generator(array, batch_size): """Generate batch with respect to array's first axis.""" start = 0 # pointer to where we are in iteration while True: stop = start + batch_size diff = stop - array.shape[0] if diff <= 0: batch = array[start:stop] start += batch_size else: batch = np.concatenate((array[start:], array[:diff])) start = diff yield batch
To use it, simply write
from observations import cifar10(x_train, y_train), (x_test, y_test) = cifar10("~/data")x_train_data = generator(x_train, 256)
阅读全文
1 0
- keras系列︱利用fit_generator最小化显存占用比率/数据Batch化
- 【Keras】训练时显存out of memory的解决办法——fit_generator函数
- keras系列︱keras是如何指定显卡且限制显存用量
- 利用D3D抓取显存数据
- oracle 利用batch批处理数据
- Keras限制GPU显存使用
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
- keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测、完美案例(五)
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
- keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测、完美案例(五)
- 操作显存数据(1601)
- 显存占用地址空间的问题
- 用Rivatuner实测显存占用量
- 显存占用地址空间的问题
- Linux 无进程显存占用问题
- 利用keras进行分类
- 如何获取显卡的GPU占用率和显存占用情况
- 如何获取显卡的GPU占用率和显存占用情况
- Unity 3D: c#中字符串截取使用的方法
- android ANR
- mysql数据库操作
- ORCLE常用语句
- JAVA体系
- keras系列︱利用fit_generator最小化显存占用比率/数据Batch化
- opencv学习笔记--Canny边缘检测
- 浅谈hibernate的sessionFactory和session
- Java数据结构(栈)
- ajax+jQuery实现一个页面同时加载多个模块!
- Dijkstra 迪杰斯特拉算法的理解
- 使用BeanUtils工具类操作JavaBean
- JS传入日期(XXXX-XX-XX格式)与当前日期比较
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛:I. 丢史蒂芬妮