导入所需的库模块:

import os
import cv2
import numpy as np
import tensorflow as tf2
import matplotlib.pyplot as plt
import tensorflow.compat.v1 as tf

import tensorflow.compat.v1 as tf
这句话是为了将tensorflow 2.x转为1.x,tensorflow1.x更能表现网络结构
import os
是调用系统,可有可无,为了不显示警告内容所以调用该模块

小批量训练法的数据分割:

def nextBatch(data,batch_size,n):#小批量梯度下降法获取当前数据集函数#data为全部数据[X,Y],batch_size为当前子数据集大小,n为第n个子数据集a=n*batch_sizeb=(n+1)*batch_sizelimdata=len(data[0])if b>limdata:b=limdataa=b-batch_sizedata_x=data[0][a:b]data_y=data[1][a:b]return data_x,data_y

这里是为了将数据集切割成小批量数据,完成训练,小批量训练结果更好。

CNN网络:

def main_train():(x_tr0,y_tr0),(x_te0,y_te0)=tf2.keras.datasets.mnist.load_data()#手写数据库y_tr=np.zeros((len(y_tr0),10))y_te=np.zeros((len(y_te0),10))for i in range(len(y_tr0)):y_tr[i][y_tr0[i]]=1for i in range(len(y_te0)):y_te[i][y_te0[i]]=1x_tr=x_tr0.reshape(-1,28,28,1)x_te=x_te0.reshape(-1,28,28,1)training_epochs=100#训练步数batch_count=20#小批量训练子集数量L=32#卷积层1所提取特征个数M=64#卷积层2所提取特征个数N=128#卷积层3所提取特征个数O=625#全连接就层神经元数
#     with tf.device('/cpu:0'):with tf.device('/gpu:0'):Xin=tf.placeholder(tf.float32,[None,28,28,1],name='Xin')#28×28维输入特征Yout=tf.placeholder(tf.float32,[None,10],name="Yout")#10类分类结果标签W1=tf.Variable(tf.random_normal([3,3,1,L],stddev=0.01))#卷积层1的卷积核权值张量,卷积核大小3×3,输入数据为1通道,输出特征为32通道W2=tf.Variable(tf.random_normal([3,3,L,M],stddev=0.01))#卷积层2的卷积核权值张量,卷积核大小3×3,输入数据为32通道,输出特征为64通道W3=tf.Variable(tf.random_normal([3,3,M,N],stddev=0.01))#卷积层3的卷积核权值张量,卷积核大小3×3,输入数据为64通道,输出特征为128通道W4=tf.Variable(tf.random_normal([N*4*4,O],stddev=0.01))#全连接层权值张量,输入数据为128×4×4个,输出为625个,这里需要把上一层的高维张量扁平化W5=tf.Variable(tf.random_normal([O,10],stddev=0.01))#输出层权值张量,输入数据为625,输出为10类b1=tf.Variable(tf.random_normal([L],stddev=0.01))#卷积层1的输出特征阈值,输出特征为32通道,每个通道共享一个阈值b2=tf.Variable(tf.random_normal([M],stddev=0.01))#卷积层2的输出特征阈值,输出特征为64通道,每个通道共享一个阈值b3=tf.Variable(tf.random_normal([N],stddev=0.01))#卷积层3的输出特征阈值,输出特征为128通道,每个通道共享一个阈值b4=tf.Variable(tf.random_normal([O],stddev=0.01))#全连接层阈值b5=tf.Variable(tf.random_normal([10],stddev=0.01))#输出层阈值'''卷积层一'''conv1a=tf.nn.conv2d(Xin,W1,strides=[1,1,1,1],padding='SAME')conv1b=tf.nn.bias_add(conv1a,b1)conv1c=tf.nn.relu(conv1b)'''池化层一'''conv1=tf.nn.max_pool(conv1c,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')'''卷积层二'''conv2a=tf.nn.conv2d(conv1,W2,strides=[1,1,1,1],padding='SAME')conv2b=tf.nn.bias_add(conv2a,b2)conv2c=tf.nn.relu(conv2b) '''池化层二'''conv2=tf.nn.max_pool(conv2c,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')'''卷积层三'''conv3a=tf.nn.conv2d(conv2,W3,strides=[1,1,1,1],padding='SAME')conv3b=tf.nn.bias_add(conv3a,b3)conv3c=tf.nn.relu(conv3b) '''池化层三'''conv3d=tf.nn.max_pool(conv3c,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')conv3=tf.reshape(conv3d,[-1,W4.get_shape().as_list()[0]])#扁平化'''全连接层'''FCa=tf.matmul(conv3,W4)+b4FC=tf.nn.relu(FCa)'''输出层'''Y_=tf.matmul(FC,W5)+b5 Y=tf.nn.softmax(Y_,name="output")#经历softmax分类激活函数后的数值'''损失'''cross_entropy=tf.nn.softmax_cross_entropy_with_logits(logits=Y_, labels=Yout)loss=tf.reduce_mean(cross_entropy)*100#交叉损失correct_prediction=tf.equal(tf.argmax(Y,1),tf.argmax(Yout,1))accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32),name='accuracy')#正确率'''优化器'''trainer=tf.train.RMSPropOptimizer(learning_rate=0.001,momentum=0.9).minimize(loss)init=tf.global_variables_initializer()#变量初始化赋值器with tf.Session() as sess: sess.run(init)#变量初始化out_init=sess.run(accuracy,feed_dict={Xin:x_tr[0:20000],Yout:y_tr[0:20000]})#计算初始误差print("初始准确率为:{:.4f}%".format(out_init*100))#输出初始误差for epoch in range(training_epochs):#训练步数print("当前训练步为第{}步".format(epoch+1))batch_size=int(len(y_tr)/batch_count)#当前子集大小for i in range(batch_count):#对每个子集遍历训练batch_x,batch_y=nextBatch([x_tr[0:20000],y_tr[0:20000]],batch_size,i)#当前子集的训练集特征和标签数据sess.run(trainer,feed_dict={Xin:batch_x,Yout:batch_y})out=sess.run(accuracy,feed_dict={Xin:x_tr[0:20000],Yout:y_tr[0:20000]})#计算当前误差print("当前准确率为:{:.4f}%".format(out*100))#当前初始误差'''当前会话存储'''if out>out_init:out_init=outsaver=tf.train.Saver()saver.save(sess,r".\savefile\CNN\FigureCNN.ckpt")

