【啄米日常】2:一个不负责任的Keras介绍(上)

如果很长时间不更专栏的话,会不会给大家一种本菜鸡平常不怎么学习的错(zhen)觉(xiang)?

还是稍微更一更吧,听说知乎最近引进了打赏功能……是吧

准备分上下两篇,也可能是上中下三篇,来做一个(不)负责任的Keras介绍~上篇主要从宏观的角度来讲,属于面向新手的。中/下篇细节一点,偏重原理/特色。

另外,最近准备做一个Keras使用过程中常见坑的踩法,如果大家在Keras使用过程中遇到过什么坑,不妨私信告我哦。好的,开始了

Keras:宏观特性

Keras是最近蒸蒸日上的深度学习框架, 非常的蒸蒸日上,5月的时候有这么个图:

《【啄米日常】2:一个不负责任的Keras介绍(上)》
《【啄米日常】2:一个不负责任的Keras介绍(上)》 Caffe是老牌选手,Tensorflow有个神爹,不跟这俩比Keras的表现还是十分亮眼的,我想现在如果有排名也会一样出色(注意mxnet是万年老5虽然我一直觉得mxnet其实非常出色……)

那么,Keras有啥特点呢,我想下面这些可能是属于Keras的关键词:

  • 符号主义
  • Python
  • 快速原型
  • 轻量级,高度模块化
  • 易扩展

Keras事实上是一个基于Theano和Tensorflow上的一个包装,所谓站在巨人的肩膀上也不外如是了。 因为Theano和Tensorflow都是符号主义的东西(下面讲再说这是啥),因此Keras自然也是符号主义的。

Keras由纯Python编写,这意味着它的源代码简单易懂,你可以随时进去看看它都做了什么,怎么做的。并且,当你需要修改源代码的时候,大胆修改就可以了,它会立刻生效。尽管Python的运行效率要低于C++,但Keras只是Tensorflow和Theano的包装而已,这层包装的运行代价是很小的。

Keras是一款高度模块化的框架,使用它搭建网络和训练网络将会非常容易,如果你需要深入模型中控制细节,通常使用Keras提供的一些函数就可以了,很少需要深入到Tensorflow或Theano那一层。因此,Keras适合于快速原型生成,如果你经常需要很快的实现一下自己的idea,Keras会是一个不错的选择。

另外,Keras的预训练模型库也在逐步建设,目前有VGG-16,VGG-19,resnet50,Inceptionv3四种预训练好的模型供大家使用。

计算图,符号主义和张量

符号主义,Google一下会发现是一个机器学习的名词,但我们这说的符号主义不是那个东西,这里说的符号主义,指的是使用符号式编程的一种方法。 另一种相对的方法是命令式编程。或者是

要说Theano/Tensorflow/Keras,就不能不提它的符号主义特性

事实上,Theano也好,Tensorflow也好,其实是一款符号主义的计算框架,未必是专为深度学习设计的。假如你有一个与深度学习完全无关的计算任务想运行在GPU上,你完全可以通过Theano/Tensorflow编写和运行。

假如我们要求两个数a和b的和,通常只要把值赋值给a和b,然后计算a+b就可以了,正常人类都是这么写的:

a=3
b=5
z = a + b

运行到第一行,a真的是3.运行到第2行,b真的是5,然后运行第三行,电脑真的把a和b的值加起来赋给z了。

一点儿都不神奇。

但总有不正常的,不正常的会这么想问题:a+b这个计算任务,可以分为三步。(1)声明两个变量a,b。建立输出变量z(2)确立a,b和z的计算关系,z=a+b(3)将两个数值a和b赋值到变量中,计算结果z

后面那种“先确定符号以及符号之间的计算关系,然后才放数据进去计算”的办法,就是符号式编程。当你声明a和b时,它们里面是空的。当你确立z=a+b的计算关系时,a,b和z仍然是空的,只有当你真的把数据放入a和b了,程序才开始做计算。

符号之间的运算关系,就称为运算图。

