速查手册
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 是多个网络层的线性堆叠。
from keras.models import Sequential
model = Sequential()
堆叠网络层
将一些网络层通过.add() 堆叠起来,就构成了一个模型:
from keras.layers import Dense, Activation
model.add(Dense(output_dim=64, input_dim=100))
model.add(Activation("relu"))
model.add(Dense(output_dim=10))
model.add(Activation("softmax"))
也可通过向 Sequential 模型传递一个layer的list来构造该模型:
from keras.models import Sequential
model = Sequential([
Dense(64, input_dim=100),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
编译模型
编译模型时必须指明损失函数loss 和优化器optimizer
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
也可定制模型:
from keras.optimizers import SGD
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True))
迭代训练
batch_size即为mini-batch中的每批中的数据量
model.fit(X_train, Y_train, nb_epoch=5, batch_size=32)
评估模型
loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=32)
预测
classes = model.predict_classes(X_test, batch_size=32)
proba = model.predict_proba(X_test, batch_size=32)
一些细节
指定输入shape
下面的三个指定输入数据shape的方法是严格等价的:
model.add(Dense(32, input_shape=(784,)))
model.add(Dense(32, batch_input_shape=(None, 784)))
model.add(Dense(32, input_dim=784))
同理
model.add(LSTM(32, input_shape=(10, 64)))
model.add(LSTM(32, batch_input_shape=(None, 10, 64)))
model.add(LSTM(32, input_length=10, input_dim=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]
from keras.layers import Merge
left_branch = Sequential()
left_branch.add(Dense(32, input_dim=784))
right_branch = Sequential()
right_branch.add(Dense(32, input_dim=784))
merged = Merge([left_branch, right_branch], mode='concat')
final_model = Sequential()
final_model.add(merged)
final_model.add(Dense(10, activation='softmax'))
编译
- 优化器optimizer:该参数可指定为已预定义的优化器名,如 rmsprop 、 adagrad ,或一 个 Optimizer 类的对象
- 损失函数loss:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名, 如 categorical_crossentropy 、 mse ,也可以为一个损失函数
- 指标列表metrics:对分类问题,我们一般将该列表设置为 metrics=[‘accuracy’] 。指标可以是一个预 定义指标的名字,也可以是一个用户定制的函数.指标函数应该返回单个张量,或一个完成 metric_name - > metric_value 映射的字典
model.compile(optimizer='rmsprop',
loss='mse')
训练
Keras以Numpy数组作为输入数据和标签的数据类型
import numpy as np
data = np.random.random((1000, 784))
labels = np.random.randint(2, size=(1000, 1))
model.fit(data, labels, nb_epoch=10, batch_size=32)
import numpy as np
from keras.utils.np_utils import to_categorical
data_1 = np.random.random((1000, 784))
data_2 = np.random.random((1000, 784))
labels = np.random.randint(10, size=(1000, 1))
labels = to_categorical(labels, 10)
model.fit([data_1, data_2], labels, nb_epoch=10, batch_size=32)
查看模型
model.summary() :打印出模型概况model.get_config() :返回包含模型配置信息的Python字典model.get_weights() :返回模型权重张量的列表
保存模型
不推荐使用pickle来保存Keras模型!
可以利用h5py库,将Keras模型和权重保存在一个HDF5文件中
该文件将包含:
- 模型的结构,以便重构该模型
- 模型的权重
- 训练配置(损失函数,优化器等)
- 优化器的状态,以便于从上次训练中断的地方开始
from keras.models import load_model
model.save('my_model.h5')
del model
model = load_model('my_model.h5')
只保存模型结构,而不包含其权重或配置信息:
json_string = model.to_json()
yaml_string = model.to_yaml()
from keras.models import model_from_json
model = model_from_json(json_string)
model = model_from_yaml(yaml_string)
使用预训练模型
通过 keras.applications 载入模型
from keras.applications.vgg16 impoprt VGG16
from keras.applications.vgg19 impoprt VGG19
from keras.applications.resnet50 impoprt ResNet50
from keras.applications.inception_v3 impoprt InceptionV3
model = VGG16(weights='imagenet', include_top=True)
官方文档: https://keras.io/zh/#30-keras
|