YB菜菜的机器学习自学之路(八)——基于keras的初级深度学习框架

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

YB菜菜的机器学习自学之路八——基于keras的初级深度学习框架

前提说明

1网址https://playground.tensorflow.org是著名的rensorflow游乐场其提供了一些典型数据并通过“+”“-”号搭建神经网络搭建模型用可视化图输出结果观察最后的学习结果。
2通常隐藏层超过三层的学习网络被称为深度神经网络。
3MNIST数据集是从NIST的两个手写数字数据集我们以mnist为对象搭建基于keras的深度学习网络来进行测试
4不知道为什么我能运行成像 但是有三个红色"警告"?, 假如有哪位大神不小心看到我整理的比较粗糙的笔记并且愿意指导萌新麻烦指导一下谢谢。

1. 训练集和测试集

训练集 我们在训练时使用的数据集称为训练集我们希望在训练集上的准确率很高这意味模型拟合效果很好。
测试集 在训练集之外的新的数据这些数据称为测试集。当模型训练好后我们会拿一些新的数据来测试模型观察他的好坏我们希望在测试集上的准确率也很高。测试集高就证明该模型的泛化能力强这也是我们希望的。

欠拟合 训练集准确度低比如用一个很简单的神经元模型去拟合复杂数据。
过拟合 测试集准确度高测试集准确低。 用过分复杂的模型去拟合简单的数据。

2. mnist数据集简单介绍

由于MNIST数据集非常著名所以已经有许多深度学习框架已经内置了mnist数据集并且有相关的函数直接读取并划分数据集。
在keras框架中我们可以通过代码调用和观察

from keras.datasets import mnist
# 导入mnist中的训练集和测试集
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
# mnist的数据格式类比matlab中的size
print("X_train.shape:"+str(X_train.shape))
print("Y_train.shape:"+str(Y_train.shape))
print("X_test.shape:"+str(X_test.shape))
print("Y_test.shape:"+str(Y_test.shape))

运行结果

X_train.shape:(60000, 28, 28)
Y_train.shape:(60000,)
X_test.shape:(10000, 28, 28)
Y_test.shape:(10000,)

X_train和X_test 说明在keras中内置了6万个训练集和1万个测试集。每一个图像的大小是28*28。
Y_train和Y_test 是6万和1万的元素组每个元素的值代表train中对应位置的图片类别在0-9之间。
在这里插入图片描述
图1 MNIST训练集格式示意图

3.基于keras框架利用全链接层搭建深度学习网络对MNIST训练

3.1 数据导入与one-hot编码

因为MNIST的数据是一个2828的图像像素点因此我们要把他从矩形装的图像转成一个数组如图2所示。
在这里插入图片描述
图2 将28
28的矩形像素数据转成一组向量

# 60000个数据集28*28
X_train = X_train.reshape(60000, 784)  
X_test = X_test.reshape(10000, 784)

one-hot编码
在前文我们的二分类问题不同在MNIST中输出不再是要么是1要么是0而是变成0-9即有10种分类。为例更好的表示0-9以及增强他们直接的区分程度选择one-hot编码。比如用【1 0 0 0 0 0 0 0 0 0】表示“1”用【0 1 0 0 0 0 0 0 0 0】表示“2”. 在这种情况下既可以很好的表示输出0-9的结果并且每个结果之前存在巨大的差异有利于识别。
因此

Y_train = to_categorical(Y_train, 10)
Y_test = to_categorical(Y_test, 10)

3.2 创建模型

model = Sequential()

3.3创建神经元

3.3.1 输入层构建

model.add(Dense(units=256, activation='relu', input_dim=784))

因为MNIST数据相对复杂为了提高准确度我们提高每一层的神经元数即units =256
选择激活函数activation=‘relu’。 relu是一种比sigmoid更常用于深度网络种的激活函数其最大的优点是防止梯度消失
因为输出数据每次输入一个图像的数据量即28*28=784所以input_dim=784。

3.3.2 增加中间的隐藏层

model.add(Dense(units=256, activation='relu'))
model.add(Dense(units=256, activation='relu'))

增加2个隐藏层 使得整个深度为3即为深度学习

3.3.4 构建输出层

model.add(Dense(units=10, activation='softmax'))

因为one-hot编码输出不再是单独的0或者1因此一个神经元是无法表示十种类型因此输出层需要设置为10正好匹配one-hot编码位数。
同时sigmoid激活函数也不适用于多输出情况这里采用softmax激活函数其特点是softmax输出的结果是评估这个可能性的概率概率最大的输出就意味着预测结果是该输出的类别。并且所有输出的结果概率之和为1而不会超过1。

3.4 构建反向传播

model.compile(loss='categorical_crossentropy', optimizer=SGD(learning_rate=0.05), metrics=['accuracy'])

在之前代价函数一直采用mean_squared_error即均方差代价函数但是这个对分类问题不太合适
这里改成categorical_crossentropy 交叉熵代价函数

3.5开始训练

model.fit(X_train, Y_train, epochs=5000, batch_size=1000)

3.6 评估结果

loss, accuracy = model.evaluate(X_test, Y_test)

最后训练集准确率基本100%
测试集在97%以上

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习