【深度学习】实验14 使用CNN完成MNIST手写体识别(TensorFlow)

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
简介: 【深度学习】实验14 使用CNN完成MNIST手写体识别(TensorFlow)

使用CNN完成MNIST手写体识别(TensorFlow)

CNN(Convolutional Neural Network,卷积神经网络)是一种比较常见的神经网络模型,它通常被用于图像识别、语音识别等领域。相比于传统的神经网络模型,CNN在处理图像等数据方面有明显的优势,其核心思想是通过卷积、池化等操作提取出图像中的特征,从而实现图像识别等任务。


CNN的基本结构由卷积层(Convolutional Layer)、池化层(Pooling Layer)、全连接层(Fully Connected Layer)等组成。其中,卷积层是CNN最核心的部分,它通过卷积核对输入的图像进行特征提取。每个卷积核都是一个小的矩阵,可以看做是一种特定的滤波器,卷积核在输入的图像上滑动,将每个位置的像素值与卷积核中对应位置的权重做乘积之和,最终得到一个新的特征图。通过多次卷积操作,可以逐步提取出图像中的高级特征。


在卷积层之后通常会添加一个池化层,将特征图进行降维处理。常见的池化方式有最大池化和平均池化两种,最大池化会取出输入的特定区域中的最大值作为池化后的值,而平均池化则是取输入区域的平均值作为池化后的值。通过池化操作,可以减少特征图的维度,降低计算复杂度,同时还可以提高模型的鲁棒性,避免因输入数据中的一些细节变化而影响模型的输出结果。


最后,全连接层将卷积和池化后得到的特征图转化成一个一维向量,通过多个全连接层的组合可以实现复杂的图像分类、目标检测等任务。在训练CNN时,通常会使用反向传播算法(Backpropagation)对网络中的参数进行优化,通过反向传播算法可以计算出损失函数对各个参数的梯度,从而进行参数更新。


总的来说,CNN是一种十分有效的神经网络模型,在图像处理等领域有着广泛的应用。不过,对于初学者而言,搭建和训练一个CNN模型需要比较高的数学和编程技能,需要有一定的基础才能掌握。

1. 导入TensorFlow库

# Tensorflow提供了一个类来处理MNIST数据
# 导入相关库
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
import time
import warnings
warnings.filterwarnings('ignore')

2. 数据集

# 载入数据集
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
mnist
   WARNING:tensorflow:From <ipython-input-2-574fb576d2f2>:2: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
   Instructions for updating:
   Please use alternatives such as official/mnist/dataset.py from tensorflow/models.
   WARNING:tensorflow:From /home/nlp/anaconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.
   Instructions for updating:
   Please write your own downloading logic.
   WARNING:tensorflow:From /home/nlp/anaconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
   Instructions for updating:
   Please use tf.data to implement this functionality.
   Extracting MNIST_data/train-images-idx3-ubyte.gz
   WARNING:tensorflow:From /home/nlp/anaconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
   Instructions for updating:
   Please use tf.data to implement this functionality.
   Extracting MNIST_data/train-labels-idx1-ubyte.gz
   WARNING:tensorflow:From /home/nlp/anaconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
   Instructions for updating:
   Please use tf.one_hot on tensors.
   Extracting MNIST_data/t10k-images-idx3-ubyte.gz
   Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
   WARNING:tensorflow:From /home/nlp/anaconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
   Instructions for updating:
   Please use alternatives such as official/mnist/dataset.py from tensorflow/models.
   Datasets(train=<tensorflow.contrib.learn.python.learn.datasets.mnist.DataSet object at 0x7f05f902e2b0>, validation=<tensorflow.contrib.learn.python.learn.datasets.mnist.DataSet object at 0x7f05f902e358>, test=<tensorflow.contrib.learn.python.learn.datasets.mnist.DataSet object at 0x7f05f902e320>)


