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

2019-01-26  本文已影响0人  魏允臣

本文参考了《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)

参数

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())
模型摘要

我们可以看到共有以下两层:

模型的摘要还有Param字段,dense_1的Param为784x256+256=200960,dense_2的Param为256x10+10=2570,稍后会给出说明。
以上每一层Param都是超参数(Hyper-Parameters)。
我们需要通过方向传播算法更新神经元连接的权重和偏差。

整个网络的超参数(Trainable params)是每一层Param的总和。通常Trainable params数值越大,代表模型越复杂。

进行训练

在我们建立好深度学习模型后,就可以采用反向传播算法进行训练了。

步骤一 定义训练方式

在训练模型之前,我们必须使用compile方法对训练模型进行设置:

model.compile(loss='categorical_crossentropy',
              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中,需输入下列参数。

输入训练数据参数

设置训练与验证数据比例

设置epoch(训练周期)次数与每一批次的项数

设置为显示训练过程

以上代码共执行了10个训练周期,每个训练训练周期执行下列功能:

上一篇 下一篇

猜你喜欢

热点阅读