热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Python实现的卷积神经网络分类MNIST数据集

而深度本身是卷积神经网络的一个超参数,在数值上等于使用的滤波器的数量,而每个滤波器是不一样的,在输入数据中寻找的特征。对于图像数据,因为像素的数量过多,全连接神经网络需要非常多的的

卷积神经网络分类MNIST数据集
目录
人工智能第七次实验报告 1
卷积神经网络分类MNIST数据集 1
一 、问题背景 1
1.1 卷积和卷积核 1
1.2 卷积神经网络简介 2
1.3 卷积神经网络的细节讨论 3
二 、实现说明 3
2.1 构建神经网络模型 3



  1. 为输入输出分配占位符 3

  2. 构建卷积层和池化层 4

  3. 构建全连接层 5

  4. 动态调整网络参数 6
    2.2 运行模型 6
    三 、程序测试 7
    3.1 运行说明 7
    3.2 运行输出 7
    3.3 对比BP神经网络 8
    四 、实验总结 8
    1.2卷积神经网络简介
    卷积神经网络(CNN,Convolutional Neural Network)是一个多层的神经网络,每层由多个二维平面组成,每个平面由多个独立神经元组成。卷积神经网络中C层和S层,C层为特征提取层,也称为卷 积层,是卷积神经网络的核心,S层位特征映射层,也称为下采样层。

在卷积层,卷积神经网络利用卷积核对图像进行滤波,可以得到显著的边缘特性。在卷积神经网络 中,每一个就卷积层都紧跟着一个下采样层,卷积层负责探测上一层特征的局部连接,下采样层负责把 相似的特征合并起来。下采样层合并相似特征的过程降低了特征图的空间分辨率,达到了数据降维的效 果。
在卷积神经网络中,输入矩阵通过卷积过程形成卷积层,卷积结果在通过下采样过程形成规模减小 的特征映射矩阵。卷积过程用一个可训练的滤波器去卷积一个输入特征矩阵,加上一个偏置后得到卷积 层。下采样过程将邻域内若干的像素通过池化操作变为一个像素,经过加权和增加偏置后,通过一个激 活函数,产生一个缩小的特征映射图。
一般卷积神经网络除了卷积层和下采样层之外,还会在输出段加入全连接层,全连接层的输入就是 每一个深度最终特征提取的结果,全连接神经网络最后再对这些结果进行分类。
1.3卷积神经网络的细节讨论
神经元的空间排列:
与常规神经网络不同,卷积神经网络的各层中的神经元是三维排列的:宽度、高度和深度。宽 度和高度与特征图的宽高一一对应。
而深度本身是卷积神经网络的一个超参数,在数值上等于使用的滤波器的数量,而每个滤波器 是不一样的,在输入数据中寻找的特征。本文转载自http://www.biyezuopin.vip/onews.asp?id=16722从上一张卷积神经网络图上可以看到,卷积神经网络结构 的最后部分将会把全尺寸的图像压缩为包含分类评分的一个向量,向量是在深度方向排列的。
局部连接:
与局部连接相反的是全局连接,对应到一个全连接的神经网络。对于图像数据,因为像素的数 量过多,全连接神经网络需要非常多的的参数,这对于算法效率是难以接受的,故使用局部连接的 思路:每个神经元只对局部进行感知,即层中的神经元将只与前一层中的一小块区域连接,然后再 更高层汇总来得到全局信息。
局部连接的空间大小叫做神经元的感受野,感受野的大小与滤波器的空间尺寸相等。权值共享:
每个神经元参数设为相同,即权值共享,也即在同一深度上,每个神经元用同一个卷积核去卷 积图像。
池化:
计算图像一个区域上的某个特定特征的平均值(或最大值),这种聚合操作就叫做池化 (平均池化/最大池化)。使用池化可以很好的实现数据降维并防止过度拟合。
通常在连续的卷积层之间会周期性地插入一个池化层。它的作用是逐渐降低数据体的空间尺 寸,这样的话就能减少网络中参数的数量。汇聚层使用最大池化操作,对输入数据体的每一个深度 切片独立进行操作,改变它的空间尺寸。最常见的形式是汇聚层使用尺寸2×2的滤波器,以步长为2 来对每个深度切片进行降采样,将其中75%的激活信息都丢掉。
二 、实现说明
2.1构建神经网络模型
所构建的网络模型:卷积层 + 池化层 + 卷积层 + 池化层 + 全连接层 + 全连接层

