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. Day9 - Python基础9 socket基础、粘包

    本节内容: 1.socket的介绍 2.基于tcp的socket 3.基于tcp的问题分析 4.基于udp的socket 5.基于udp的问题分析 6.基于udp的ntp服务 7.基于tcp的远程执行 ...

  2. React-router使用

    介绍 react-router被分为以下几部分: react-router是浏览器和原生应用中的通用部分. react-router-dom是用于浏览器的. react-router-native是用 ...

  3. 201871010111-刘佳华《面向对象程序设计(java)》第十四周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十四周学习总结 实验十二  Swing图形界面组件(一) 实验时间 2019-11-29 第一部分:基础知识总结 1.设计 ...

  4. 给那些迷茫的人学习JAVA的一些建议?

    前语:我用了3年的时间,一步一步走到了现在,半途也有了解过其他的技能,也想过要转其他的言语,可是最终仍是坚持下来走Java这条路,希望我的经历能够帮忙到后来的人,要是觉得对你有帮忙的话,能够注重一下和 ...

  5. 基于socketserver实现并发的socket编程

    目录 一.基于TCP协议 1.1 server类 1.2 request类 1.3 继承关系 1.4 服务端 1.5 客户端 1.6 客户端1 二.基于UDP协议 2.1 服务端 2.2 客户端 2. ...

  6. vscode源码分析【二】程序的启动逻辑,第一个窗口是如何创建的

    上一篇文章:https://www.cnblogs.com/liulun/ (小广告:我做的开源免费的,个人知识管理及自媒体营销工具“想学吗”:https://github.com/xland/xia ...

  7. 一文学会 TypeScript 的 82% 常用知识点(下)

    一文学会 TypeScript 的 82% 常用知识点(下) 前端专栏 2019-11-23 18:39:08     都已经 9021 年了,TypeScript(以下简称 TS)作为前端工程师不得 ...

  8. 一份完整的PyCharm图解教程

    PyCharm 是一种 Python IDE,可以帮助程序员节约时间,提高生产效率.那么具体如何使用呢?本文从 PyCharm 安装到插件.外部工具.专业版功能等进行了一一介绍,希望能够帮助到大家. ...

  9. P3376 网络最大流模板(Dinic + dfs多路增广优化 + 炸点优化 + 当前弧优化)

    ### P3376 题目链接 ### 这里讲一下三种优化的实现以及正确性. 1.dfs多路增广优化 一般的Dinic算法中是这样的,bfs() 用于标记多条增广路,以至于能一次 bfs() 出多次 d ...

  10. Bootstrap --------- 了解与使用

    Bootstrap是用来做什么的?有几大部分?谁开发的?有什么特点? 一个用于快速开发 Web 应用程序和网站的前端框架. 基于 HTML.CSS.JAVASCRIPT 的. 2011 年八月在 Gi ...