美文网首页我爱编程
[机器学习]Tensorflow实践:CNN程序测试mnist数

[机器学习]Tensorflow实践:CNN程序测试mnist数

作者: CJJShare | 来源:发表于2017-10-22 22:32 被阅读0次

    MNIST机器学习入门

    参考:http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html

    MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片,它也包含每一张图片对应的标签,告诉我们这个是数字几。

    一、Softmax Regression

    从一个很简单的数学模型开始--Softmax Regression--介绍下如何使用TensorFlow

    softmax模型:可以用来给不同的对象分配概率

    softmax回归模型 向量表示法

    解释:

    1.得到一张给定图片属于某个特定数字类的证据(evidence):

    如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数

    对于给定的输入图片x它代表的是数字i的证据可以表示为:

    图片像素值进行加权求和

    其中W 代表权重,bi代表数字 i 类的偏置量,j 代表给定图片 x 的像素索引用于像素求和。

    2.用softmax函数可以把这些证据转换成概率 y:

    softmax函数

    实现回归模型:

    为了用python实现高效的数值计算,我们通常会使用函数库,比如NumPy,会把类似矩阵乘法这样的复杂运算使用其他外部语言实现。but,从外部计算切换回Python的每一个操作,仍然是一个很大的开销。so,TensorFlow也把复杂的计算放在python之外完成,但Tensorflow不单独地运行单一的复杂计算,而是让我们可以先用图描述一系列可交互的计算操作,然后全部一起在Python之外运行。

    这就是为什么tensorflow使用session来运行会话?

    因为python会使用一些非python实现的库比如numpy,如果每个操作和数据都做内外交换代价太大,所以把所有操作描述为图,把整个操作图打包放入session,作为一个整体做内外交换,这样就能避免频繁的内外交换带来的性能损失。

    #coding=utf-8  中文注释

    import tensorflow as tf 

     #使用tensorflow之前,先导入它

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

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

    b = tf.Variable(tf.zeros([10]))

    “““x不是一个特定的值,而是一个占位符placeholder,我们在TensorFlow运行计算时输入这个值。我们希望能够输入任意数量的MNIST图像,每一张图展平成784维的向量。我们用2维的浮点数张量来表示这些图,这个张量的形状是[None,784 ]。(这里的None表示此张量的第一个维度可以是任何长度的。) ”””

    “““赋予tf.Variable不同的初值来创建不同的Variable:在这里,我们都用全为0的张量来初始化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”””

    y_ = tf.placeholder("float", [None,10])

    “““ 因为要计算交叉熵,所以又有计算公式,所以又要定义输入变量-占位符”””

    cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

    “““计算交叉熵:首先,用 tf.log 计算 y 的每个元素的对数。接下来,我们把 y_ 的每一个元素和 tf.log(y) 的对应元素相乘。最后,用 tf.reduce_sum 计算张量的所有元素的总和。(注意,这里的交叉熵不仅仅用来衡量单一的一对预测和真实值,而是所有100幅图片的交叉熵的总和。对于100个数据点的预测表现比单一数据点的表现能更好地描述我们的模型的性能。 ”””

    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

    “““在这里要求TensorFlow用梯度下降算法(gradient descent algorithm)以0.01的学习速率最小化交叉熵。梯度下降算法(gradient descent algorithm)是一个简单的学习过程,TensorFlow只需将每个变量一点点地往使成本不断降低的方向移动。TensorFlow也提供了其他许多优化算法 。TensorFlow在这里实际上所做的是,它会在后台给描述你的计算的那张图里面增加一系列新的计算操作单元用于实现反向传播算法和梯度下降算法。然后,它返回给你的只是一个单一的操作,当运行这个操作时,它用梯度下降算法训练你的模型,微调你的变量,不断减少成本。”””

    init = tf.initialize_all_variables()

    sess = tf.Session()

    sess.run(init)

    #在运行计算之前,我们需要添加一个操作来初始化我们创建的变量variables在声明时赋值了吗?

    #之前不是对variables初始化为0了吗?这一步有用吗?

    “““对variables的任何操作一定要用Session。”””

    for i in range(1000):

    batch_xs, batch_ys = mnist.train.next_batch(100)

    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

    “““ 该循环的每个步骤中,都会随机抓取训练数据中的100个批处理数据点,然后用这些数据点作为参数替换之前的占位符来运行train_step”””

    “““和前面的搭模型的代码不同,这里出现了run(),一旦tf开始run就说明有flow流过,此时variables全部有值了。而mnist.train.next_batch的参数是batchsize。返回值是下一批输入值和标签值。mnist自身带有函数next_batch,返回值就是下一批的数据与标签。”””

    “““使用一小部分的随机数据来进行训练被称为随机训练(stochastic training)- 在这里更确切的说是随机梯度下降训练。在理想情况下,我们希望用我们所有的数据来进行每一步的训练,因为这能给我们更好的训练结果,但显然这需要很大的计算开销。所以,每一次训练我们可以使用不同的数据子集,这样做既可以减少计算开销,又可以最大化地学习到数据集的总体特性。”””

    对于sess.run()函数的具体讲解还没找到好的内容

    #评估模型

    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

    “““tf.argmax是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值。由于标签向量是由0,1组成,因此最大值1所在的索引位置就是类别标签,比如tf.argmax(y,1)返回的是模型对于任一输入x预测到的标签值,而tf.argmax(y_,1)代表正确的标签,我们可以用tf.equal来检测我们的预测是否真实标签匹配(索引位置一样表示匹配) ”””

    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

    “““这行代码会给我们一组布尔值。为了确定正确预测项的比例,我们可以把布尔值转换成浮点数,然后取平均值。例如,[True, False, True, True]会变成[1,0,1,1],取平均值后得到0.75. ”””

    print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})

    #计算所学习到的模型在测试数据集上面的正确率

    “““ ”””

    准确率     ??

    自总结步骤:

    0.明确数学模型公式

    Tensorflow编程

    1.描述计算图(即定义计算模型公式)

    1.1定义计算模型中所需变量--模型公式中的输入placeholder+模型参数Variable

    (Variable:主要是用于训练参数之类的变量。比如我们经常使用的网络权重,偏置。Variable在声明是必须赋予初始值。在训练过程中该值很可能会进行不断的加减操作变化。

    placeholder:也是用于存储数据,但是主要用于feed_dict的配合,接收输入数据用于训练模型等。placeholder值在训练过程中会不断地被赋予新的值,用于批训练,基本上其值是不会轻易进行加减操作。placeholder在命名时是不需要赋初值,其被赋予值得时间实际在feed_dict时。

    参考:http://baijiahao.baidu.com/s?id=1577414740643614734&wfr=spider&for=pc)

    1.2实现模型--即定义出完整的计算公式

    2.训练模型准备

    2.1定义评估模型好坏的指标--损失函数

    常见的cost 函数--“交叉熵”

    交叉熵函数

    其中y 是我们预测的概率分布, y' 是实际的分布

    PS:一旦出现要使用的公式模型,就要利用【1描述计算图】中的实现流程将其实现

    所以,定义交叉熵公式中需要的变量+实现整个计算公式

    2.2选择优化算法

    因为TensorFlow拥有一张描述你各个计算单元的图,它可以自动地使用反向传播算法(backpropagation algorithm)来有效地确定你的变量是如何影响你想要最小化的那个成本值的。然后,TensorFlow会用你选择的优化算法来不断地修改变量以降低成本。

    常见:梯度下降算法

    2.3初始化所有参数

    init = tf.initialize_all_variables()

    #启动模型

    sess = tf.Session()

    sess.run(init)   ???

    3.训练模型

    for i in range(1000):

    batch_xs, batch_ys = mnist.train.next_batch(100)

    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

    4.评估模型

    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

    print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})

    参考:http://www.cnblogs.com/manziluo/p/5789692.html

    二、CNN卷积神经网络

    什么是CNN?

    图像识别领域主要使用CNN

    相关文章

      网友评论

        本文标题:[机器学习]Tensorflow实践:CNN程序测试mnist数

        本文链接:https://www.haomeiwen.com/subject/rqaguxtx.html