zoukankan      html  css  js  c++  java
  • TensorFlow 卷积神经网络手写数字识别数据集介绍

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习、深度学习的知识!

    手写数字识别

    接下来将会以 MNIST 数据集为例,使用卷积层和池化层,实现一个卷积神经网络来进行手写数字识别,并输出卷积和池化效果。

    数据准备

    • MNIST 数据集下载

    MNIST 数据集可以从 THE MNIST DATABASE of handwritten digits 的网站直接下载。
    网址:http://yann.lecun.com/exdb/mnist/

    train-images-idx3-ubyte.gz: 训练集图片
    train-labels-idx1-ubyte.gz: 训练集列标
    t10k-images-idx3-ubyte.gz: 测试集图片
    t10k-labels-idx1-ubyte.gz: 测试集列标

    TensorFlow 有加载 MNIST 数据库相关的模块,可以在程序运行时直接加载。

    代码如下:

    from tensorflow.examples.tutorials.mnist import input_data
    import matplotlib.pyplot as pyplot
    
    #引入 MNIST 数据集
    mnist = input_data.read_data_sets("/tmp/data/", one_hot=False)
    
    #选取训练集中的第 1 个图像的矩阵
    mnist_one=mnist.train.images[0]
    
    #输出图片的维度,结果是:(784,)
    print(mnist_one.shape)
    
    #因为原始的数据是长度是 784 向量,需要转换成 28*28 的矩阵。
    mnist_one_image=mnist_one.reshape((28,28))
    
    #输出矩阵的维度
    print(mnist_one_image.shape)
    
    #使用 matplotlib 输出为图片
    pyplot.imshow(mnist_one_image)
    
    pyplot.show()

    代码的输出依次是:
    1.单个手写数字图片的维度:
    (784,)

    2.转化为二维矩阵之后的打印结果:
    (28, 28)

    3.使用 matplotlib 输出为图片

    模型实现

    TensorFlow conv2d 函数介绍:

    tf.nn.conv2d(x, W, strides, padding=’SAME’)
    针对输入的 4 维数据 x 计算 2 维卷积。

    参数 x:
    4 维张量,每一个维度分别是 batch,in_height,in_height,in_channels。
    [batch, in_height, in_width, in_channels]

    灰度图像只有 2 维来表示每一个像素的值,彩色图像每一个像素点有 3 通道的 RGB 值,所以一个彩色图片转化成张量后是 3 维的,分别是长度,宽度,颜色通道数。又因为每一次训练都是训练都是输入很多张图片,所以,多个 3 维张量组合在一起变成了 4 维张量。

    参数 w:
    过滤器,因为是二维卷积,所以它的维度是:

    [filter_height, filter_width, in_channels, out_channels]

    与参数 x 对应,前 3 个参数分别是对应 x 的 filter_height, filter_width, in_channels,最后一个参数是过滤器的输出通道数量。

    参数 strides:
    1 维长度为 4 的张量,对应参数 x 的 4 个维度上的步长。

    参数 padding:
    边缘填充方式,主要是 “SAME”, “VALID”,一般使用 “SAME”。

    卷积层简单封装
    # 池化操作
    def conv2d(x, W, b, strides=1):
    # Conv2D wrapper, with bias and relu activation
    x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
    x = tf.nn.bias_add(x, b)
    return tf.nn.relu(x)
    TensorFlow max_pool 函数介绍:

    tf.nn.max_pool(x, ksize, strides ,padding)

    参数 x:
    和 conv2d 的参数 x 相同,是一个 4 维张量,每一个维度分别代表 batch,in_height,in_height,in_channels。

    参数 ksize:
    池化核的大小,是一个 1 维长度为 4 的张量,对应参数 x 的 4 个维度上的池化大小。

    参数 strides:
    1 维长度为 4 的张量,对应参数 x 的 4 个维度上的步长。

    参数 padding:
    边缘填充方式,主要是 “SAME”, “VALID”,一般使用 “SAME”。

    接下来将会使用 TensorFlow 实现以下结构的卷积神经网络:

    下一篇文章,将会用 TensorFlow 实现这个卷积神经网络。

    本篇文章出自http://www.tensorflownews.com,对深度学习感兴趣,热爱Tensorflow的小伙伴,欢迎关注我们的网站!

  • 相关阅读:
    Linux systemd & init.d
    windows 气泡提示
    C++17新特性
    Lua & C++
    C++智能指针原理
    C++ Memory Order
    析命令提示符的原理
    设置与获取系统代理信息
    命令查看系统信息
    Linux shell脚本
  • 原文地址:https://www.cnblogs.com/panchuangai/p/12568257.html
Copyright © 2011-2022 走看看