from __future__ import division,print_function
import tensorflow as tf
import  matplotlib.pyplot as plt
import numpy as np
#导入mnist数据集
from tensorflow.examples.tutorials.mnist import  input_data
mnist = input_data.read_data_sets('MNIST_data/',one_hot=True)'''
设置batch_size等超参数
'''
learning_rate = 0.001
training_iters = 500
batch_size = 128
'''
display_step :控制报告的粒度
例如:若display_step = 2,则将每训练2个样本输出依次损失粒度,
与超参数不同,修改display_step 不会改变模型学习的规律通俗的说就是每隔10个训练样本打印输出一次
'''
display_step = 10
#网络参数
n_input = 784  #28*28
n_classes = 10
'''
dropout:意为抛弃,取值为0-1之间,表示隐藏层中的节点在每次迭代中
被遗弃的概率,通过在迭代中遗弃部分节点来使更多的节点都能取到比较是合适的值
'''
dropout = 0.85#声明占位符
'''
[None,n_input]中的None表示一维值
'''
x = tf.placeholder(tf.float32,[None,n_input])
y = tf.placeholder(tf.float32,[None,n_classes])
'''
keep-prob 是一个具体数字,上个示例
中它是 0.5,而本例中它是 0.8,它表示保留某个隐藏单元的概率,
此处 keep-prob 等于 0.8,
它意味着消除任意一个隐藏单元的概率是 0.2
'''
keep_prob = tf.placeholder(tf.float32)'''
定义一个输入为x,权值为W,偏置为b,给定步幅的卷积层,激活函数是ReLu,padding
设置为Same模式
strides:步长,
strides参数表示的是滑窗在输入张量各个维度上的移动步长
而且一般要求 strides的参数,strides[0] = strides[3] = 1
具体什么含义呢?
一般而言,对于输入张量(input tensor)有四维信息:[batch, height, width, channels](分别表示 batch_size,
也即样本的数目,单个样本的行数和列数,样本的频道数,
rgb图像就是三维的,灰度图像则是一维),
对于一个二维卷积操作而言,其主要作用在 height, width上。
strides参数确定了滑动窗口在各个维度上移动的步数。
一种常用的经典设置就是要求,strides[0]=strides[3]=1。
strides[0] = 1,也即在 batch 维度上的移动为 1,也就是不跳过任何一个样本,否则当初也不该把它们作为输入(input)
strides[3] = 1,也即在 channels 维度上的移动为 1,也就是不跳过任何一个颜色通道;padding设置same模式
padding一般有两种模式 same ,valid
same模式:在卷积核做卷积的过程中(假如卷积核是2*2 但后续不足2*2的话,
same模式会给空缺值补0,从而使得特征图大小不发生改变)
valid模式:在卷积过程中如果后续不足卷积核大小,则后续的值将会被舍弃
这种方法的特征图一般来说会变小
'''
def conv2d(x,W,b,strides=1):x = tf.nn.conv2d(x,W,strides=[1,strides,strides,1],padding='SAME')'''
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
除去name参数用以指定该操作的name,与方法有关的一共五个参数:
第一个参数input:指需要做卷积的输入图像,它要求是一个Tensor,
具有[batch, in_height, in_width, in_channels]这样的shape,
具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],
注意这是一个4维的Tensor,要求类型为float32和float64其中之一
第二个参数filter:相当于CNN中的卷积核,
它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,
具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],
要求类型与参数input相同,
有一个地方需要注意,第三维in_channels,就是参数input的第四维
第三个参数strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4
第四个参数padding:string类型的量,只能是"SAME","VALID"其中之一,
这个值决定了不同的卷积方式
第五个参数:use_cudnn_on_gpu:bool类型,
是否使用cudnn加速,默认为true'''x=tf.nn.bias_add(x,b)'''tf.nn.bias_add(): 通俗解释:一个叫bias的向量加到一个叫value的矩阵上,是向量与矩阵的每一行进行相加,得到的结果和value矩阵大小相同。'''return tf.nn.relu(x)
'''
定义一个输入是X的maxpool层,卷积核为ksize并且padding为SAME:
'''
def maxpool2d(x,k=2):return tf.nn.max_pool(x,ksize=[1,k,k,1],strides=[1,k,k,1],padding='SAME')
'''
定义convnet,其构成是两个卷积层,然后是全连接层,一个dropout层,最后是输出层
'''
def conv_net(x,weights,biases,dropout):#reshape the input picturex = tf.reshape(x,shape=[-1,28,28,1])#first convolution layerconv1 = conv2d(x,weights['wc1'],biases['bc1'])conv1 = maxpool2d(conv1,k=2)conv2 = conv2d(conv1,weights['wc2'],biases['bc2'])conv2 = maxpool2d(conv2,k=2)fc1 = tf.reshape(conv2,[-1,weights['wd1'].get_shape().as_list()[0]])fc1 = tf.add(tf.matmul(fc1,weights['wd1']),biases['bd1'])fc1 = tf.nn.relu(fc1)fc1 = tf.nn.dropout(fc1,dropout)out = tf.add(tf.matmul(fc1,weights['out']),biases['out'])return out
'''
定义网络层的权重和偏置。
第一个 conv 层有一个 5×5 的卷积核,
1 个输入和 32 个输出。
第二个 conv 层有一个 5×5 的卷积核,
32 个输入和 64 个输出。
全连接层有 7×7×64 个输入和 1024 个输出,
而第二层有 1024 个输入和 10 个输出对应于最后的数字数目。
所有的权重和偏置用 randon_normal 分布完成初始化:
'''weights = {'wc1':tf.Variable(tf.random_normal([5,5,1,32])),'wc2':tf.Variable(tf.random_normal([5,5,32,64])),'wd1':tf.Variable(tf.random_normal([7*7*64,1024])),'out':tf.Variable(tf.random_normal([1024,n_classes]))
}biaese = {'bc1':tf.Variable(tf.random_normal([32])),'bc2':tf.Variable(tf.random_normal([64])),'bd1':tf.Variable(tf.random_normal([1024])),'out':tf.Variable(tf.random_normal([n_classes]))
}'''
建立一个给定权重和偏置的 convnet。
定义基于 cross_entropy_with_logits 的损失函数,
并使用 Adam 优化器进行损失最小化。优化后,计算精度:
'''
pred = conv_net(x,weights,biaese,keep_prob)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred,labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
correct_prediction = tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
init = tf.global_variables_initializer()'''
启动计算图并迭代 training_iterats次
,其中每次输入 batch_size 个数据进行优化。
请注意,用从 mnist 数据集分离出的 mnist.train 数据进行训练。
每进行 display_step 次迭代,
会计算当前的精度。
最后,在 2048 个测试图片上计算精度,此时无 dropout
'''
train_loss = []
train_acc = []
test_acc = []with tf.Session() as sess:sess.run(init)step = 1while step<=training_iters:batch_x,batch_y = mnist.train.next_batch(batch_size)sess.run(optimizer,feed_dict={x:batch_x,y:batch_y,keep_prob:dropout})if step % display_step==0:loss_train,acc_train = sess.run([cost,accuracy],feed_dict={x:batch_x,y:batch_y,keep_prob:1.})print("Iter"+str(step)+",Minibatch Loss = "+"{:.2f}".format(loss_train)+",Training Accuracy="+"{:.2f}".format(acc_train))#calculate accuracy for 2048 mnist test images#Note that in this case no dropoutacc_test = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.})print("Testing Accuracy:"+"{:.2f}".format(acc_train))train_loss.append(loss_train)train_acc.append(acc_train)test_acc.append(acc_test)step+=1eval_indices =range(0,training_iters,display_step)plt.plot(eval_indices,train_loss,'k-')plt.title('Softmax Loss Per iteration')plt.xlabel('Iteration')plt.ylabel('Softmax Loss')plt.show()plt.plot(eval_indices,train_acc,'k-',label='Train Set Accuracy')plt.plot(eval_indices,test_acc,'r--',label='Test Set Accuracy')plt.xlabel('Generation')plt.ylabel('Accuracy')plt.legend(loc='lower right')plt.show()

