深度学习-----从零开始实现识别手写字体任务(三)数据集的导入及相关函数的定义

一.Mnist简介

Mnist数据集分为两部分,分别含有60000张训练图片和10000张测试图片。

每一张图片包含28*28个像素。Mnist数据集把代表一张图片的二维数据转开成一个向量,长度为28*28=784。因此在Mnist的训练数据集中mnist.train.images是一个形状为[60000, 784]的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点,图片里的某个像素的强度值介于0-1之间。

二.什么是张量

张量(tensor)是多维数组,目的是把向量、矩阵推向更高的维度。

张量的通俗理解

3                                    这个 0 阶张量就是标量,shape=[]
[1., 2., 3.]                         这个 1 阶张量就是向量,shape=[3]
[[1., 2., 3.], [4., 5., 6.]]         这个 2 阶张量就是二维数组,shape=[2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]]     这个 3 阶张量就是三维数组,shape=[2, 1, 3]
即有几层中括号   

三.Mnist数据集的导入

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

这里需要注意的是,由于我使用的tensorflow是比较旧的v1.4,导入数据集的方法跟tensorflow v2.0 以后的版本不一样。

xs = tf.placeholder(tf.float32, [None, 784], name='x_input')
ys = tf.placeholder(tf.float32, [None, 10], name='y_input')
x_image = tf.reshape(xs, [-1, 28, 28, 1])

创建两个占位符,xs为输入网络的图像,ys为输入网络的图像标签(即为图像表示的数字)
输入xs(二维张量,shape为[batch, 784])变成4d的x_image,x_image的shape应该[batch,28,28,1],第四维是通道数1
-1表示自动推测这个维度的size
reshape成了conv2d需要的输入形式;若是直接进入全连接层,则没必要reshape

四.权重与偏置

好比说我在考虑我要不要出去玩滑板,有这么几个因素影响我要不要出去玩

  1. 有人和我一起去
  2. 天气凉爽,不下雨

那么现在有这么几种情况:

  1. 天气晴朗,有人陪我玩滑板→我会出去玩滑板。
  2. 有人愿意陪我玩滑板,但是天气下雨→我不会出去玩滑板
  3. 天气晴朗,但是没人陪我出去玩滑板→我可能去玩滑板也可能不会去
  4. 没人跟我玩滑板,天气下雨→我不会去玩滑板

由此可见天气原因比是否有人陪我去玩滑板更重要,由此引入权重的概念

举一个简单的例子:y=wx+b

其中w就是权重,b就是偏置。

而在上述命题中,天气原因的权重大于是否有人陪我玩滑板。

而偏置就好像一个阈值,只有wx达到一定的阈值的时候我才会决定要出去玩滑板。

权重与偏置在神经网络中的作用

在提取特征的时候,我们会利用权重和偏置这一概念确定图像是否具有某一特征。

五.定义权重和偏置函数

先上代码

#权重
def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)
#偏置
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

输入shape,返回一个张量,且张量的值都是随机初始化的。

tf.truncated_normal为tensorflow的一个内置函数,他可以从阶段的正态分布中输出随机值,从而给权重设置一个随机值。

tf.constant(0.1, shape=shape)可以使偏置的初始值全部默认设置为0.1

tf.Variable:将权重和偏置的数据类型设置为Variable,这样在后面训练的时候,权重和偏置都会随着训练的进行而改变,最后达到一个最理想的数值。

你可能感兴趣的:(深度学习,tensorflow,人工智能,神经网络)