下面做详细分析。
首先要导入手写数据库,tensorflow2.0自带手写字体数据库,用下面语句导入:

(x_tr0,y_tr0),(x_te0,y_te0)=tf2.keras.datasets.mnist.load_data()

x_tr0,y_tr0是60000个训练集的图片和标签。图片是28×28像素,标签是该图像所对应的数字。
x_te0,y_te0是10000个测练集的图片和标签。图片是28×28像素,标签是该图像所对应的数字。
在神经网络中,我们输出是10类,利用softmax函数做输出,因此标签的形式应为10位的,数字0应为“1000000000”,数字1为“0100000000”,数字2为“0010000000”,…,数字9为“0000000001”。
下面改变输出标签的格式:

 y_tr=np.zeros((len(y_tr0),10))y_te=np.zeros((len(y_te0),10))for i in range(len(y_tr0)):y_tr[i][y_tr0[i]]=1for i in range(len(y_te0)):y_te[i][y_te0[i]]=1

此外,数据输入格式也要做改变,输入数据是28×28像素黑白图片,读入信息是2阶矩阵,在网络中改为3阶矩阵,这里进行形式变换:

    x_tr=x_tr0.reshape(-1,28,28,1)x_te=x_te0.reshape(-1,28,28,1)

接下来输入网络计算的相关参数:

    training_epochs=100#训练步数batch_count=20#小批量训练子集数量L=32#卷积层1所提取特征个数M=64#卷积层2所提取特征个数N=128#卷积层3所提取特征个数O=625#全连接就层神经元数

接下来,神经网络可以使用cpu计算,也可以使用gpu计算,cpu计算格式为:

with tf.device('/cpu:0'):

gpu计算格式为:

with tf.device('/gpu:0'):