from matplotlib import pyplot as plt
import tensorflow as tf
import datetime
from tensorflow.examples.tutorials.mnist import input_data
def weight_variable(shape): # 权重正态分布初始化
initial = tf.truncated_normal(shape, stddev=0.1) # shape表示生成张量的维度,mean是均值,stddev是标准差
return tf.Variable(initial)
def bias_variable(shape): # 偏置量初始化
initial = tf.constant(0.1, shape=shape) # value=0.1,shape是生成的维度
return tf.Variable(initial)
def conv2d(x, W): # 定义2维的卷积图层
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
# strides:每跨多少步抽取信息,strides[1, x_movement,y_movement, 1], [0]和strides[3]必须为1
# padding:边距处理,“SAME”表示输出图层和输入图层大小保持不变,设置为“VALID”时表示舍弃多余边距(丢失信息)
def max_pool(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
# ksize 池化窗口的大小一般是[1, height, width, 1],所以这两个维度设为了1
# strides 和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]
if __name__ == '__main__':
x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])
keep_prob = tf.placeholder(tf.float32)
# 创建神经网络第1层,输入层,激活函数为relu
W_layer1 = weight_variable([784, 500])
b_layer1 = bias_variable([500])
h1 = tf.add(tf.matmul(x, W_layer1), b_layer1)
h1 = tf.nn.relu(h1)
# 创建神经网络第2层,隐藏层,激活函数为relu
W_layer2 = weight_variable([500, 1000])
b_layer2 = bias_variable([1000])
h2 = tf.add(tf.matmul(h1, W_layer2), b_layer2)
h2 = tf.nn.relu(h2)
# 创建神经网络第3层,隐藏层,激活函数为relu
W_layer3 = weight_variable([1000, 300])
b_layer3 = bias_variable([300])
h3 = tf.add(tf.matmul(h2, W_layer3), b_layer3)
h3 = tf.nn.relu(h3)
# 创建神经网络第4层,输出层,激活函数为softmax
W_layer4 = weight_variable([300, 10])
b_layer4 = bias_variable([10])
predict = tf.add(tf.matmul(h3, W_layer4), b_layer4)
y_conv = tf.nn.softmax(tf.matmul(h3, W_layer4) + b_layer4)
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=predict, labels=y))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))
i_list2 = []
train_error2 = []
test_acc2 = []
with tf.Session() as sess2:
sess2.run(tf.global_variables_initializer()) # 初始化变量
starttime = datetime.datetime.now()
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
for i in range(1000):
batch = mnist.train.next_batch(100)
if i % 50 == 0:
cross_entropy_now = sess2.run(cross_entropy, feed_dict={x: batch[0], y: batch[1], keep_prob: 1})
print('step %d, training error %g' % (i, cross_entropy_now))
res = accuracy.eval(session=sess2,
feed_dict={x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0})
print('test accuracy %g' % res)
if i != 0:
i_list2.append(i)
train_error2.append(cross_entropy_now)
test_acc2.append(res)
sess2.run(train_step, feed_dict={x: batch[0], y: batch[1], keep_prob: 0.8})
endtime = datetime.datetime.now()
print('Cost: ' + str(endtime - starttime))
x = tf.placeholder(tf.float32, [None, 784])
# 输入数据 None表示行不定
x_image = tf.reshape(x, [-1, 28, 28, 1])
# 将原图reshape为4维,-1表示数据是黑白的,28*28=784,1表示颜色通道数目
y = tf.placeholder(tf.float32, [None, 10])
W_conv1 = weight_variable([5, 5, 1, 32])
# 按照[5,5,输入通道=1,输出通道=32]生成一组随机变量
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
# 输出size 28*28*32(因为conv2d()中x和y步长都为1,边距保持不变)
h_pool1 = max_pool(h_conv1)
# 把h_pool1的厚度由32增加到64,长宽由14*14缩小为7*7
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool(h_conv2)
# 第一层全连接
# 把h_pool2由7*7*64,变成1024*1
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
# 把pooling后的结构reshape为一维向量
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
# 第二层全连接
# 按照keep_prob的概率扔掉一些,为了减少过拟合
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
predict = tf.add(tf.matmul(h_fc1_drop, W_fc2), b_fc2)
y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=predict, labels=y)) # 计算误差
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) # 通过使用动量(参数的移动平均数)来改善传统梯度下降,促进超参数动态调整
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y, 1)) # 找出预测正确的标签
accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float')) # 得出通过正确个数除以总数得出准确率
i_list = []
train_error = []
test_acc = []
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 初始化变量
starttime = datetime.datetime.now()
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
for i in range(1000):
batch = mnist.train.next_batch(100)
if i % 50 == 0:
cross_entropy_now = sess.run(cross_entropy, feed_dict={x: batch[0], y: batch[1], keep_prob: 1})
print('step %d, training error %g' % (i, cross_entropy_now))
res = accuracy.eval(session=sess,
feed_dict={x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0})
print('test accuracy %g' % res)
if i != 0:
i_list.append(i)
train_error.append(cross_entropy_now)
test_acc.append(res)
sess.run(train_step, feed_dict={x: batch[0], y: batch[1], keep_prob: 0.8})
endtime = datetime.datetime.now()
print('Cost: ' + str(endtime - starttime))
ax1 = plt.subplot(121)
ax1.plot(i_list, test_acc, 'b', label="CNN")
ax1.plot(i_list, test_acc2, 'g', label="BP")
ax1.set_title("test accuracy")
plt.legend()
ax2 = plt.subplot(122)
ax2.set_title("training error")
ax2.plot(i_list, train_error, 'b', label="CNN")
ax2.plot(i_list, train_error2, 'g', label="BP")
plt.legend()
plt.show()










推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
author-avatar
年少不轻易谈情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有