• 卷积神经网络(CNN)实现mnist手写数字识别


    活动地址:CSDN21天学习挑战赛

    首先来了解一下

    什么是TensorFlow ?

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。

    ​其命名来源于本身的原理,Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算。Tensorflow运行过程就是张量从图的一端流动到另一端的计算过程。张量从图中流过的直观图像是其取名为“TensorFlow”的原因。

    张量Tensor:在数学上,张量是N维向量,这意味着张量可以用来表示N维数据集。

    计算图(流, flow):流是指一个计算图或简单的一个图,图不能形成环路,图中的每个节点代表一个操作,如加法、减法等。每个操作都会导致新的张量形成。

    只要能够将计算表示成为一个数据流图,那么就可以使用TensorFlow。如这个图不就是个神经网络嘛,所以使用TensorFlow框架。 

    什么是Keras

    Keras是基于TensorFlow或者Theano框架下的深度学习库,是由纯python编写而成的高层神经网络API,也仅支持python开发。它是为了支持快速实践而对tensorflow或者Theano的再次封装,让我们可以不用关注过多的底层细节,能够把想法快速转换为结果。目前Keras已经被TensorFlow收录,添加到TensorFlow 中,成为其默认的框架,成为TensorFlow官方的高级API。

    tf.keras和keras的联系

    基于同一套API,但是因为tf.keras中比keras多出了一点特殊的功能,所以可以轻松的将keras程序迁移到tf.keras中,但是tf.keras中的代码并不是全能移动到keras中运行。

    规范是相同的,模型导出的格式也是相同的。

     keras.layers模块

    TensorFlowlayers模块提供用于深度学习的更高层次封装的API,利用它可以轻松地构建模型。tf.layers模块提供的方法有:

    方法说明
    Input用于实例化一个输入Tensor,作为神经网络的输入
    average_pooling1d一维平均池化层
    average_pooling2d二维平均池化层
    average_pooling3d三维平均池化层
    batch_normalization批量标准化层
    conv1d一维卷积层
    conv2d二维卷积层
    conv2d_transpose二维反卷积层
    conv3d三维卷积层
    conv3d_transpose三维反卷积层
    dense全连接层
    dropoutDropout
    flattenFlatten层,把一个Tensor展平
    max_pooling1d一维最大池化层
    max_pooling2d二维最大池化层
    max_pooling3d三维最大池化层
    separable_conv2d二维深度可分离卷积层

     参数介绍: TensorFlow之神经网络layers模块详解_Never-Giveup的博客-CSDN博客_神经网络layer

     Keras.moleds.Sequential模型

    Sequential 模型结构: 层(layers)的线性堆栈。简单来说,它是一个简单的线性结构,没有多余分支,是多个网络层的堆叠。

    • 其中,Dense是一个全连接层,它的激活函数默认为是linear线性函数
    • 激活函数可以通过 单独的激活层 实现,也可以通过 构建层时传递activation实现

     一、读取数据

    Keras提供了数据集加载函数

    1. import tensorflow as tf
    2. from tensorflow.keras import datasets, layers, models
    3. import matplotlib.pyplot as plt
    4. import numpy as np
    5. (train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

     查看数据维度

    1. train_images.shape
    2. test_images.shape
    3. train_labels.shape
    4. test_labels.shape
    5. '''
    6. ((60000, 28, 28), (10000, 28, 28), (60000,), (10000,))
    7. '''

     可以看到训练集有60000个28*28的图片,60000个标签,测试集有10000个28*28的图片,10000个标签。

    plt.imshow(train_images[0])

     查看一下图片是一张图片

    train_images[0]

     查看一下其取值

     查看其最大取值为多少

    1. print(np.max(train_images))
    2. print(np.min(train_images))
    3. #255
    4. #0

     那么其取值范围是[0 , 255]之间。

    二、数据预处理

    1、在数据预处理时,首先采用reshape函数将每个图像矩阵扁平化成一个向量:

    1. #调整数据到我们需要的格式
    2. train_images = train_images.reshape((60000, 28, 28, 1))
    3. test_images = test_images.reshape((10000, 28, 28, 1))
    4. train_images.shape,test_images.shape,train_labels.shape,test_labels.shape
    5. """
    6. 输出:((60000, 28, 28, 1), (10000, 28, 28, 1), (60000,), (10000,))
    7. """

    2、数据归一化,将输入值[0,255]归一化为[0,1]的取值范围:

    1. # 将像素的值标准化至0到1的区间内。
    2. train_images, test_images = train_images / 255.0, test_images / 255.0

    3、数据可视化

    1. plt.figure(figsize=(20,10))
    2. for i in range(20):
    3. plt.subplot(5,10,i+1)
    4. plt.xticks([])
    5. plt.yticks([])
    6. plt.grid(False)
    7. plt.imshow(train_images[i], cmap=plt.cm.binary)
    8. plt.xlabel(train_labels[i])
    9. plt.show()

    三、构建CNN神经网络模型

    1. model = models.Sequential([
    2. layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),#卷积层1,卷积核3*3
    3. layers.MaxPooling2D((2, 2)), #池化层1,2*2采样
    4. layers.Conv2D(64, (3, 3), activation='relu'), #卷积层2,卷积核3*3
    5. layers.MaxPooling2D((2, 2)), #池化层2,2*2采样
    6. layers.Flatten(), #Flatten层,连接卷积层与全连接层
    7. layers.Dense(64, activation='relu'), #全连接层,特征进一步提取
    8. layers.Dense(10) #输出层,输出预期结果
    9. ])
    10. # 打印网络结构
    11. model.summary()

     四、确定学习的目标

    1. model.compile(optimizer='adam',
    2. loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    3. metrics=['accuracy'])

    compile函数设置了学习的目标,其中:

    loss:定义了损失函数,

    optimizer:指定了优化算法,

    metrics:是评价指标

    五:模型训练

    这里设置输入训练数据集(图片及标签)、验证数据集(图片及标签)以及迭代次数epochs

    1. history = model.fit(train_images, train_labels, epochs=10,
    2. validation_data=(test_images, test_labels))

    六、模型评估

    调用evaluate函数对测试集进行评估,返回数组score,其中第一维是模型的损失值,第二维是模型评估的精度。

    1. score= model.evaluate(test_images,test_labels)
    2. print("Test loss:",score[0])
    3. print("Test accuracy:",score[1])

    七、模型的预测

    输出第一张测试集的预测结果

    1. plt.imshow(test_images[1])
    2. pre = model.predict(test_images) # 对所有测试图片进行预测
    3. pre[1] # 输出第一张图片的预测结果

    可以看到在第三个位置的值最大,所以预测的是2

    得到预测结果:

    1. np.argmax([pre[1]])
    2. #2

     查看标签

    1. test_labels[1]
    2. #2

    预测正确

    大家注意收看

    >- 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/k-vYaC8l7uxX51WoypLkTw) 中的学习记录博客
    >- 参考文章地址: 深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别 | 第1天_K同学啊的博客-CSDN博客)

  • 相关阅读:
    JavaWeb的Servlet项目导入Eclipse以及配置Mysql等通用教程
    手机也可以搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站【cpolar实现公网访问】
    作用域,基本数据类型(常量const),转义字符,单引号与双引号,运算符
    Fragment切换的方式介绍和一些问题的解决
    net基于asp.net的二手商品的交易系统-二手网站-计算机毕业设计
    Nginx服务之监控模块vts
    物联网和互联网医院小程序:如何实现医疗设备的远程监测和管理?
    cvxpy: Python优化库
    VoLTE基础自学系列 | VoLTE呼叫流程之VoLTE打VoLTE,主被叫接入域为LTE
    Go的优雅退出
  • 原文地址:https://blog.csdn.net/qq_21402983/article/details/126157581