如果不写这两句话,按照安装的tensorflow版本默认计算。我安装的tensorflow是gpu版本,默认进行gpu计算。

下面,定义网络的权值阈值:

     W1=tf.Variable(tf.random_normal([3,3,1,L],stddev=0.01))#卷积层1的卷积核权值张量,卷积核大小3×3,输入数据为1通道,输出特征为32通道W2=tf.Variable(tf.random_normal([3,3,L,M],stddev=0.01))#卷积层2的卷积核权值张量,卷积核大小3×3,输入数据为32通道,输出特征为64通道W3=tf.Variable(tf.random_normal([3,3,M,N],stddev=0.01))#卷积层3的卷积核权值张量,卷积核大小3×3,输入数据为64通道,输出特征为128通道W4=tf.Variable(tf.random_normal([N*4*4,O],stddev=0.01))#全连接层权值张量,输入数据为128×4×4个,输出为625个,这里需要把上一层的高维张量扁平化W5=tf.Variable(tf.random_normal([O,10],stddev=0.01))#输出层权值张量,输入数据为625,输出为10类b1=tf.Variable(tf.random_normal([L],stddev=0.01))#卷积层1的输出特征阈值,输出特征为32通道,每个通道共享一个阈值b2=tf.Variable(tf.random_normal([M],stddev=0.01))#卷积层2的输出特征阈值,输出特征为64通道,每个通道共享一个阈值b3=tf.Variable(tf.random_normal([N],stddev=0.01))#卷积层3的输出特征阈值,输出特征为128通道,每个通道共享一个阈值b4=tf.Variable(tf.random_normal([O],stddev=0.01))#全连接层阈值b5=tf.Variable(tf.random_normal([10],stddev=0.01))#输出层阈值

下面构建CNN网络:

     Xin=tf.placeholder(tf.float32,[None,28,28,1],name='Xin')#28×28维输入特征Yout=tf.placeholder(tf.float32,[None,10],name="Yout")#10类分类结果标签'''卷积层一'''conv1a=tf.nn.conv2d(Xin,W1,strides=[1,1,1,1],padding='SAME')conv1b=tf.nn.bias_add(conv1a,b1)conv1c=tf.nn.relu(conv1b)'''池化层一'''conv1=tf.nn.max_pool(conv1c,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')'''卷积层二'''conv2a=tf.nn.conv2d(conv1,W2,strides=[1,1,1,1],padding='SAME')conv2b=tf.nn.bias_add(conv2a,b2)conv2c=tf.nn.relu(conv2b) '''池化层二'''conv2=tf.nn.max_pool(conv2c,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')'''卷积层三'''conv3a=tf.nn.conv2d(conv2,W3,strides=[1,1,1,1],padding='SAME')conv3b=tf.nn.bias_add(conv3a,b3)conv3c=tf.nn.relu(conv3b) '''池化层三'''conv3d=tf.nn.max_pool(conv3c,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')conv3=tf.reshape(conv3d,[-1,W4.get_shape().as_list()[0]])#扁平化'''全连接层'''FCa=tf.matmul(conv3,W4)+b4FC=tf.nn.relu(FCa)'''输出层'''Y_=tf.matmul(FC,W5)+b5 Y=tf.nn.softmax(Y_,name="output")#经历softmax分类激活函数后的数值

tf.placeholder()占位符是用于接收外界输入
tf.nn.conv2d()进行卷积操作
tf.nn.bias_add()偏置的加法操作
tf.nn.relu()Relu函数,用作卷积层激活函数
tf.nn.max_pool()最大池化函数,池化是用于减少特征量,避免数据爆炸,但是也减少其中的信息量
tf.reshape()用于改变数据形态,全连接层之前要将数据扁平化,变为一维,便于输出计算
Y_=tf.matmul(FC,W5)+b5 这是全连接层的计算,权值相乘,阈值相加
tf.nn.softmax()是softmax函数,计算输出的概率

