速查手册
30s理解基本概念
符号计算
Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还 是TensorFlow,都是一个“符号主义”的库。
符号主义的计算首先定义各种 变量,然后建立一个“计算图”,计算图规定了各个变量之间的计算关系。建立好的计算图需要编译已确 定其内部细节,然而,此时的计算图还是一个“空壳子”,里面没有任何实际的数据,只有当你把需要运 算的输入放进去后,才能在整个模型中形成数据流,从而形成输出值。
Keras的模型搭建形式就是这种方法,在你搭建Keras模型完毕后,你的模型就是一个空壳子,只有实 际生成可调用的函数后(K.function),输入数据,才会形成真正的数据流。
张量tensor
张量可以看作是向量、矩阵的自然推广
规模最小的张量是0阶张量,即标量,也就是一个数。
当我们把一些数有序的排列起来,就形成了1阶张量,也就是一个向量
如果我们继续把一组向量有序的排列起来,就形成了2阶张量,也就是一个矩阵
把矩阵摞起来,就是3阶张量,我们可以称为一个立方体,具有3个颜色通道的彩色图片就是一个这样 的立方体
‘th’与’tf’
‘th’模式,即Theano模式
‘tf’模式,即TensorFlow模式
这两种模式在如何表示一组彩色图片的问题上发生了分歧
Keras默认的数据组织可通过K.image_dim_ordering()函数返回,请在网络的训练和测试中保持维度顺序一 致
batch
深度学习的优化算法一般为梯度下降,每次的参数更新有两种方式
- 批梯度下降(Batch gradient descent),遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度,计算开销过大
- 随机梯度下降(stochastic gradient descent),每看一个数据就算一下损失函数,然后求梯度更新参数,收敛性能不好
- 小批的梯度 下降(mini-batch gradient decent)采取折中的方法,把数据分为若干个批,按批来更新参数,一个批中的一组数据共同决定了本次梯度的方向
30s入门keras
Sequential模型
Keras的核心数据结构是“模型”,Keras中主要的模型是Sequential。
Sequential 是多个网络层的线性堆叠。
1 | from keras.models import Sequential |
堆叠网络层
将一些网络层通过.add()
堆叠起来,就构成了一个模型:
1 | from keras.layers import Dense, Activation |
也可通过向 Sequential 模型传递一个layer的list来构造该模型:
1 | from keras.models import Sequential |
编译模型
编译模型时必须指明损失函数loss
和优化器optimizer
1 | model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) |
也可定制模型:
1 | from keras.optimizers import SGD |
迭代训练
batch_size即为mini-batch中的每批中的数据量
1 | model.fit(X_train, Y_train, nb_epoch=5, batch_size=32) |
评估模型
1 | loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=32) |
预测
1 | classes = model.predict_classes(X_test, batch_size=32) |
一些细节
指定输入shape
下面的三个指定输入数据shape的方法是严格等价的:
1 | model.add(Dense(32, input_shape=(784,))) |
同理
1 | model.add(LSTM(32, input_shape=(10, 64))) |
Merge层
多个 Sequential 可经由一个Merge层合并到一个输出。Merge层的输出是一个可以被添加到新 Sequential 的层对象
Merge层支持一些预定义的合并模式,包括:
- sum (defualt):逐元素相加 concat :张量串联,可以通过提供
- concat_axis 的关键字参数指定按照哪个轴进行串联
- mul :逐元素相乘
- ave :张量平均
- dot :张量相乘,可以通过 dot_axis 关键字参数来指定要消去的轴
- cos :计算2D张量(即矩阵)中各个向量的余弦距离
- 提供关键字参数 mode:
mode=lambda x: x[0] - x[1]
1 | from keras.layers import Merge |
编译
- 优化器optimizer:该参数可指定为已预定义的优化器名,如 rmsprop 、 adagrad ,或一 个 Optimizer 类的对象
- 损失函数loss:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名, 如 categorical_crossentropy 、 mse ,也可以为一个损失函数
- 指标列表metrics:对分类问题,我们一般将该列表设置为 metrics=[‘accuracy’] 。指标可以是一个预 定义指标的名字,也可以是一个用户定制的函数.指标函数应该返回单个张量,或一个完成 metric_name - > metric_value 映射的字典
1 | model.compile(optimizer='rmsprop', |
训练
Keras以Numpy数组作为输入数据和标签的数据类型
1 | # generate dummy data |
1 | # generate dummy data |
查看模型
model.summary()
:打印出模型概况model.get_config()
:返回包含模型配置信息的Python字典model.get_weights()
:返回模型权重张量的列表
保存模型
不推荐使用pickle来保存Keras模型!
可以利用h5py库,将Keras模型和权重保存在一个HDF5文件中
该文件将包含:
- 模型的结构,以便重构该模型
- 模型的权重
- 训练配置(损失函数,优化器等)
- 优化器的状态,以便于从上次训练中断的地方开始
1 | from keras.models import load_model |
只保存模型结构,而不包含其权重或配置信息:
1 | # save as JSON |
1 | # model reconstruction from JSON: |
使用预训练模型
通过 keras.applications
载入模型
1 | from keras.applications.vgg16 impoprt VGG16 |