搭建浅层神经网络"Hello world"

举报
矩池云 发表于 2020/02/27 16:50:04 2020/02/27
【摘要】 作为图像识别与机器视觉界的 "hello world!" , MNIST ("Modified National Institute of Standards and Technology") 数据集有着举足轻重的地位。基本上每本人工智能、机器学习相关的书上都以它作为开始。

作为图像识别与机器视觉界的 "hello world!" , MNIST ("Modified National Institute of Standards and Technology") 数据集有着举足轻重的地位。基本上每本人工智能、机器学习相关的书上都以它作为开始。

下面我们会用 TensorFlow 搭建一个浅层的神经网络来运行 "hello world!" 模型。 以下内容和模块的运算,均在矩池云平台进行。

本次教程分五步:

第一步:数据预处理,包括提取数据标签、查看图片数据、数据可视化、查看数据是否平衡等

第二步:数据加载,打乱数据集

第三步:构建模型,简单介绍网络卷积模型和激活函数,定义训练函数和学习率

第四步:模型训练,查看训练过程和结果,使用图表查看模型精确度和学习率变化

第五步:尝试提升精准度,不断探索和优化

在搭建开始前,我们需要加载以下对应的模块:

1582792617954383.png

第一步:数据预处理

1.1查看数据标签

在任何模型建立之前,应当优先查看数据的情况。例如数据集的大小、训练集和测试集的数据数量、标签的数据数量分布等。 下方为训练集和测试集的数据查看代码:

train = pd.read_csv('mnist/mnist_train.csv') # read traintest = pd.read_csv('mnist/mnist_test.csv') # read train

下方为训练集和测试集的数量结果:

train.shape   (6000,785)test.shape    (10000,785)

我们可以看到 train 训练集里面有6000条数据,test 测试集里面有10000条数据,两个测试集每行都有785个数据。

接下来,我们来看下数据集的预览:其中第一列是标签列,剩余784列则为像素点数据,由该784列数据组成一张28*28的像素图片。

1582792658110274.png

1.2 提取数据标签

接下来,我们进行数据标签的提取和处理。先来看下标签数据的提取代码:

train_labels = np.array(train.pop('label'))test_labels = np.array(test.pop('label'))

查看标签种类,我们可以看出标签表示了从0~9的数字,没有其他的错误数据。

1582792688644748.png

由于运算需要,我们需要将一维的图片数据转换成二维图片数据。将图片数据转换成长28,宽28,通道为1的格式,方便卷积计算。

1582792724617535.png

第二步:数据可视化

2.1 随机生成数据匹配

现在随机选取一些我们已经转换好的图片数据,用 matplot 来查看下标签和图片是否能够对上。

方框内是随机生成的一些非规则写法,图片上方正中间则为对应的数字。

1582792752541018.png

2.2 查看数据是否平衡

分类器的设计都是基于类分布大致平衡这一假设,通常假定用于训练的数据是平衡的,即各类所含样本数大致相当。

下面我们来看下标签的分布情况,查看每个标签种类的数据量是否分布均匀。

在 MINST 数据集中,我们的数据是处于一个均匀分布的状态。

sns.distplot(train_labels, kde=False, bins=10)

1582792801563740.png

2.3 数据加载

在建立模型之前,我们需要先定义一些常量:

# 图像宽度width = 28# 图像高度height = 28# batch sizebatch_size = 100# 训练图片数量train_images_num = train.shape[0]

下一步,我们为模型建立数据集。TensorFlow 提供了 Dataset 类可以方便加载训练的数据,使用方式为 tf.data.Dataset。

其中,训练集的数据,我们进行了随机打乱。

train = tf.cast(train, tf.float32)
test = tf.cast(test, tf.float32)
train_ds = tf.data.Dataset.from_tensor_slices((train, train_labels)).shuffle(train_images_num).batch(batch_size)
test_ds = tf.data.Dataset.from_tensor_slices((test, test_labels)).batch(batch_size)

第三步:模型构建

3.1 构建模型的网络层次结构

数字识别作为入门工程,我们的模型也会相对的简单。当前构建模型,采用了以下几层网络层次结构:

  • 第一层二维卷积层

  • Flatten 层:这层的作用是将第一层的卷积曾平坦压缩成一维,常用在从卷积层到全连接曾的过度,当然 Flatten 不影响 batch 的大小

  • Dense 层:全连接神经网络层

  • Dense 层:全连接神经网络层

每一层对应的激活函数如下:

  • 第一层使用 ReLU 函数

  • Flatten 层( 无 )

  • Dense 层 ReLU 函数

  • Dense 层使用 softmax 损失函数进行输出

3.2 关于激活函数的解释说明

ReLU函数

ReLU 函数全名为线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元,是一种人工神经网络中常用的激活函数(activation function),通常指代以斜坡函数及其变种为代表的非线性函数。

ReLU的函数表达式为:


1582792930291142.png


用向量形式表达为:


1582792953608049.png


函数曲线形态为:


1582792994489250.png

从函数的表达可以看出,函数抑制了比 0 小的输入,这个激活函数有以下特点:

  • 收敛快

  • 在[ 0, x ]区间内不会饱和,即它可以对抗梯度消失问题

  • 求导简单,也就是它的计算效率很高

softmax 函数

softmax 用于多分类过程中,它将多个神经元的输出映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。

我们来看下它的数学表达式,假设我们有一个数组,

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。