这样做当然不是闲的无聊,符号式计算的一大优点是,当确立了输入和输出的计算关系后,在进行运算前我们可以对这种运算关系进行自动化简,从而减少计算量,提高计算速度。另一个优势是,运算图一旦确定,整个计算过程就都清楚了,可以用内存复用的方式减少程序占用的内存。

在Keras,theano和Tensorflow中,参与符号运算的那些变量统一称作张量。张量是矩阵的进一步推广。

规模最小的张量是0阶张量,即标量,也就是一个数。

当我们把一些数有序的排列起来,就形成了1阶张量,也就是一个向量

如果我们继续把一组向量有序的排列起来,就形成了2阶张量,也就是一个矩阵

把矩阵摞起来,就是3阶张量,我们可以称为一个立方体,具有3个颜色通道的彩色图片就是一个这样的立方体

把矩阵摞起来,好吧这次我们真的没有给它起别名了,就叫4阶张量了,不要去试图想像4阶张量是什么样子,它就是个数学上的概念。

一言以蔽之,Keras的计算过程,就是建立一个从张量到张量的映射函数,然后再放入真实数据进行计算。对深度学习而言,这个“映射函数”就是一个神经网络,而神经网络中的每个层自然也都是从张量到张量的映射。

Keras框架结构

我想画一个图,可是想了半天画不明白……我就罗列就好了,Keras的结构大致是这样的:

  • backend:后端,对Tensorflow和Theano进行封装,完成低层的张量运算、计算图编译等
  • models:模型,模型是层的有序组合,也是层的“容器”,是“神经网络”的整体表示
  • layers:层,神经网络的层本质上规定了一种从输入张量到输出张量的计算规则,显然,整个神经网络的模型也是这样一种张量到张量的计算规则,因此keras的model是layer的子类

上面的三个模块是Keras最为要紧和核心的三块内容,搭建一个神经网络,就只用上面的内容即可。注意的是,backend虽然很重要,但其内容多而杂,大部分内容都是被其他keras模块调用,而不是被用户直接使用。所以它不是新手马上就应该学的,初学Keras不妨先将backend放一旁,从model和layers学起。

为了训练神经网络,必须定义一个神经网络优化的目标和一套参数更新的方式,这部分就是目标函数和优化器:

  • objectives:目标函数,规定了神经网络的优化方向
  • optimizers:优化器,规定了神经网络的参数如何更新

上面的两个模块的内容,是在训练一个网络时必须提供的。此外,Keras提供了一组模块用来对神经网络进行配置:

  • initialization:初始化策略,规定了网络参数的初始化方法
  • regularizers:正则项,提供了一些用于参数正则的方法,以对抗过拟合
  • constraints:约束项,提供了对网络参数进行约束的方法

为了方便调试、分析和使用网络,处理数据,Keras提供了下面的模块:

  • callbacks:回调函数,在网络训练的过程中返回一些预定义/自定义的信息
  • visualization:可视化,用于将网络结构绘制出来,以直观观察
  • preprocessing:提供了一组用于对文本、图像、序列信号进行预处理的函数
  • utils:常用函数库,比较重要的是utils.np_utils中的to_categorical,用于将1D标签转为one-hot的2D标签和convert_kernel函数,用于将卷积核在theano模式和Tensorflow模式之间转换。最新的代码显示utils的utils.layer_utils里提供了将模型中全部卷积核进行模式转换的函数。大部分其他utils的函数你或许很难用到,但有空不妨一读,或有进益。

最后,为了能让用户一上手就能跑一些模型,Keras提供了一个常用数据库的模块,用来载入常用的数据库:

  • datasets:提供了一些常用数据库的接口,用户将通过这些接口下载和载入数据集

额外的一点是,如果用户希望将Keras与scikit-learn联动,Keras也提供了这种联动机制,这个模块是:

  • wrappers.scikit-learn

嗯,这个篇幅可以了,这篇先这样。中篇我们把各个模块的东西详细点儿聊一聊,下篇……写着再看,但肯定有下篇的

谢谢大家~

    原文作者:BigMoyan
    原文地址: https://zhuanlan.zhihu.com/p/22129946
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