本文参考了《tensorflow+keras深度学习人工智能时间应用》。若本文有任何谬误欢迎指正,本人将尽快更改并深表谢意。
使用的数据集仍然是mnist
以下使用Out[数字]:
的方式表示代码输出结果
Out[数字]:
代码输出
建立多层感知器模型的步骤
1、数据预处理
数据预处理后,会产生features(数字图像特征值)与label(数字真实的值)
2、建立模型
建立多层感知器模型
3、训练模型
输入训练模型features(数字图像特征值)与label(数字真实的值),执行10次训练
4、评估模型准确率:
使用测试数据评估模型准确率
5、进行预测
使用已经训练完成的模型,输入测试数据进行预测
进行数据预处理
步骤一 导入所需模块
from keras.utils import np_utils
import numpy as np
np.random.seed(10)
步骤二 读取mnist数据
from keras.datasets import mnist
(x_train_image,y_train_label),(x_test_image,y_test_label)=mnist.load_data()
步骤三 将features(数字图像特征值)使用reshape转换
下面的代码将原本28x28的数字图像以reshape转换成784个float数
x_train=x_train_image.reshape(60000,784).astype('float32')
x_test=x_test_image.reshape(10000,784).astype('float32')
步骤四 将features(数字图像特征值)标准化
将features(数字图像特征值)标准化可以提高模型预测的准确度,并且更快收敛
x_train_norm=x_train/255
x_test_norm=x_test/255
步骤五 label(数字的真实值)以one-hot encoding进行转换
使用np_utils.to_categorical将训练数据与测试数据的label进行one-hot encoding转换
y_train_onehot=np_utils.to_categorical(y_train_label)
y_test_onehot=np_utils.to_categorical(y_test_label)
建立模型
输入层(x)共有784个神经元,隐藏层(h)共有256个神经元,输出层(y)共有10个神经元
步骤一 导入所需模块
from keras.models import Sequential
from keras.layers import Dense
Keras 的核心数据结构是 model,一种组织网络层的方式。其中有两种模式,最简单且最常用的模型是 Sequential 序贯模型,它是由多个网络层线性堆叠的栈。对于更复杂的结构,可以使用 Keras 函数式 API,它允许构建任意的神经网络图。
全连接层
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)
参数
- units: 正整数,输出空间维度。
-
activation: 激活函数。
若不指定,则不使用激活函数
(即, “线性”激活:a(x) = x
)。 - use_bias: 布尔值,该层是否使用偏置向量。
-
kernel_initializer:
kernel
权值矩阵的初始化器。 - bias_initializer: 偏置向量的初始化器.
-
kernel_regularizer: 运用到
kernel
权值矩阵的正则化函数。 - bias_regularizer: 运用到偏置向的正则化函数。
- activity_regularizer: 运用到层的输出的正则化函数。
-
kernel_constraint: 运用到
kernel
权值矩阵的约束函数。 - bias_constraint: 运用到偏置向量的约束函数。
Dense 实现以下操作: output = activation(dot(input, kernel) + bias)
其中 activation
是按逐个元素计算的激活函数,kernel
是由网络层创建的权值矩阵,以及 bias
是其创建的偏置向量 (只在 use_bias
为 True
时才有用)。
注意: 如果该层的输入的秩大于 2
,那么它首先被展平然后 再计算与 kernel
的点乘。
步骤二 建立Sequential模型
建立一个线性堆叠模型,后续只需要使用model.add()方法堆叠模型即可
# 声明序贯模型
model=Sequential()
序贯模型(Sequential)是多个网络层的线性堆叠,通俗来讲就是「一条路走到黑」。
步骤三 建立输入层与隐藏层
以下代码将输入层与隐藏层加入模型,使用model.add方法加入Dense全连接层。Dense全连接层的特色是:所有的上一层与下一层的神经元都完全连接
model.add(Dense(units=256,
input_dim=784,
kernel_initializer='normal',
activation='relu'))
参数 | 参数说明 |
---|---|
units=256 | 定义隐藏层神经元个数为256 |
input_dim=784 | 设置输入层神经元个数为784(28x28) |
kernel_initializer='normal' | 使用正态分布的随机数来初始化weight和bias |
activation='relu' | 选择relu作为激活函数 |
步骤四 建立输出层
使用model.add方法加入Dense全连接层,共有10个神经元,对应0-9十个数字。并且使用softmax激活函数进行转换,softmax可以将神经元的输出转换为预测每一个数字的概率
model.add(Dense(units=10,
kernel_initializer='normal',
activation='softmax'))
参数 | 参数说明 |
---|---|
units=10 | 定义输出层层神经元个数为10 |
kernel_initializer='normal' | 使用正态分布的随机数来初始化weight和bias |
activation='softmax' | 选择softmax作为激活函数 |
输出层的不需要设置input_dim,因为keras会按照上一层的units是256个神经元,设置这一层的input_dim为256个神经元
步骤四 查看模型的摘要
我们可以使用下列指令查看模型的摘要
print(model.summary())
模型摘要
我们可以看到共有以下两层:
- 隐藏层:共256个神经元,因为输入层与隐藏层是一起建立的,所以没有显示输入层
- 输出层:共10个神经元
模型的摘要还有Param字段,dense_1的Param为784x256+256=200960,dense_2的Param为256x10+10=2570,稍后会给出说明。
以上每一层Param都是超参数(Hyper-Parameters)。
我们需要通过方向传播算法更新神经元连接的权重和偏差。
- 建立输入层与隐藏层的公式如下:
h1 = relu( X x W1 + b1) - 建立隐藏层与输出层的公式如下:
Y = softmax( h1 x W2 + b2) - 所以每一层的Param计算方式如下:
Param = (上一层神经元数量)x (本层的神经元数量) + (本层的神经元数量)
整个网络的超参数(Trainable params)是每一层Param的总和。通常Trainable params数值越大,代表模型越复杂。
进行训练
在我们建立好深度学习模型后,就可以采用反向传播算法进行训练了。
步骤一 定义训练方式
在训练模型之前,我们必须使用compile方法对训练模型进行设置:
model.compile(loss='categorical_crossentropy',
optimizer='adam',metrics=['accuracy'])
- loss:设置损失函数,在深度学习中用cross_entropy(交叉熵)训练效果较好
- optimizer:设置训练时,在深度学习中使用adam优化器可以更快收敛,并提高准确率
- metrics:设置评估模型的方式为accuracy
步骤二 开始训练
train_history=model.fit(x=x_train_norm,
y=y_train_onehot,
validation_split=0.2,
epochs=10,
batch_size=200,
verbose=2)
训练结果
程序代码说明
使用model.fit进行训练,训练过程会存储在变量train_history中,需输入下列参数。
输入训练数据参数
- x = x_train_norm(features数字图像的特征值)
- y = y_train_onehot(label数字图像的实际值)
设置训练与验证数据比例
- 设置参数 validation_split = 0.2
设置后,keras在训练前会自动将数据分成两份:80%作为训练数据,20%作为验证数据。
本数据集总量为60000,因此48000项为训练集,12000项为验证集
设置epoch(训练周期)次数与每一批次的项数
- epochs = 10:执行10个训练周期
- batch_size = 200:每一批次200项数据
设置为显示训练过程
- verbose = 2:显示训练过程
以上代码共执行了10个训练周期,每个训练训练周期执行下列功能:
- 使用48000项训练数据训练,大约分为240个批次,每一批次200项
- 训练完成后,会计算这个训练周期的准确率与误差,并在train_history中新增一项数据记录
网友评论