计算机视觉基础系列(python与opencv的操作与运用/tensorflow的基础介绍)(二十六)---手写数字识别之CNN(2)

首先我们需要知道池化层的作用,上一篇博客有说明,可以点击这里查看

import tensorflow as tf
import numpy as np
import random
from tensorflow.examples.tutorials.mnist import input_data      # 将input_data用来读取图片
# 1.数据装载
minst = input_data.read_data_sets('minst_data/', one_hot=True)
# 两个参数,第一个是minst文件夹的路径,第二个参数是one-hot,它是布尔类型,对于一个数组来说,这个数组定义为one-hot,那么这个数组中的元素,有一个元素为1的话,那么其他元素全为0
# 接下来就是搭建神经网络,要明确我们的输入,第一是图片的输入,第二要完成标签的输入
imageInput = tf.placeholder(tf.float32, [None, 784])         # 28*28的,所以是784,第一个维度是输入的图片的个数
labelInput = tf.placeholder(tf.float32, [None, 10])         # 第一个是图片的个数,第二个参数是0-9,所以是10
# 对当前的维度进行重新调整
imageInputReshape = tf.reshape(imageInput, [-1, 28, 28, 1])      # 数据维度的调整 data reshape 由[None,784]-->M*28*28*1 即2维转换成4维
# 完成维度的调整,将一个n行乘以一个784维的调整成一个m行乘以28行乘以28列一个通道的数据,所以将一个两维的数据转化成一个4维的数据
# 28*28表示图片的宽高信息,后谜案的1代表的是颜色通道,这里是灰度图,所以这里的channel是1,m是这样经过这样经过转换之后的剩余的这些元素共同构成的这样的一个m
# 数据准备完之后,接下来就可以准备进行卷积运算
# 神经网络其实第一步完成的就是卷积运算
# 实现卷积运算,首先需要定义几个参数:
w0 = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1))
# Variable定义一个变量,生成一个满足正态分布的数据,在tesorflow中有一个方法是truncated_normal,其中的参数是生成数据的维度,第二个参数是期望和方差stddev
# 这里我们想生成的w0是进行卷积运算的内核,那么这个内核是多大呢,我们将它的大小设置为5*5,另外输入的维度为1,可以看做当前通道的个数channel,因为是灰度图,输出为32维度
b0 = tf.Variable(tf.constant(0.1, shape=[32]))        # 定义偏置,定义为一个常量,定义为32维,实际上是改变的是最后的一个维度
# 接下来就是实现卷积层
# 第一层是激励函数+乘加运算
layer1 = tf.nn.relu(tf.nn.conv2d(imageInputReshape, w0, strides=[1, 1, 1, 1], padding='SAME')+b0)
# 在当前的卷积运算中,包含以下数据,
# 1.输入数据(imageInputReshape),它是[M,28, 28, 1]的维度 2.w0是一个[5, 5, 1, 32]这个维度,3,pandding步长:每次用的步长,SAME表明卷积核可以停留在图像的边缘
# 卷积神经网络在每一层的计算完之后是多一个池化层的,不像普通的神经网络,卷积完之后就是直接作为下一层的输入了
# pool 下采样,数据量减少很多,如何进行减小呢:这里的ksize的[1, 4, 4, 1]以此与数据量的四维进行相除,即为M*28*28*32 ===>M*7*7*32,后面的strides为步长,padding为边缘
layer1_pool = tf.nn.max_pool(layer1, ksize=[1, 4, 4, 1], strides=[1, 4, 4, 1], padding='SAME')
# max_pool 的作用是防止过拟合
# 普通的神经网络的输出层是:激励函数加上乘加运算即可,在这里,卷积神经网络的输出是:(激励函数+乘加运算)的一个softmax函数
w1 = tf.Variable(tf.truncated_normal([7*7*32, 1024], stddev=0.1))
# 从截断的正态分布中输出随机值。[7*7*32, 1024]截取的维度,stddev为方差
# 生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择。
# tf.random_normal是从正态分布中输出随机值。
b1 = tf.Variable(tf.constant(0.1, shape=[1024]))
# 完成维度的转换,之前的layer1_pool是一个M*7*7*32的四维的数据,这里我们需要转换成一个二维的数据
h_reshape = tf.reshape(layer1_pool, [-1, 7*7*32])                        # M*7*7*32->N*N1
# [N*7*7*32] [7*7*32,1024]=N*1024,使用激励函数和乘加运算来计算
h1 = tf.nn.relu(tf.matmul(h_reshape, w1)+b1)
# 上面的运算结果作为输入带入到softmax中继续完成激励函数,进行乘加运算
w2 = tf.Variable(tf.truncated_normal([1024, 10], stddev=0.1))
b2 = tf.Variable(tf.constant(0.1, shape=[10]))
pred = tf.nn.softmax(tf.matmul(h1, w2)+b2)
# N*1024 1024*10=N*10  预测结果输出的结果是N*10,N是N张图片,10代表10张图片在0-9上分布的概率
# N*10(概率)
loss0 = labelInput*tf.log(pred)          # 把当前的数据范围尽可能的压缩,
loss1 = 0
for m in range(0, 100):
	for n in range(0,10):
		loss1 = loss1 + loss0[m,n]
loss = loss1/100

# train 训练
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)       # 梯度下降法,每一次下降0.01,目的是缩小loss,减小误差

# run 运行
with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())      # 完成所有参数的初始化
	for i in range(100):    # 运用循环读取和训练图片
		images,labels = minst.train.next_batch(500)        # 每次读取500张图片分别存在图片和标签数组中进行训练
		sess.run(train,feed_dict={imageInput:images,labelInput:labels})     # run当前的数据,喂入数据,完成训练

		pred_test = sess.run(pred,feed_dict={imageInput:minst.test.images,labelInput:labels})
        # 最终的 预测结果,最终的预测结果是一个十维的,我们之前的label标签也是 10维的,所以我们需要判断一下它们中最大值是否相等,为什么要判断它们的最大值是否相等呢:
        # 因为pred_test得到的是当前的某一张图片它进行预测完之后,0-9出现的概率,概率最大的就是我们认为的那个数字,所以我们需要用最大值进行判断
		acc = tf.equal(tf.arg_max(pred_test,1),tf.arg_max(minst.test.labels,1))
		acc_float = tf.reduce_mean(tf.cast(acc,tf.float32))        # 完成当前均值的计算
		acc_result = sess.run(acc_float,feed_dict={imageInput:minst.test.images,labelInput:minst.test.labels})
		print(acc_result)

输出结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值