Keras:
https://keras.io/zh/layers/core/
keras使用稀疏输入进行训练
稀疏矩阵
稀疏矩阵是指矩阵中数值为0的元素数目远远多于非0元素的数目,在实际中遇到的大矩阵基本都是稀疏的。如果使用普通的ndarray存储稀疏矩阵,会有很大的内存浪费。在python中我们可以使用scipy中的sparse模块存储这些矩阵,但是在用keras搭建神经网络使用这些矩阵作为神经网络的输入时,则需要做一些处理才能使用sparse格式的数据。
方法一、使用keras函数式API中的参数实现
keras的Sequential顺序模型是不支持稀疏输入的,如果非要用Sequential模型,可以参考方法二。在使用函数式API模型时,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:的更多相关文章
- keras:InternalError: Failed to create session
如题,keras出现以上错误,解决办法: 找到占用gpu的进程: nvidia-smi -q 杀死这些进程即可: xxxxx
- [机器学习] keras:MNIST手写数字体识别(DeepLearning 的 HelloWord程序)
深度学习界的Hello Word程序:MNIST手写数字体识别 learn from(仍然是李宏毅老师<机器学习>课程):http://speech.ee.ntu.edu.tw/~tlka ...
- 深度学习:Keras入门(一)之基础篇
1.关于Keras 1)简介 Keras是由纯python编写的基于theano/tensorflow的深度学习框架. Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结 ...
- 深度学习框架: Keras官方中文版文档正式发布
今年 1 月 12 日,Keras 作者 François Chollet 在推特上表示因为中文读者的广泛关注,他已经在 GitHub 上展开了一个 Keras 中文文档项目.而昨日,Françoi ...
- 深度学习:Keras入门(一)之基础篇【转】
本文转载自:http://www.cnblogs.com/lc1217/p/7132364.html 1.关于Keras 1)简介 Keras是由纯python编写的基于theano/tensorfl ...
- 深度学习:Keras入门(一)之基础篇(转)
转自http://www.cnblogs.com/lc1217/p/7132364.html 1.关于Keras 1)简介 Keras是由纯python编写的基于theano/tensorflow的深 ...
- 【TensorFlow 3】mnist数据集:与Keras对比
在TF1.8之后Keras被当作为一个内置API:tf.keras. 并且之前的下载语句会报错. mnist = input_data.read_data_sets('MNIST_data',one_ ...
- 安装Keras
在cmd窗口运行代码: pip install keras -U --pre 安装Keras: 进入Python环境,运行import keras,检验是否成功安装.
- 学习笔记TF054:TFLearn、Keras
元框架(metaframework). TFLearn.模块化深度学习框架,更高级API,快速实验,完全透明兼容. TFLearn实现AlexNet.https://github.com/tflear ...
随机推荐
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- axios使用get方法给后端传值,登录功能的实现
前端使用vue实现页面,使用axios进行前后端交互 后端使用node.js提供接口 数据库使用navicat for mysql 前端代码:(组件中使用axios前后端交互) import axio ...
- ZOJ 3778 Talented Chief
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3778 题目 某人做菜很厉害,一分钟能同时完成最多m个菜的一道工序,输入菜的 ...
- NOIP 2012 文化之旅
洛谷 P1078 文化之旅 洛谷传送门 JDOJ 1788: [NOIP2012]文化之旅 T4 JDOJ传送门 Description Input Output Sample Input Input ...
- WPF 精修篇 自定义控件
原文:WPF 精修篇 自定义控件 自定义控件 因为没有办法对界面可视化编辑 所以用来很少 现在实现的是 自定义控件的 自定义属性 和自定义方法 用VS 创建自定义控件后 会自动创建 Themes 文件 ...
- spring+eureka+zuul
最近在看一个关于spring+eureka+zuul的教学视频,终于明白了eureka是用于提供服务注册和发现的service,通过eureka各个service可以知道其他service,这样就隔离 ...
- JVM-Jinfo命令
jinfo JVM Configuration info这个命令作用是实时查看和调整虚拟机运行参数. 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinf ...
- HTML连载48-清除浮动的其中两种方式
一.清除浮动的方式一 给前面一个父元素设置高度,注意:企业开发中能不写高度就不写高度 <!DOCTYPE html> <html lang="en"> & ...
- 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)
本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...
- Linux 部署redis集群
下载Redis 下载网址 http://www.redis.cn/download.html Redis需要gcc环境(如果已经有该环境跳过此步骤) yum install gcc-c++ 安装Red ...