https://keras.io/zh/layers/core/


keras使用稀疏输入进行训练

2018.06.14 12:55:46字数 902阅读 760

稀疏矩阵

稀疏矩阵是指矩阵中数值为0的元素数目远远多于非0元素的数目,在实际中遇到的大矩阵基本都是稀疏的。如果使用普通的ndarray存储稀疏矩阵,会有很大的内存浪费。在python中我们可以使用scipy中的sparse模块存储这些矩阵,但是在用keras搭建神经网络使用这些矩阵作为神经网络的输入时,则需要做一些处理才能使用sparse格式的数据。


方法一、使用keras函数式API中的参数实现

keras的Sequential顺序模型是不支持稀疏输入的,如果非要用Sequential模型,可以参考方法二。在使用函数式API模型时,Input层初始化时有一个sparse参数,用来指明要创建的占位符是否是稀疏的,如图:

 
Input的参数,可以用sparse来指明是否是稀疏的输入数据

在使用时也很直接,一个参数就可以搞定:

ipt_layer = Input((shape, ), sparse=True)

网络的定义过程和常规方法没有什么区别,后边compile、fit等操作也都没有变化。不过目前这么用有一个问题,就是指定的batch_size不生效,不管设置多大的batch_size,训练的时候都是按照batch_size为1来进行,可能是人家觉得都用稀疏数据了,数据肯定大到可怕,用大一些batch会引入内存问题吧。如果要使用指定的batch_size来训练稀疏数据,或者需要调整batch_size,可以参考方法二。

方法二、使用生成器方法实现

还有一种方法可以实现,是使用生成器的方法,最早看到这个方法是在stackoverflow上,参考链接

这种方法是利用生成器配合keras模型的fit_generator来实现,核心代码如下:

# batch_generator
def batch_generator(x, y, batch_size):
number_of_batches = x.shape[0]//batch_size
counter = 0
shuffle_index = np.arange(x.shape[0])
np.random.shuffle(shuffle_index)
x = x[shuffle_index, :]
y = y[shuffle_index, :]
while 1:
index_batch = shuffle_index[batch_size*counter: batch_size*(counter+1)]
x_batch = x[index_batch, :].todense()
y_batch = y[index_batch, :].todense()
counter += 1
yield(np.array(x_batch), np.array(y_batch))
if counter >= number_of_batches:
np.random.shuffle(shuffle_index)
counter = 0 # fit时要先根据batch_size和样本总量计算一下总共的steps_per_epoch
train_steps = x.shape[0]//batch_size
# 在fit时使用fit_generator
model.fit_generator(generator=batch_generator(x, y, batch_size), steps_per_epoch=train_steps......)

除了生成器函数,这里需要注意的是在fit之前先要计算每个epoch需要训练多少个step。

在用这个方法进行训练的时候,对于validation数据,有几种场景区分:

  • 如果比较大,也可以使用这个生成器,直接将fit_generator的validation_data这个参数设置为生成器并且使用对应的验证数据即可;
  • 如果数据不大,可以选择把所有的validation数据都todense转为常规的ndarray;
  • 另外如果在训练中使用tensorboard,并且histogram_freq参数设置不为0,那么验证数据就不能使用生成器来生成了,必须转为ndarray才可以。

方法总结

时间就是金钱,在多数场景下,推荐使用方法一,节省生命。但如果对于需要调整batch_size或者铁了头要用Sequential模型的,方法二是比较好的选择,鉴于方法二对于tensorboard不是很友好,所以建议在使用方法二的时候不要在验证集上也使用生成器。

对于稀疏的输入,上边的方法应该可以解决大部分问题了,不过有一些输出也是稀疏的情况,虽然训练过程跟着batch_size走,不会有什么影响,但在需要大规模predict的时候,比如要对几千万上亿条数据进行预测,目前还没有很好的办法能够直接输出稀疏格式存储的数据。


