Tensorflow入门(MNIST学习)

xiaoxiao2021-02-28  10

MNIST是一个入门级的计算机视觉数据集,主要是进行图片数字识别。 现在用Softmax Regression去识别它。 MNIST数据集 import tensorflow.examples.tutorials.mnist.input_data mnist = input_data.read_data_sets(“MNIST_data/”, one_hot=True) 这个是时候遇到了两个错误,一个是: TensorFlow:NameError: name ‘input_data’ is not defined

解决方法,将代码替换为:

import tensorflow.examples.tutorials.mnist.input_data as input_data mnist = input_data.read_data_sets(“MNIST_data/”, one_hot=True) 下载成功

是四个压缩包

t10k-images-idx3-ubyte.gz train-images-idx3-ubyte.gz t10k-labels-idx1-ubyte.gz train-labels-idx1-ubyte.gz

我们首先需要认识一下数据集,数据被分为两组,一组是60000行的训练数据集,一组是10000行的测试数据集。这样的切分是为了有一组单独的测试数据集用来评估这个模型的性能,从而增强其范化能力。

一个MNIST的数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签。图片为’xs’,标签为’ys’。训练数据集和测试数据集都包含xs和ys。

这个地方训练数据集是:train-images.idx3-ubyte 标签是:train-labels.idx1-ubyte

注意这个地方,这些数据集都是不能被直接打开的,所以菜鸟还是不要乱抓瞎了,先往下看吧。

这个地方的每一张图片都是28*28个像素的,如何展开他们不重要,重要的是将每一张图片都采用相同的方式展开。

所以展开之后,所有的图片都变成了784维向量空间里的点,并且拥有比较复杂的结构。

展开图片会丢失图片中的二维结构,这不可取。不过我们只是学习这个模型的使用,后面据说会有更好的模型可以挖掘这些二维结构。 softmax不会用到这些二维结构信息。

所以在MNIST训练集中,图片集变成了[60000,784]的张量,每一个维度的数字用来索引图片。第二个维度用来索引每张图片中的像素点。而在这个张量中,每一个元素就是点位于0和1之间的像素值。 下面是MNIST的标签,这个标签意思很明确。就是为了表明图片中的数字是几,教程中使用了一种类型”one-hot vectors”。这个类型说的是,如果这个数字是几,那这个10维向量的第几个数字就是1,其余的全是0。比如2就是[0,0,1,0,0,0,0,0,0,0],现在标签集就变成了[60000,10].

认识Softmax回归 我们在判定一个数字是多少时,并不是使用是或不是,而是给出这张图片是每个数字的概率。这个案子对于softmax regression貌似挺经典的。softmax本身擅长的就是给不同的对象分配概率。以后训练更加精细模型的时候,softmax的这个特性也是能用上的。

softmax分两步:第一步 这个模型在判断一张图片是否是某个数字时,采取的是一种找证据(evidence)的机制。意思就是一张图片中某的像素点的值有很强的证据说明这是这张图片属于该类,那么就给一个正的权值,如果拥有的证据说明这个图片不属于该类,那么就给一个负的权值。 蓝色代表正权值,红色代表负权值。 我们也需要加入一个额外的偏置量(bias)毕竟输入图片中会带有一些干扰量。 其中的Wi代表权重,bi代表数字i类偏执,j代表给定图片x的像素引用于像素求和 然后,使用softmax模型:y=softmax(evidence),这里的softmax就是一个激励(activation)函数或者(link)函数,就是一个非线性化,把线性函数的输出转化为我们想要的格式,也就是关于10个数字类的概率分布。所以,给定一张图片,它对于每一个数字的吻合度可以被softmax函数转为为一个概率值,softmax函数可以定义为:softmax(x)=normalize(exp(x)) 展开等式右边可以得到: 不过用得多的还是前一种形式,把输入值当成幂指数求值,再正则化这些结果。 这个幂运算的意思是,更大的证据对应假设模型里更大的乘数权重值。反之成立。但假设模型的乘数权重值不可能是0或者负值。经softmax正则化后,它们的总和会变为1,以此构造一个有效的概率分布。 softmax模型图示: 如果写成一个等式: 当然也可以用向量来表示这个过程,这貌似也是一种更有效的思考方式: 也可以写成极简形式:y=softmax(Wx+b)

下面就可以来实现这个回归模型了: NumPy是一个高效的函数库,可以帮助我们来实现这个模型。不幸的是,从外部切回Python的每一个操作,仍然是一个很大的开销。如果用GPU进行外部计算,那还会花费更多的资源来传输数据。Tensorflow也把复杂的计算放在Python外完成,但是为了避免之前说的那些开销,它做了进一步的完善。Tensorflow不单独地运行单一的复杂计算,而是让我们先用图描述一系列可交互的计算操作,然后全部在Python外运行。 使用之前先导入:

import tensorflow as tf

通过操作符变量来描述这些可交互的操作单元:

x = tf.placeholder(tf.float32, [None, 784])

x不是一个特定的值,而是一个占位符placeholder,我们在TensorFlow运行计算时输入这个值。我们希望能够输入任意数量的MNIST图像,每一张图展平成784维的向量。我们用2维的浮点数张量来表示这些图,这个张量的形状是[None,784 ]。(这里的None表示此张量的第一个维度可以是任何长度的。) 我们的模型也需要权重值和偏置量,当然我们可以把它们当做是另外的输入(使用占位符),但TensorFlow有一个更好的方法来表示它们:Variable 。 一个Variable代表一个可修改的张量,存在在TensorFlow的用于描述交互性操作的图中。它们可以用于计算输入值,也可以在计算中被修改。对于各种机器学习应用,一般都会有模型参数,可以用Variable表示。

W = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10]))

我们赋予tf.Variable不同的初值来创建不同的Variable:在这里,我们都用全为零的张量来初始化W和b。因为我们要学习W和b的值,它们的初值可以随意设置。

注意,W的维度是[784,10],因为我们想要用784维的图片向量乘以它以得到一个10维的证据值向量,每一位对应不同数字类。b的形状是[10],所以我们可以直接把它加到输出上面。

现在,我们可以实现我们的模型啦。只需要一行代码!

y = tf.nn.softmax(tf.matmul(x,W) + b)

这个代码还是得解释一下,其中tf.matmul(X,W)表示的是x乘以W,对应之前等式里的Wx,而这里的x是一个二维张量,拥有多个输入。然后再加上b,把和输入到tf.nn.softmax函数里面。

其实到这里,关于模型的定义已经结束了,用过matlab的其实可以发现他们的套路还是很像的,都是写好一堆函数让我们调用,然而怎么调用,如何调用还是得学了,matlab不懂的百度,这个tensorflow应该也可以,下一节再来接着训练模型吧。

转载请注明原文地址: https://www.6miu.com/read-850139.html

最新回复(0)