# 设置批次大小
batch_size = 50
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size
n_batch
1100
# 定义初始化权值函数
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)
"""
strides=[b,h,w,c]
b表示在样本上的步长默认为1,也就是每一个样本都会进行运算。
h表示在高度上的默认移动步长为1,这个可以自己设定,根据网络的结构合理调节。
w表示在宽度上的默认移动步长为1,这个同上可以自己设定。
c表示在通道上的默认移动步长为1,这个表示每一个通道都会进行运算
"""
# 卷积层
def conv2d(input, filter):
    return tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')
"""
ksize=[b,h,w,c],通常为[1,2,2,1]
b表示在样本上的步长默认为1,也就是每一个样本都会进行运算。
h表示在高度上的默认移动步长为1,这个可以自己设定,根据网络的结构合理调节。
w表示在宽度上的默认移动步长为1,这个同上可以自己设定。
c表示在通道上的默认移动步长为1,这个表示每一个通道都会进行运算
"""
# 池化层
def max_pool_2x2(value):
    return tf.nn.max_pool(value, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
# 输入层
# 定义两个placeholder
x = tf.placeholder(tf.float32, [None, 784]) # 28*28
y = tf.placeholder(tf.float32, [None, 10])
# 改变x的格式转为4维的向量[batch,in_hight,in_width,in_channels]
x_image = tf.reshape(x, [-1, 28, 28, 1])

3. 卷积、激励、池化操作

# 初始化第一个卷积层的权值和偏置
# MNIST使用的是灰度图像,每个像素点只需要一个数值,因此这里通道数为1
# 5*5的采样窗口,32个卷积核从1个平面抽取特征
w_conv1 = weight_variable([5, 5, 1, 32])
# 每一个卷积核一个偏置值
b_conv1 = bias_variable([32])
# 把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1)
# 进行max_pooling 池化层 14*14*32
h_pool1 = max_pool_2x2(h_conv1)
# 初始化第二个卷积层的权值和偏置
# 5*5的采样窗口,64个卷积核从32个平面抽取特征
w_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
# 把第一个池化层结果和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)
# 池化层 7*7*64
h_pool2 = max_pool_2x2(h_conv2)  

28x28的图片第一次卷积后还是28x28,第一次池化后变为14x14

第二次卷积后为14x14,第二次池化后变为了7x7

经过上面操作后得到64张7x7的平面

4. 全连接层

# 初始化第一个全连接层的权值
# 经过池化层后有7*7*64个神经元,全连接层有128个神经元
w_fc1 = weight_variable([7 * 7 * 64, 128])
# 128个节点
b_fc1 = bias_variable([128])
# 把池化层2的输出扁平化为1维
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
# 求第一个全连接层的输出
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)
h_pool2_flat.shape, h_fc1.shape
(TensorShape([Dimension(None), Dimension(3136)]),
 TensorShape([Dimension(None), Dimension(128)]))
# keep_prob: float类型,每个元素被保留下来的概率,设置神经元被选中的概率,在初始化时keep_prob是一个占位符
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
WARNING:tensorflow:From <ipython-input-14-a22383db216d>:3: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.
Instructions for updating:
Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
# 初始化第二个全连接层
W_fc2 = weight_variable([128, 10])
b_fc2 = bias_variable([10])

5. 输出层

# 计算输出
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
# 交叉熵代价函数
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=prediction))
# 使用AdamOptimizer进行优化
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# 结果存放在一个布尔列表中(argmax函数返回一维张量中最大的值所在的位置)
correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
# 求准确率(tf.cast将布尔值转换为float型)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
WARNING:tensorflow:From <ipython-input-17-ef3c12a7f7c4>:2: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Future major versions of TensorFlow will allow gradients to flow
into the labels input on backprop by default.
See `tf.nn.softmax_cross_entropy_with_logits_v2`.

6. 训练模型