下面定义损失函数以及正确率计算函数:

     cross_entropy=tf.nn.softmax_cross_entropy_with_logits(logits=Y_, labels=Yout)loss=tf.reduce_mean(cross_entropy)*100#交叉损失correct_prediction=tf.equal(tf.argmax(Y,1),tf.argmax(Yout,1))accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32),name='accuracy')#正确率

下面定义优化器:

trainer=tf.train.RMSPropOptimizer(learning_rate=0.001,momentum=0.9).minimize(loss)

这里是RMS优化算法,参数包括学习率和动量

下面进行数据训练计算:

    with tf.Session() as sess: sess.run(init)#变量初始化out_init=sess.run(accuracy,feed_dict={Xin:x_tr[0:20000],Yout:y_tr[0:20000]})#计算初始准确率print("初始准确率为:{:.4f}%".format(out_init*100))#输出初始准确率for epoch in range(training_epochs):#训练步数print("当前训练步为第{}步".format(epoch+1))batch_size=int(len(y_tr)/batch_count)#当前子集大小for i in range(batch_count):#对每个子集遍历训练batch_x,batch_y=nextBatch([x_tr[0:20000],y_tr[0:20000]],batch_size,i)#当前子集的训练集特征和标签数据sess.run(trainer,feed_dict={Xin:batch_x,Yout:batch_y})out=sess.run(accuracy,feed_dict={Xin:x_tr[0:20000],Yout:y_tr[0:20000]})#计算当前误差print("当前准确率为:{:.4f}%".format(out*100))#当前初始误差

x_tr[0:20000]和y_tr[0:20000]的说明:我的gpu是gtx1050Ti,显存是4G,两万张图片数据的输入是网络中数据的显存极限,再多的数据量就溢出了,不能完成训练。因此,我选择前两万张训练集数据作为输入,这个根据每个人的电脑不一样而不同。
with tf.Session() as sess:是构建会话且自动关闭

为了防止模型丢失,需要将模型存储下来。我们存储准确率最好的会话:

            if out>out_init:out_init=outsaver=tf.train.Saver()saver.save(sess,r".\savefile\CNN\FigureCNN.ckpt")

读取模型和自己的图片测试:

def main_test():(x_tr0,y_tr0),(x_te0,y_te0)=tf2.keras.datasets.mnist.load_data()#手写数据库y_tr=np.zeros((len(y_tr0),10))y_te=np.zeros((len(y_te0),10))for i in range(len(y_tr0)):y_tr[i][y_tr0[i]]=1for i in range(len(y_te0)):y_te[i][y_te0[i]]=1x_tr=x_tr0.reshape(-1,28,28,1)x_te=x_te0.reshape(-1,28,28,1)road=[r".\savefile\CNN\FigureCNN.ckpt.meta",r".\savefile\CNN\FigureCNN.ckpt"]sess=tf.InteractiveSession()new_saver=tf.train.import_meta_graph(road[0])new_saver.restore(sess,road[1])tf.get_default_graph().as_graph_def()Xin=sess.graph.get_tensor_by_name('Xin:0')Yout=sess.graph.get_tensor_by_name("Yout:0") accuracy=sess.graph.get_tensor_by_name('accuracy:0')Y=sess.graph.get_tensor_by_name('output:0')Ote=sess.run(accuracy,feed_dict={Xin:x_te,Yout:y_te})print("测试集准确率为:{:.4f}%".format(Ote*100))Ote=sess.run(accuracy,feed_dict={Xin:x_tr[30000:40000],Yout:y_tr[30000:40000]})print("训练集集准确率为:{:.4f}%".format(Ote*100))u=eval(input("输入0-9999之间的一个整数:"))if (u<0) or (u>9999):print('错误!')sess.close()returnOtem=sess.run(Y,feed_dict={Xin:[x_te[u]]})print('手写的数字为:{}'.format(Otem.argmax()))plt.imshow(x_te[u].reshape(28,28))plt.show()#手写数字展示for i in [0,2,4,5,9]:roadpic=r'.\picturefile\handwriting'+str(i)+'.jpg'pic=cv2.imread(roadpic,flags=0)pic1=255-picpic=pic1.reshape(-1,28,28,1)Otem=sess.run(Y,feed_dict={Xin:pic})print('手写的数字为:{}'.format(Otem.argmax()))plt.imshow(pic1)plt.show()#手写数字展示sess.close()return