三维卷积神经网络预测MNIST数字详解相关推荐

  1. 3层-CNN卷积神经网络预测MNIST数字

    3层-CNN卷积神经网络预测MNIST数字 本文创建一个简单的三层卷积网络来预测 MNIST 数字.这个深层网络由两个带有 ReLU 和 maxpool 的卷积层以及两个全连接层组成. MNIST 由 ...

  2. 从卷积神经网络(CNN)到图卷积神经网络(GCN)详解

    目录 一.CNN和GCN的关系 二."图"的预备知识 三.图卷积网络(GCN) 四.针对于高光谱图像分类的网络优化 五.频域的图卷积神经网络 最近看到一篇引用量非常高的文章,是用图 ...

  3. DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解

    FROM: http://blog.csdn.net/u012162613/article/details/43225445 DeepLearning tutorial(4)CNN卷积神经网络原理简介 ...

  4. 卷积神经网络(CNN)详解及TensorFlow2代码实现

    卷积神经网络名字听着挺吓人,本文用通俗易懂的方式解释.人人都能看懂. 文章目录 卷积是什么 一.卷积神经网络介绍 卷积层--提取局部图片特征 扩充--padding,保持卷积后图片的长和宽保持不变 池 ...

  5. 卷积神经网络之AlexNet网络详解

    一  介绍 Alex Krizhevsky等人训练了一个大型的卷积神经网络用来把ImageNet LSVRC-2010比赛中120万张高分辨率的图像分为1000个不同的类别.在测试卷上,获得很高准确率 ...

  6. 猫狗图片识别(卷积神经网络(CNN)详解)

    目录 一.模型设计 (1)卷积神经网络认识 (3)卷积神经网络设置 ①导入顺序模型 ②输入层设置 ③隐藏层设置 ④维度变化 ⑤输出层 二.代码详解 (1)图片文件匹配 (2)图形裁剪 (3)函数参数设 ...

  7. 【卷积神经网络】ResNet翻译详解

    论文题目:Deep Residual Learning for Image Recognition 论文地址:https://arxiv.org/pdf/1512.03385.pdf Pytorch官 ...

  8. [转载] python bp神经网络 mnist_Python利用全连接神经网络求解MNIST问题详解

    参考链接: Python中的单个神经元神经网络 本文实例讲述了Python利用全连接神经网络求解MNIST问题.分享给大家供大家参考,具体如下: 1.单隐藏层神经网络 人类的神经元在树突接受刺激信息后 ...

  9. 经典卷积神经网络(CNN)图像分类算法详解

    本文原创,转载请引用 https://blog.csdn.net/dan_teng/article/details/87192430 CNN图像分类网络 一点废话:CNN网络主要特点是使用卷积层,这其 ...

