速查手册
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 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层支持一些预定义的合并模式,包括:
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数组作为输入数据和标签的数据类型
# generate dummy data import numpy as np data = np.random.random((1000, 784)) labels = np.random.randint(2, size=(1000, 1)) # train the model, iterating on the data in batches # of 32 samples model.fit(data, labels, nb_epoch=10, batch_size=32)
# generate dummy data 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)) # these are integers between 0 and 9 labels = np.random.randint(10, size=(1000, 1)) # we convert the labels to a binary matrix of size (1000, 10) # for use with categorical_crossentropy labels = to_categorical(labels, 10) # train the model # note that we are passing a list of Numpy arrays as training data # since the model has 2 inputs model.fit([data_1, data_2], labels, nb_epoch=10, batch_size=32)
查看模型
model.summary() model.get_config() model.get_weights()
保存模型
不推荐使用pickle来保存Keras模型!
可以 利用h5py库 ,将Keras模型和权重保存在一个HDF5文件中
该文件将包含:
模型的结构,以便重构该模型
模型的权重
训练配置(损失函数,优化器等)
优化器的状态,以便于从上次训练中断的地方开始
from keras.models import load_model model.save('my_model.h5') # creates a HDF5 file 'my_model.h5' del model # deletes the existing model # returns a compiled model # identical to the previous one model = load_model('my_model.h5')
只保存模型结构,而不包含其权重或配置信息:
# save as JSON json_string = model.to_json() # save as YAML yaml_string = model.to_yaml()
# model reconstruction from JSON: from keras.models import model_from_json model = model_from_json(json_string) # model reconstruction from YAML 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
Be First to Comment