下面进行详细分析,先导入数据和测试集输出数据变换形态:

 (x_tr0,y_tr0),(x_te0,y_te0)=tf2.keras.datasets.mnist.load_data()#手写数据库y_tr=np.zeros((len(y_tr0),10))y_te=np.zeros((len(y_te0),10))for i in range(len(y_tr0)):y_tr[i][y_tr0[i]]=1for i in range(len(y_te0)):y_te[i][y_te0[i]]=1x_tr=x_tr0.reshape(-1,28,28,1)x_te=x_te0.reshape(-1,28,28,1)

读取已存储的模型:

    road=[r".\savefile\CNN\FigureCNN.ckpt.meta",r".\savefile\CNN\FigureCNN.ckpt"]sess=tf.InteractiveSession()new_saver=tf.train.import_meta_graph(road[0])new_saver.restore(sess,road[1])tf.get_default_graph().as_graph_def()Xin=sess.graph.get_tensor_by_name('Xin:0')Yout=sess.graph.get_tensor_by_name("Yout:0") accuracy=sess.graph.get_tensor_by_name('accuracy:0')Y=sess.graph.get_tensor_by_name('output:0')

计算测试集和训练集其他数据的准确率:

    Ote=sess.run(accuracy,feed_dict={Xin:x_te,Yout:y_te})print("测试集准确率为:{:.4f}%".format(Ote*100))Ote=sess.run(accuracy,feed_dict={Xin:x_tr[30000:40000],Yout:y_tr[30000:40000]})print("训练集集准确率为:{:.4f}%".format(Ote*100))

随机选择测试集的一个数据,输出模型预测结果并查看这个数据,看看结果:

    u=eval(input("输入0-9999之间的一个整数:"))if (u<0) or (u>9999):print('错误!')sess.close()returnOtem=sess.run(Y,feed_dict={Xin:[x_te[u]]})print('手写的数字为:{}'.format(Otem.argmax()))plt.imshow(x_te[u].reshape(28,28))plt.show()#手写数字展示

将自己写的28×28的图片预测结果:

    for i in [0,2,4,5,9]:roadpic=r'.\picturefile\handwriting'+str(i)+'.jpg'pic=cv2.imread(roadpic,flags=0)pic1=255-picpic=pic1.reshape(-1,28,28,1)Otem=sess.run(Y,feed_dict={Xin:pic})print('手写的数字为:{}'.format(Otem.argmax()))plt.imshow(pic1)plt.show()#手写数字展示

roadpic是图片的位置,共5张自己制作的图片:




所有程序:

