深度学习之keras入门

阅读本文需要有一定的深度学习、神经网络基础

Keras 顺序 (Sequential) 模型

顺序模型是多个网络层的线性堆叠。 使用顺序模型的基本步骤如下:

  1. 初始化顺序模型并指定网络结构
  2. 编译:通过 compile 方法指定优化器、损失函数、评估标准
  3. 训练模型:使用 fit 函数

模型的初始化

建立方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 样例1,使用层的列表初始化
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
# 样例2,初始化后使用 .add() 方法将各层添加到模型中
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))

以上2种方式是等价的,以下将进行基本解释:

  1. model.add(Dense(32, input_dim=784))Dense代表核心网络层(即普通的全连接层),其中32代表输出空间的维度,input_dim则表示输入数据的维度,类似的还有Conv2D(卷积层),MaxPooling2D (MaxPooling层),lstm(循环层)等。
  2. model.add(Activation('relu')):Activation代表激活函数,可以配置单独的激活层(也可统称位隐层层)实现,也可在构造层对象时通过传递activation参数实现 ,常用的有tanh relu softmax等,一般深层模型使用多用relu ,对于多分类的情况,最后一层是softmax,二分类问题最后一层用sigmoid 。类似的隐藏层有Dropout层、池化层。

编译

通过 compile 方法指定优化器、损失函数、评估标准

1
compile(self, optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)

例如我们使用 rmsprop来作为优化器,binary_crossentropy 来作为损失函数值,使用accuracy作为评估标准。

1
model.compile(loss='binary_crossentropy', optimizer='rmsprop',metrics = ['accuracy'])
  1. 常用的损失函数:
    1. categorical_crossentropy多分类对数损失
    2. binary_crossentropy对数损失
    3. mean_squared_error平均方差损失
    4. mean_absolute_error平均绝对值损失
  2. 常用优化器:如SGD随机梯度下降, RMSProp, Adagrad, Adam, Adadelta等

训练

使用 fit 函数 进行训练,其中x与y必须是Numpy数组。

1
2
3
fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None,
validation_split=0.0, validation_data=None, shuffle=True, class_weight=None,
sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

模型评估

使用evaluate进行评估。

1
evaluate(self, x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None)

在测试模式,返回误差值和评估标准值。

预测

1
predict(self, x, batch_size=None, verbose=0, steps=None)

为输入样本生成输出预测。

网络的保存

一般通过model.save(filepath)将Keras模型和权重保存在一个HDF5文件中。需要事先安装h5py包(pip install h5py)。

一般通过keras.models.load_model(filepath)读取模型。

1
2
3
4
5
6
# 保存模型
model.save('model.h5') # HDF5文件,pip install h5py
# 读取模型
from keras.models import load_model
model = load_model('model.h5')

model.save(filepath)将会保存模型的所有信息,包括:

  • 模型的结构,以便重构该模型
  • 模型的权重
  • 训练配置(损失函数,优化器等)
  • 优化器的状态,以便于从上次训练中断的地方开始

你也可以通过model.save_weights来保存权重信息。

1
2
model.save_weights('model_weights.h5')
model.load_weights('model_weights.h5')

也可以只保存/加载模型的网络结构

1
2
3
4
5
#保存为json
json_str = model.to_json()
#保存为yaml
yanm_str = model.to_yaml()

保存下来的JSON/YAML是可阅读的文本,可以被编辑,通过以下方式加载:

1
2
3
4
5
from keras.models import model_from_json
model = model_from_json(json_string)
from keras.models import model_from_yaml
model = model_fram_yaml(yaml_str)

样例

基于多层感知器 (MLP) 的 softmax 多分类:

样例来自官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
# 生成虚拟数据
import numpy as np
x_train = np.random.random((1000, 20))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)
x_test = np.random.random((100, 20))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
model = Sequential()
# Dense(64) 是一个具有 64 个隐藏神经元的全连接层。
# 在第一层必须指定所期望的输入数据尺寸:
# 在这里,是一个 20 维的向量。
model.add(Dense(64, activation='relu', input_dim=20))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
score = model.evaluate(x_test, y_test, batch_size=128)

分析代码,生成数据x_train具有20维特征,目标y_train分为10类,网络结构有5层,其中2层具有64个全连接单元,2个dropout层,以及一个10个单元的输出层。

模型采用随机梯度下降法,损失函数为多分类对数损失,评价指标为正确率。

基于 1D 卷积的序列分类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import Conv1D, GlobalAveragePooling1D, MaxPooling1D
model = Sequential()
model.add(Conv1D(64, 3, activation='relu', input_shape=(seq_length, 100)))
model.add(Conv1D(64, 3, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(128, 3, activation='relu'))
model.add(Conv1D(128, 3, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=16, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=16)

Conv1D代表1D 卷积层 (例如时序卷积)。 对于图像的卷积通常使用Conv2D。

Conv1D的使用如下:

1
2
3
4
keras.layers.Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1,
activation=None, use_bias=True, kernel_initializer='glorot_uniform',
bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None,
activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

代码样例中使用model.add(Conv1D(128, 3, activation='relu'))建立了一个输出维度为128,卷积窗口为3的卷积层。

参考资料

  1. https://keras.io/
  2. https://blog.csdn.net/u012897374/article/details/78167300?locationNum=8&fps=1
  3. http://www.aibbt.com/a/30814.html
  4. https://blog.csdn.net/baimafujinji/article/details/80705578

本文标题:深度学习之keras入门

文章作者:微石

发布时间:2018年07月29日 - 14:07

最后更新:2018年08月01日 - 21:08

原始链接:akihoo.github.io/posts/1e893844.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。