# 创建会话
with tf.Session() as sess:
    start_time = time.clock()
    # 初始化变量
    sess.run(tf.global_variables_initializer()) 
    print('开始训练 ----------')
    # 训练10次
    for epoch in range(10):
        print("Test" + str(epoch) + " :")
        for batch in range(n_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            # 进行迭代训练
            sess.run(train_step, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 0.7})  
            print('第' + str(batch) + '批训练')
        # 测试数据计算出准确率
        acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0})
        print('Iter' + str(epoch) + ',Testing Accuracy=' + str(acc))
    end_time = time.clock()
    # 输出运行时间
    print('Running time:%s Second' % (end_time - start_time)) 
开始训练 ----------
Test0 :
第0批训练
第1批训练
第2批训练
第3批训练
第4批训练
第5批训练
第6批训练
第7批训练
第8批训练
第9批训练
第10批训练
第11批训练
第12批训练
第13批训练
第14批训练
第15批训练
第16批训练
第17批训练
第18批训练
第19批训练
第20批训练
第21批训练
第22批训练
第23批训练
第24批训练
第25批训练
第26批训练
第27批训练
第28批训练
第29批训练
第30批训练
第31批训练
第32批训练
第33批训练
第34批训练
第35批训练
第36批训练
第37批训练
第38批训练
第39批训练
第40批训练
第41批训练
第42批训练
第43批训练
第44批训练
第45批训练
第46批训练
第47批训练
第48批训练
第49批训练
第50批训练
第51批训练
第52批训练
第53批训练
第54批训练
第55批训练
第56批训练
第57批训练
第58批训练
第59批训练
第60批训练
第61批训练
第62批训练
第63批训练
第64批训练
第65批训练
……


目录
相关文章
|
15天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
60 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
14天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
43 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
22天前
|
机器学习/深度学习 供应链 TensorFlow
深度学习实战营:TensorFlow+Python,打造你的数据驱动决策引擎
【9月更文挑战第13天】在数据爆炸时代,企业日益依赖精准分析进行决策。深度学习凭借其卓越的特征提取与模式识别能力,成为构建数据驱动决策引擎的关键技术。本项目通过TensorFlow和Python,利用LSTM构建零售业销量预测模型,优化库存管理和营销策略。首先确保安装TensorFlow,然后使用Keras API搭建模型,并通过训练、评估和部署流程,展示深度学习在数据驱动决策中的强大应用潜力,助力企业提升经营效率。
32 3
|
25天前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
16天前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
38 0
|
25天前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
44 0
|
2月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
44 0
|
2月前
|
测试技术 数据库
探索JSF单元测试秘籍!如何让您的应用更稳固、更高效?揭秘成功背后的测试之道!
【8月更文挑战第31天】在 JavaServer Faces(JSF)应用开发中,确保代码质量和可维护性至关重要。本文详细介绍了如何通过单元测试实现这一目标。首先,阐述了单元测试的重要性及其对应用稳定性的影响;其次,提出了提高 JSF 应用可测试性的设计建议,如避免直接访问外部资源和使用依赖注入;最后,通过一个具体的 `UserBean` 示例,展示了如何利用 JUnit 和 Mockito 框架编写有效的单元测试。通过这些方法,不仅能够确保代码质量,还能提高开发效率和降低维护成本。
43 0
|
2月前
|
UED 开发者
哇塞!Uno Platform 数据绑定超全技巧大揭秘!从基础绑定到高级转换,优化性能让你的开发如虎添翼
【8月更文挑战第31天】在开发过程中,数据绑定是连接数据模型与用户界面的关键环节,可实现数据自动更新。Uno Platform 提供了简洁高效的数据绑定方式,使属性变化时 UI 自动同步更新。通过示例展示了基本绑定方法及使用 `Converter` 转换数据的高级技巧,如将年龄转换为格式化字符串。此外,还可利用 `BindingMode.OneTime` 提升性能。掌握这些技巧能显著提高开发效率并优化用户体验。
44 0
|
2月前
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
27 0

热门文章

最新文章

下一篇
无影云桌面