Keras:的更多相关文章

  1. keras:InternalError: Failed to create session

    如题,keras出现以上错误,解决办法: 找到占用gpu的进程: nvidia-smi -q 杀死这些进程即可: xxxxx

  2. [机器学习] keras:MNIST手写数字体识别(DeepLearning 的 HelloWord程序)

    深度学习界的Hello Word程序:MNIST手写数字体识别 learn from(仍然是李宏毅老师<机器学习>课程):http://speech.ee.ntu.edu.tw/~tlka ...

  3. 深度学习:Keras入门(一)之基础篇

    1.关于Keras 1)简介 Keras是由纯python编写的基于theano/tensorflow的深度学习框架. Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结 ...

  4. 深度学习框架: Keras官方中文版文档正式发布

    今年 1 月 12 日,Keras 作者 François Chollet‏ 在推特上表示因为中文读者的广泛关注,他已经在 GitHub 上展开了一个 Keras 中文文档项目.而昨日,Françoi ...

  5. 深度学习:Keras入门(一)之基础篇【转】

    本文转载自:http://www.cnblogs.com/lc1217/p/7132364.html 1.关于Keras 1)简介 Keras是由纯python编写的基于theano/tensorfl ...

  6. 深度学习:Keras入门(一)之基础篇(转)

    转自http://www.cnblogs.com/lc1217/p/7132364.html 1.关于Keras 1)简介 Keras是由纯python编写的基于theano/tensorflow的深 ...

  7. 【TensorFlow 3】mnist数据集:与Keras对比

    在TF1.8之后Keras被当作为一个内置API:tf.keras. 并且之前的下载语句会报错. mnist = input_data.read_data_sets('MNIST_data',one_ ...

  8. 安装Keras

    在cmd窗口运行代码: pip install keras -U --pre 安装Keras: 进入Python环境,运行import keras,检验是否成功安装.

  9. 学习笔记TF054:TFLearn、Keras

    元框架(metaframework). TFLearn.模块化深度学习框架,更高级API,快速实验,完全透明兼容. TFLearn实现AlexNet.https://github.com/tflear ...

随机推荐

  1. git 代码管理

  2. 小程序-API请求

    Page({ onLoad:function(){ // 在onLoad中调用发送请求的函数 this.getProList(); } getProList:function(){ var self= ...

  3. 为什么不允许使用 Java 静态构造函数?

    不允许使用 Java 静态构造函数,但是为什么呢?在深入探讨不允许使用静态构造函数的原因之前,让我们看看如果要使 构造函数静态化 会发生什么. Java 静态构造函数 假设我们有一个定义为的类: pu ...

  4. apt-get failed:The following signatures were invalid: BADSIG

    参考如下链接: https://askubuntu.com/questions/131601/gpg-error-release-the-following-signatures-were-inval ...

  5. 【LOJ#573】【LNR#2】单枪匹马(线段树)

    [LOJ#573][LNR#2]单枪匹马(线段树) 题面 LOJ 题解 考虑拿线段树维护这个值,现在的问题就是左右怎么合并,那么就假设最右侧进来的那个分数是\(\frac{x}{y}\)的形式,那么就 ...

  6. python中反转列表的三种方式

    1.内建函数reversed() li =[1, 2, 3, 4, 5, 6] a = list(reversed(li)) print (a) 注意:reversed()函数返回的是一个迭代器,而不 ...

  7. Python爬取猪肉价格网并获取Json数据

    场景 猪肉价格网站: http://zhujia.zhuwang.cc/ 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获 ...

  8. CSS符合选择器

    CSS复合选择器 后代选择器 后代选择器又称为包含选择器,可以选择父元素里面的子元素.其写法就是把外层标签写在前面,内层标签写在后面,中间用空格分隔,当标签发生嵌套时,内层标签就成为外层标签的后代 元 ...

  9. 腾讯云游戏服务平台CMatrix品牌全新升级为GameMatrix

    近日,隶属腾讯互娱公共研发运营体系(下文称CROS)下的云游戏服务平台CMatrix宣布进行品牌升级,启用全新商标Tencent GameMatrix,将原先代表云服务的“C”替换成游戏的英文单词“G ...

  10. HTTP协议中的chunked编码解析

    \r\n\r\n"了. chunked编码很简单,是不是? 不过,在协议还原的实现过程中,如何高效高性能地对chunked进行解码,是一件值得挑战的事哦.毕竟,HTTP的流量占比不小的. 长 ...