'''
Created on 2021年11月2日@author: 紫薇星君
'''
import os
import cv2
import numpy as np
import tensorflow as tf2
import matplotlib.pyplot as plt
import tensorflow.compat.v1 as tfdef nextBatch(data,batch_size,n):#小批量梯度下降法获取当前数据集函数#data为全部数据[X,Y],batch_size为当前子数据集大小,n为第n个子数据集a=n*batch_sizeb=(n+1)*batch_sizelimdata=len(data[0])if b>limdata:b=limdataa=b-batch_sizedata_x=data[0][a:b]data_y=data[1][a:b]return data_x,data_ydef main_train():(x_tr0,y_tr0),(x_te0,y_te0)=tf2.keras.datasets.mnist.load_data()#手写数据库y_tr=np.zeros((len(y_tr0),10))y_te=np.zeros((len(y_te0),10))for i in range(len(y_tr0)):y_tr[i][y_tr0[i]]=1for i in range(len(y_te0)):y_te[i][y_te0[i]]=1x_tr=x_tr0.reshape(-1,28,28,1)x_te=x_te0.reshape(-1,28,28,1)training_epochs=100#训练步数batch_count=20#小批量训练子集数量L=32#卷积层1所提取特征个数M=64#卷积层2所提取特征个数N=128#卷积层3所提取特征个数O=625#全连接就层神经元数
#     with tf.device('/cpu:0'):with tf.device('/gpu:0'):Xin=tf.placeholder(tf.float32,[None,28,28,1],name='Xin')#28×28维输入特征Yout=tf.placeholder(tf.float32,[None,10],name="Yout")#10类分类结果标签W1=tf.Variable(tf.random_normal([3,3,1,L],stddev=0.01))#卷积层1的卷积核权值张量,卷积核大小3×3,输入数据为1通道,输出特征为32通道W2=tf.Variable(tf.random_normal([3,3,L,M],stddev=0.01))#卷积层2的卷积核权值张量,卷积核大小3×3,输入数据为32通道,输出特征为64通道W3=tf.Variable(tf.random_normal([3,3,M,N],stddev=0.01))#卷积层3的卷积核权值张量,卷积核大小3×3,输入数据为64通道,输出特征为128通道W4=tf.Variable(tf.random_normal([N*4*4,O],stddev=0.01))#全连接层权值张量,输入数据为128×4×4个,输出为625个,这里需要把上一层的高维张量扁平化W5=tf.Variable(tf.random_normal([O,10],stddev=0.01))#输出层权值张量,输入数据为625,输出为10类b1=tf.Variable(tf.random_normal([L],stddev=0.01))#卷积层1的输出特征阈值,输出特征为32通道,每个通道共享一个阈值b2=tf.Variable(tf.random_normal([M],stddev=0.01))#卷积层2的输出特征阈值,输出特征为64通道,每个通道共享一个阈值b3=tf.Variable(tf.random_normal([N],stddev=0.01))#卷积层3的输出特征阈值,输出特征为128通道,每个通道共享一个阈值b4=tf.Variable(tf.random_normal([O],stddev=0.01))#全连接层阈值b5=tf.Variable(tf.random_normal([10],stddev=0.01))#输出层阈值'''卷积层一'''conv1a=tf.nn.conv2d(Xin,W1,strides=[1,1,1,1],padding='SAME')conv1b=tf.nn.bias_add(conv1a,b1)conv1c=tf.nn.relu(conv1b)'''池化层一'''conv1=tf.nn.max_pool(conv1c,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')'''卷积层二'''conv2a=tf.nn.conv2d(conv1,W2,strides=[1,1,1,1],padding='SAME')conv2b=tf.nn.bias_add(conv2a,b2)conv2c=tf.nn.relu(conv2b) '''池化层二'''conv2=tf.nn.max_pool(conv2c,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')'''卷积层三'''conv3a=tf.nn.conv2d(conv2,W3,strides=[1,1,1,1],padding='SAME')conv3b=tf.nn.bias_add(conv3a,b3)conv3c=tf.nn.relu(conv3b) '''池化层三'''conv3d=tf.nn.max_pool(conv3c,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')conv3=tf.reshape(conv3d,[-1,W4.get_shape().as_list()[0]])#扁平化'''全连接层'''FCa=tf.matmul(conv3,W4)+b4FC=tf.nn.relu(FCa)'''输出层'''Y_=tf.matmul(FC,W5)+b5 Y=tf.nn.softmax(Y_,name="output")#经历softmax分类激活函数后的数值'''损失'''cross_entropy=tf.nn.softmax_cross_entropy_with_logits(logits=Y_, labels=Yout)loss=tf.reduce_mean(cross_entropy)*100#交叉损失correct_prediction=tf.equal(tf.argmax(Y,1),tf.argmax(Yout,1))accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32),name='accuracy')#正确率'''优化器'''trainer=tf.train.RMSPropOptimizer(learning_rate=0.001,momentum=0.9).minimize(loss)init=tf.global_variables_initializer()#变量初始化赋值器with tf.Session() as sess: sess.run(init)#变量初始化out_init=sess.run(accuracy,feed_dict={Xin:x_tr[0:20000],Yout:y_tr[0:20000]})#计算初始误差print("初始准确率为:{:.4f}%".format(out_init*100))#输出初始误差for epoch in range(training_epochs):#训练步数print("当前训练步为第{}步".format(epoch+1))batch_size=int(len(y_tr)/batch_count)#当前子集大小for i in range(batch_count):#对每个子集遍历训练batch_x,batch_y=nextBatch([x_tr[0:20000],y_tr[0:20000]],batch_size,i)#当前子集的训练集特征和标签数据sess.run(trainer,feed_dict={Xin:batch_x,Yout:batch_y})out=sess.run(accuracy,feed_dict={Xin:x_tr[0:20000],Yout:y_tr[0:20000]})#计算当前误差print("当前准确率为:{:.4f}%".format(out*100))#当前初始误差'''当前会话存储'''if out>out_init:out_init=outsaver=tf.train.Saver()saver.save(sess,r".\savefile\CNN\FigureCNN.ckpt")returndef main_test():(x_tr0,y_tr0),(x_te0,y_te0)=tf2.keras.datasets.mnist.load_data()#手写数据库y_tr=np.zeros((len(y_tr0),10))y_te=np.zeros((len(y_te0),10))for i in range(len(y_tr0)):y_tr[i][y_tr0[i]]=1for i in range(len(y_te0)):y_te[i][y_te0[i]]=1x_tr=x_tr0.reshape(-1,28,28,1)x_te=x_te0.reshape(-1,28,28,1)road=[r".\savefile\CNN\FigureCNN.ckpt.meta",r".\savefile\CNN\FigureCNN.ckpt"]sess=tf.InteractiveSession()new_saver=tf.train.import_meta_graph(road[0])new_saver.restore(sess,road[1])tf.get_default_graph().as_graph_def()Xin=sess.graph.get_tensor_by_name('Xin:0')Yout=sess.graph.get_tensor_by_name("Yout:0") accuracy=sess.graph.get_tensor_by_name('accuracy:0')Y=sess.graph.get_tensor_by_name('output:0')Ote=sess.run(accuracy,feed_dict={Xin:x_te,Yout:y_te})print("测试集准确率为:{:.4f}%".format(Ote*100))Ote=sess.run(accuracy,feed_dict={Xin:x_tr[30000:40000],Yout:y_tr[30000:40000]})print("训练集集准确率为:{:.4f}%".format(Ote*100))u=eval(input("输入0-9999之间的一个整数:"))if (u<0) or (u>9999):print('错误!')sess.close()returnOtem=sess.run(Y,feed_dict={Xin:[x_te[u]]})print('手写的数字为:{}'.format(Otem.argmax()))plt.imshow(x_te[u].reshape(28,28))plt.show()#手写数字展示for i in [0,2,4,5,9]:roadpic=r'.\picturefile\handwriting'+str(i)+'.jpg'pic=cv2.imread(roadpic,flags=0)pic1=255-picpic=pic1.reshape(-1,28,28,1)Otem=sess.run(Y,feed_dict={Xin:pic})print('高攀手写的数字为:{}'.format(Otem.argmax()))plt.imshow(pic1)plt.show()#手写数字展示sess.close()returnif __name__=="__main__":tf.disable_v2_behavior()os.environ['TF_CPP_MIN_LOG_LEVEL']='2'main_train()main_test()

