Keras只是深度学习建模的一个上层建筑,其后端可以灵活使用CNTK、TensorFlow或者Theano。这样就可以避免不同深度学习框架的差异而集中于建模过程。并且可以进行CPU和GPU之间的无缝切换。
我的理解,就像是jQuery是对JavaScript的一层封装,那么Keras就是对机器学习框架CNTK、TensorFlow或者Theano的一层封装,大大简化了代码量。
此程序实现的是一个5分类的功能,所用数据是59维的。
1)引入所需要的包
# 引入序列模型
from keras.models import Sequential
# 引入全连接层、放弃层、激活层(激活层没有直接用到,但是在全连接层里间接用到了。)
from keras.layers import Dense, Dropout, Activation
# 引入SGD优化算法
from keras.optimizers import SGD
# 引入了metrics评估模块
from keras import metrics
# 引入可视化模块
from keras.utils import plot_model
# 引入了keras
import keras
# 使用numpy来模拟生成数据
import numpy as np
2)解析数据文件
def get_list(filename): # get train data and label
array = []
array1 = []
i = 0
with open(filename, 'r') as file_to_read:
while True:
lines = file_to_read.readline()
if not lines:
break
pass
p_tmp = [float(i) for i in lines.split()]
if i % 2 == 0:
array.append(p_tmp)
else:
array1.append(p_tmp)
i += 1
pass
array = np.array(array)
array1 = np.array(array1)
pass
return array, array1
3)准备好训练数据和测试数据
train_label, train_data = get_list('data.txt')
test_label, test_data = get_list('test.txt')
train_label = keras.utils.to_categorical(train_label, num_classes=5)
test_label = keras.utils.to_categorical(test_label, num_classes=5)
keras.utils.to_categorical(train_label, num_classes=5)的意思就是把标签转化成one-hot 标签,train_label是一个900x1的矩阵,里面有1,2,3,4,5表示5个分类(不一定包含1-5里面所有的数,在 num_classes 的范围就行)。
4)构建模型
# 构建序列模型
model = Sequential()
# 第一层为全连接层,隐含单元数为64,激活函数为relu,在第一层中一定要指明输入的维度。
model.add(Dense(64, activation='relu', input_dim=59))
# 放弃层,将在训练过程中每次更新参数时随机断开一定百分比(rate)的输入神经元,Dropout层用于防止过拟合。这里是断开50%的输入神经元。
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(5, activation='softmax'))
# 实例化优化算法为sgd优化算法
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
首先这里接触到了model,model在Keras里有两种,一种是序贯模型,一种是函数式模型。
1.序贯模型
序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。这也是非常常用的和傻瓜式的方法。
2. 函数式(Functional)模型
Keras函数式模型接口是用户定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型的途径。一句话,只要你的模型不是类似VGG一样一条路走到黑的模型,或者你的模型需要多于一个的输出,那么你总应该选择函数式模型。函数式模型是最广泛的一类模型,序贯模型(Sequential)只是它的一种特殊情况。
下面我们来简单的介绍一下目前用到的几个常用层(Core)。
1. Dense层
keras.layers.core.Dense(
units,
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,
**kwargs
)
Dense就是常用的全连接层,所实现的运算是output = activation(dot(input, kernel)+bias)。其中activation是逐元素计算的激活函数,kernel是本层的权值矩阵,bias为偏置向量,只有当use_bias=True才会添加。
如果本层的输入数据的维度大于2,则会先被压为与kernel相匹配的大小。
参数的含义如下:
2. Activation层
这个激活函数在本例中没有出现,其实不是,它间接的在Dense层中出现过了,预设的激活层常见的有以下几种:
还有其他激活函数我们就不一一介绍了。
3. Dropout层
keras.layers.core.Dropout(rate, noise_shape=None, seed=None)
为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时随机断开一定百分比(rate)的输入神经元,Dropout层用于防止过拟合。
其参数含义如下:
优化算法
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
它就是随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量。这几个参数就是SGD的几个改进,优化算法那章我们会讲到。
其参数含义如下:
5)对模型进行预编译
# 对模型进行预编译,其损失函数为多类别交叉熵,优化算法为sgd,
# 评估方法为多类别准确度和平均绝对误差。
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=[metrics.categorical_accuracy, metrics.mae]
)
在训练模型之前,我们需要通过compile来对学习过程进行配置。compile接收三个参数:
6)训练模型
model.fit(train_data, train_label, epochs=50, batch_size=100)
原型为
fit(self,
x,
y,
batch_size=32,
epochs=10,
verbose=1,
callbacks=None,
validation_split=0.0,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0
)
fit函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况。
7)评估模型
# 评估模型
score = model.evaluate(test_data, test_label, batch_size=128)
原型为:
evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)
它最终返回的是一个score,第0维为编译中的loss指标,剩下的就是metrics中的指标了。
参数含义如下:
8)模型可视化
plot_model(model, to_file='model.png', show_shapes=True)
注意事项:
调用可视化的时候可能会报错如下:
RuntimeError: Failed to import pydot. You must install pydot and graphviz for
pydotprint
to work
解决办法:
9)程序所需要的训练数据和测试数据,(自制采集数据不容易,且下且珍惜)
感谢刘炫320 的博客