Press "Enter" to skip to content

深度学习入门之keras

速查手册

 

 

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注