Keras花式工具箱专栏开篇

221 阅读4分钟
原文链接: zhuanlan.zhihu.com

之所以把专栏图设计得像食品品牌的样子,主要是希望大家在用Keras的时候就像吃东西那样愉快!(好吧其实我是设计盲,有设计师看不过眼的欢迎私信哈)。以防不知道的童鞋在这里说明一下,Keras是一款非常流行的开源深度学习框架,目前在github上的深度学习框架热度排名第二!总的来说,keras并不是一款独立的框架,它是一个高层的API,后端支持TensorFlow、Theano、CNTK(MXNet还没官方支持)等,由于其高度封装的设计,使得工程师能够非常快速地实现模型,而不需要过多地关心一些细枝末节的问题,比如说直接把图片扔到一个文件夹里,调用两个函数就能自动输入数据和标签,无需TensorFlow那样又编码解码的,能让工程师把更多的时间花在模型本身上。对于新手来说也是非常友好的入门框架呀,墙裂推荐使用keras!

虽说Keras有着搭建简单、高度封装的优点,但缺点也是显而易见的,首先速度方面肯定比不上其它更底层的框架,比如TensorFlow、MXNet等。另外因为高度封装,习惯使用了它的函数之后,有时候想去修改一些功能来实现自己的想法的时候往往不知道从何入手。我来说说几个新手痛点:

  1. keras的数据输入方式是怎样的?如何不使用自带的generator.flow或者generator.flow_from_directory实现数据打包输入到模型中去?
  2. 使用Applications中的自带网络模型,怎么样修改里面的网络结构?
  3. Sequential和Model有什么属性上的不同?
  4. 怎么写一个自定义的DataAugmentation函数?
  5. 怎样使用callback或tensorboard来监控你的模型训练?

以上这些问题在我学习keras的过程中经常出现,而且也发现有不少人都在问相同的问题,那证明解决这些问题都很有价值,起码能帮你更加深入地了解一个框架。当你不断出现这些问题的时候,你会发现自带的工具逐渐满足不了你的需求了,你就会自觉地去看框架的源码,试图从中修改一些函数或者修改参数来实现你的功能,或许还能发现一些bug。比如笔者之前想自己实现Data generator,在研究源码的时候,发现如果像生成大批量的图片并保存到本地,比如说1万张,就会出现图片丢失的情况,后来看了许久发现源码在保存图片的时候,图片文件名的一个字段使用了hash,这个hash是从[0, 10000]中随机选择一个数字的,那么如果生成的图片量大的时候,出现多张图片使用同一个hash值的可能性就高,于是发生文件名冲突,旧图被覆盖造成图片丢失。因此在GitHub上提了这个issue,管理员提了pull request,作者就merge了。虽然这不是什么惊天大BUG(当然希望它没有),但在这过程当中自己学会了更多,所以还是建议大家有空就读读源码,很有收获的。

因此,Keras花式工具箱专栏除了会介绍一些常见但又很重要的基本操作之外,还会分享一些使用keras后端底层API来实现自己功能的技巧,比如实现一个多进程队列数据生成器,让你的GPU不用老是在等待CPU打包好数据,提供训练速度;实现一个简易的训练数据记录器,等等。

最后分享一下笔者的感受,编程就像是搭积木一样,想要什么功能就自己一步步搭出来,搭完之后看着自己的成果会有很大的成就感。所以说虽然码农辛苦,但是大概享受的是这个感觉吧。

如果您喜欢这个专栏,请关注、分享给您的好友,作者会有更大的动力去分享!