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中新增一项数据记录
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容