最新文章

  1. struct ifconf和struct ifreq,获取网线插入状态
  2. 【云快讯】之四十五《Google在云服务领域认输?不,我们的重点是大数据》
  3. SHELL脚本取系统当前年月日问题 (去0)
  4. VS2010Web默认的浏览器设置和VS里调试JavaScript代码的设置
  5. Python过滤掉numpy.array中非nan数据
  6. C和指针之高级指针话题通过函数指针实现在链表中找到特定的值
  7. 计算机硬件统的构成,计算机硬件统的构成部件.ppt
  8. core identity mysql_Microsoft.AspNetCore.Identity 使用 mysql 报错处理
  9. python 横坐标旋转,python 横坐标旋转
  10. c# 从地址拷贝byte_面试必备的 “零拷贝” 问题!从头给你说!
  11. leetcode - 783. 二叉搜索树结点最小距离
  12. java基础—找出两个字符串中最大的子串
  13. SEH in ASM研究
  14. Thread调用SaveFileDialog
  15. java添加录音,大家说说java程序里怎么插入视频和音频啊
  16. AFTN和SITA报文简介
  17. 机器学习笔记之概率图模型(五)马尔可夫随机场的结构表示
  18. lnmp一键安装包 mysql_CentOS7下安装lnmp一键安装包
  19. SD-WAN、MPLS 、IPsec 和物理专线的区别
  20. vivo直播应用技术实践与探索

热门文章

  1. Adobe illustrator 调整图例为2列 - 连载 16
  2. 这篇文献总结了常见的中式英语写法,来看看有没有中枪?
  3. 推荐一款自动化代码变量命名在线工具
  4. STM32H743+CubeMX-低功耗定时器LPTIM输出PWM波
  5. python操作符op_详解python中的 is 操作符
  6. python __set__ __get___python3面对像进阶——描述符(__get__,__set__,__delete__)
  7. QML笔记-使用Row的时候要注意的地方(一定要指明高度和宽度)
  8. Spring Boot文档阅读笔记-@SpringBootApplication官方解析与实例(1.5.19)
  9. 软件设计师习题笔记-重点习题五
  10. html logo动画效果图,简单CSS3技巧实现的Logo动画