运行结果:


python+tensorflow CNN卷积神经网络手写字体识别相关推荐

  1. TensorFlow 高级之二 (卷积神经网络手写字体识别)

    文章目录 一.数据集获取 二.数据感知与处理 2.1 导包 2.2 导入数据 2.3 把标签转换为one-hot格式 2.4. 数据维度 2.5. 打印部分样例图片 三.创建神经网络 3.1 定义网络 ...

  2. 利用python卷积神经网络手写数字识别_卷积神经网络使用Python的手写数字识别

    为了使机器更智能,开发人员正在研究机器学习和深度学习技术.人类通过反复练习和重复执行任务来学习执行任务,从而记住了如何执行任务.然后,他大脑中的神经元会自动触发,它们可以快速执行所学的任务.深度学习与 ...

  3. 卷积神经网络 手写数字识别(包含Pytorch实现代码)

    Hello!欢迎来到六个核桃Lu! 运用卷积神经网络 实现手写数字识别 1 算法分析及设计 卷积神经网络: 图1-2 如图1-2,卷积神经网络由若干个方块盒子构成,盒子从左到右仿佛越来越小,但却越来越 ...

  4. 利用python卷积神经网络手写数字识别_Keras深度学习:卷积神经网络手写数字识别...

    引言:最近在闭关学习中,由于多久没有写博客了,今天给大家带来学习的一些内容,还在学习神经网络的同学,跑一跑下面的代码,给你一些自信吧!Nice 奥里给! 正文:首先该impor的库就不多说了,不会的就 ...

  5. 《TensorFlow实例一 MINIST手写字体识别》

    Ubuntu python3 TensorFlow实例:使用RNN算法实现对MINST-data数字集识别,最终识别准确率达96.875% PS:小白一个,初级阶段,从调试到实现,step by st ...

  6. 构建神经网络- 手写字体识别案例

    神经网络构建: Multilayer_Perceptron.py: import numpy as np from utils.features import prepare_for_training ...

  7. 神经网络学习(二)Tensorflow-简单神经网络(全连接层神经网络)实现手写字体识别

    神经网络学习(二)神经网络-手写字体识别 框架:Tensorflow 1.10.0 数据集:mnist数据集 策略:交叉熵损失 优化:梯度下降 五个模块:拿数据.搭网络.求损失.优化损失.算准确率 一 ...

  8. TensorFlow 2.0 mnist手写数字识别(CNN卷积神经网络)

    TensorFlow 2.0 (五) - mnist手写数字识别(CNN卷积神经网络) 源代码/数据集已上传到 Github - tensorflow-tutorial-samples 大白话讲解卷积 ...

  9. python cnn代码详解图解_基于TensorFlow的CNN实现Mnist手写数字识别

    本文实例为大家分享了基于TensorFlow的CNN实现Mnist手写数字识别的具体代码,供大家参考,具体内容如下 一.CNN模型结构 输入层:Mnist数据集(28*28) 第一层卷积:感受视野5* ...

