keras建立多层神经网络(持续更新)

本文参考了《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_biasTrue 时才有用)。
注意: 如果该层的输入的秩大于 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中新增一项数据记录
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容