最新文章

  1. 在桌面右键菜单,停止工作,并提示“资源管理器停止工作”等情况。
  2. JAVA设计模式(09):结构型-代理模式(Proxy)
  3. 【RecyclerView】 十四、GridLayoutManager 网格布局管理器 ( GridLayoutManager.SpanSizeLookup 指定 item 元素占用网格个数 )
  4. Maximal Square 我们都在寻找最高1子矩阵(leeCode)
  5. java怎么用return代替else_java – 从一个隐含或明确的“else”方法返回,还是用一个“return”语句返回?...
  6. 复选框操作checked选中为true,反之为False,也可以赋值为true,false
  7. Python2.7.16安装(Win10)
  8. 【设计模式】适配器模式 Adapter Pattern
  9. MySQL(26)--- 索引
  10. 微波接力通信、卫星通信、无线移动通信
  11. jsp或java中前后台传值乱码解决
  12. Full-Mesh 帧中继
  13. Python爬虫解析htm时lxml的HtmlElement对象获取和设置inner html方法
  14. 使用 virt-install 创建虚拟机
  15. c++中static关键字的用法总结
  16. EGE基础:键盘输入篇
  17. bootstrap文件上传插件
  18. SpaceSyntax【空间句法】之DepthMapX学习:第二篇 输出了什么东西 与 核心概念
  19. 飞塔防火墙密码忘记重置方法
  20. ubuntu 自动切换壁纸

热门文章

  1. 2020年鼠年正月十二 淡然面对
  2. 机器学习中用到的概率知识_学习机器学习前,你首先要掌握这些概率论基础知识...
  3. 二叉树层次遍历(借助队列实现)
  4. 在V2EX的开发环境里尝试了一下OneAPM @livid
  5. ora-12514TNS 监听程序当前无法识别连接描述符中请求服务的解决
  6. linux修改BCD文件,关于BCDEdit 命令的使用
  7. 苹果手机充电口接触不良怎么办_苹果连充电口都要干掉?
  8. java打印星型_初识java java入门知识 基础知识 打印各种星型图形 源代码
  9. [转]OKR结合CFR的管理模式
  10. python怎么打下划线符号_详解 Python 中的下划线命名规则