python算法专项(七)——Tensorflow三层网络(进阶),训练手写字数据集、模型保存、tensorboard可视化

python算法专项(七)——Tensorflow三层网络(进阶),训练手写字数据集、模型保存、tensorboard可视化,第1张

概述基于算法专项六,的tensorflow原理,用三层网络结构进行训练手写字数据集目录1-手写数字数据集1.1数据集下载1.2数据集读取1.3进行各种样式的显示测试1.3.1显示单张样本1.3.1显示多张样本在一张影像上1.3.1显示多张样本在一张影像上并且在每张影像外面加白框2-用tensorflow

基于算法专项六,的tensorflow原理,用三层网络结构进行训练手写字数据集

目录1-手写数字数据集@H_403_13@1.1数据集下载@H_403_13@1.2数据集读取@H_403_13@1.3进行各种样式的显示测试@H_403_13@1.3.1显示单张样本@H_403_13@1.3.1显示多张样本在一张影像上@H_403_13@1.3.1显示多张样本在一张影像上并且在每张影像外面加白框@H_403_13@@H_403_13@@H_403_13@2-用tensorflow框架搭建三层网络,训练手写字数据集@H_403_13@2.1技巧1,用全连接方法代替专项六中的矩阵相乘并加上偏置项 *** 作@H_403_13@2.2tensorflow补充知识@H_403_13@1、tf.one_hot()使用@H_403_13@2、tf.nn.softmax()使用@H_403_13@3、tf.argmax()@H_403_13@4、tf.square()@H_403_13@5、tf.reduce_mean()@H_403_13@@H_403_13@@H_403_13@3-用tensorflow框架搭建三层神经网络来训练、预测手写字数据集@H_403_13@4-用tensorflow模型保存方法@H_403_13@5-用tensorboard训练过程的可视化@H_403_13@@H_403_13@

1-手写数字数据集

手写数字数据集是一个公开的数据集,可以网上下载,也可以通过tensorflow包进行下载,下面我也提供了下载方式

1.1数据集下载

点击链接进行下载(粉丝免费下载)
下载后解压到一个目录下,我的是解压在“E:/03_study/FangTeacher/PythonCode/2021.2.28/MNIST_data”路径下,如下图:

1.2数据集读取

使用下面tensorflow的方法进行读取

from tensorflow.examples.tutorials.mnist.input_data import read_data_setsdss = read_data_sets("E:/03_study/FangTeacher/PythonCode/2021.2.28/MNIST_data")#传入数据集解压目录print(dss.train.num_examples)#返回集合大小,训练集print(dss.valIDation.num_examples)#验证集print(dss.test.num_examples)#测试集数据imgs,labels = dss.train.next_batch(100)#imgs:[100,784],labels:[100]取出了100张图片,每个图片大小是784(28*28)个像素的数组;有100个标签,标签是0~9之间的一个数,取出是随机取的print(labels)#输出标签,标签是0~9之间的一个数;同时获取了100个就依次装在列表里
1.3进行各种样式的显示测试

按照上面代码来看,因为通过next_batch(100)方法读取到的图片格式是[100,784]的形状,我们如果只显示其中某一张可以对他按照imgs[i]来取,但是取到的只是784长度的一维数组,所以需要用numpy来进行变换成二维图像,然后才能显示

1.3.1显示单张样本
#利用numpy变化和opencv进行图片数据显示import numpy as npimport cv2dss = read_data_sets("E:/03_study/FangTeacher/PythonCode/2021.2.28/MNIST_data")#传入数据集解压目录imgs,labels = dss.train.next_batch(100)#imgs:[100,784],labels:[100]取出了100张图片,每个图片大小是784(28*28)img = np.reshape(imgs[0],[28,28])cv2.imshow("Src_img",img)cv2.waitKey(0)

成功显示,如下图

1.3.1显示多张样本在一张影像上
#利用numpy变化和opencv进行图片数据显示#把100张样本显示在一张图片上,横着10个图,竖着10个图import numpy as npimport cv2dss = read_data_sets("E:/03_study/FangTeacher/PythonCode/2021.2.28/MNIST_data")#传入数据集解压目录imgs,labels = dss.train.next_batch(100)#imgs:[100,784],labels:[100]取出了100张图片,每个图片大小是784(28*28)cols = 10imgs = np.reshape(imgs,[-1,cols,28,28])#1-改编形状imgs = np.transpose(imgs,[0,2,1,3])#2-进行轴变换,使得像素在正确位置上imgs = np.reshape(imgs,[-1,28*cols])#每行高度28个像素,最后依次resizecv2.imshow("Src_imgs",imgs)cv2.waitKey(0)

1.3.1显示多张样本在一张影像上并且在每张影像外面加白框
#利用numpy变化和opencv进行图片数据显示#把100张样本显示在一张图片上,横着10个图,竖着10个图import numpy as npimport cv2dss = read_data_sets("E:/03_study/FangTeacher/PythonCode/2021.2.28/MNIST_data")#传入数据集解压目录imgs,labels = dss.train.next_batch(100)#imgs:[100,784],labels:[100]取出了100张图片,每个图片大小是784(28*28)cols = 10imgs = np.reshape(imgs,[-1,cols,28,28])#1-改编形状#下面几行是白框效果核心代码imgs[:,:,27,:]=1.0#在每行下面增加一条白线,就是在行的纬度第27行都设置为1即可imgs[:,:,0,:]=1.0#在每行下面增加一条白线,就是在行的纬度第0行都设置为1即可imgs[:,:,:,0] = 1.0#竖直方向设置白线imgs[:,:,:,27] = 1.0imgs = np.transpose(imgs,[0,2,1,3])#2-进行轴变换,使得像素在正确位置上imgs = np.reshape(imgs,[-1,28*cols])#每行高度28个像素,最后依次resizecv2.imshow("Src_imgs",imgs)cv2.waitKey(0)

显示效果:

2-用tensorflow框架搭建三层网络,训练手写字数据集2.1技巧1,用全连接方法代替专项六中的矩阵相乘并加上偏置项 *** 作

专项六中的全连接代码


上图红框中的矩阵相乘,和相加 *** 作用tensorflow中的层全连接一行代码搞定

t = tf.layers.dense(x,MID_Num,activation=tf.nn.relu)#全连接层,包含了矩阵相乘,相加,和激活,最后的形状[-1,MID_Num]
2.2tensorflow补充知识1、tf.one_hot()使用
功能:将输入的列表变成向量形式的独热编码输入:第一个参数是输入要转换的数据,第二个参数是编码长度。编码长度应该要大于等于输入数据长度,否则会表达不全。输出:dure向量形式的独热编码程序运行样例:

编码长度过长,如下图代码测试,感觉还是可以的,每个数据都具有唯一的编码

编码长度设置过短,如下图代码测试,感觉不行,有些编码重复了

2、tf.nn.softmax()使用
功能:将float类型的数据转换为概率。输入:float类型的数组数据输出:0~1之间的浮点型数据,每个数据占总样本的概率。(个人理解应该是将输入的数都归一化到0~1之间,而这个值可以作为概率使用,后面公式可以说明这点)转换公式:若输入数据为[a1,a2,a3,a4]1、分别对每个元素求解以e为底的数,[e^a1,e^a2,e^a3,e^a4](目的是将列表中所有数都转换为正数)2、求出上述四个数的和   All_Sum = e^a1+e^a2+e^a3+e^a43、用第一步列表中的每个元素除以All_Sum的值就是输出概率。为验证上述公式的正确性,举个例子:题目:输入数据为[-1.0,2.0,-2.0,0]四个数据

公式代码测试

# 输入数据为[-1.0,2.0,-2.0,0]四个数据import matha = [-1.0,2.0,-2.0,0]a_e = [(math.e**i) for i in a ]print("e^a List :",a_e)All_Sum = sum(a_e)P = [(i/All_Sum) for i in a_e]print("最后概率列表:",P)

用tf.nn.softmax()程序运行样例:


通过上面两个测试代码可以发现,softmax函数输出的结果和公式方法验证的结果一致,如果进行排序会发现输入的数据越小,则处理后的结果也越小,如最小的是-2对应的是0.0152,也是这一串数字中最小的,所以我认为这个公式也是归一化的一种处理形式,只不过结果可以用来当概率进行使用。

3、tf.argmax()
功能:返回列表中最大值的位置标签输入:numpy数组列表输出:一个标量值

程序运行样例:

测试程序1:


测试程序2:


程序1中最大值为2,它所在位置为1,所以返回是1
程序2中最大值为7,它所在位置为7,所以返回是7

4、tf.square()
功能:对数组中每个元素进行平方输入:numpy数组数据输出:平方后的数组例如:输入[1,2,3,4,5] 输出则是[1^2,2^2,3^2,4^2,5^2] ==> [1,4,9,16,25]

程序运行样例:

5、tf.reduce_mean()
功能:对列表中元素求平均值输入:numpy列表元素输出:所有元素的平均值,一个标量值公式:a = [1,2,3,4,5]sum_all = sum(a)reduce_mean = sum_all/len(a)例如1:输入列表[1,2,3,4,5]sum_all = 15reduce_mean = 15/5 = 3例2:输入列表[11,14,15,20,31]sum_all = 11+14+15+20+31 = 91len(a) = 5reduce_mean = 91/5 = 18.2(由于输入的是整型,输出的就是18,如下验证代码)

程序运行验证代码
例1:

例2:输入的是整型数据,所以结果输出平均值的是浮点类型


例3:输入的是浮点数,所以结果输出平均值的是浮点类型

3-用tensorflow框架搭建三层神经网络来训练、预测手写字数据集
from tensorflow.examples.tutorials.mnist.input_data import read_data_setsimport tensorflow as tfimport osclass Tesnsors():#搭建网络模型    def __init__(self,mID_units = 2000):        self.imgs = tf.placeholder(tf.float32,[None,28*28],"imgs")        self.lable = tf.placeholder(tf.int32,[None],"lable")        self.lr = tf.placeholder(tf.float32,[],"lr")        t = tf.layers.dense(self.imgs,mID_units,activation=tf.nn.relu)        t = tf.layers.dense(t,10)        self.predict = tf.argmax(t,axis=1,output_type=tf.int32)        p = tf.nn.softmax(t)#默认是第0纬度        lables = tf.one_hot(self.lable,10)        self.loss = tf.reduce_mean(tf.square(p-lables))        self.output = tf.sqrt(self.loss)#对loss开方        # opt = tf.train.AdamOptimizer(self.lr)        opt = tf.train.GradIEntDescentoptimizer(self.lr)        self.train_opt = opt.minimize(self.loss)        temp = tf.equal(self.predict,self.lable,"zhibiao")        temp = tf.cast(temp,tf.float32)#数据转换        self.predicsion = tf.reduce_mean(temp)#求平均值,作为精度        tf.summary.scalar("loss",self.output)        tf.summary.scalar("pression",self.predicsion)        self.summary_op = tf.summary.merge_all()class Modle:#定义模型类,包含训练、预测、可视化    def __init__(self,session,batch_size = 200,epoch = 200,lr = 0.001):        self.dss = read_data_sets("E:/03_study/FangTeacher/PythonCode/2021.2.28/MNIST_data")#读取数据        self.tensor = Tesnsors()        self.batch_size = batch_size        self.lr = lr        self.epoch = epoch        self.session = session        self.logdir = "./logs/p31/"        # self.savePath = make_dirs("./Model/P31_Mnist/p31")        self.savePath = "./Model/P31_Mnist/p31"        self.saver = tf.train.Saver()        try:            self.saver.restore(self.session,save_path=self.savePath)            print("restore success %s modle"%self.savePath)        except:            self.session.run(tf.global_variables_initializer())            print("restore fail %s modle"%self.savePath)    def train(self):        batchs = self.dss.train.num_examples//self.batch_size        ts = self.tensor        loss = 0        fw = tf.summary.fileWriter(self.logdir,graph=tf.get_default_graph())        global_step = 0        with fw:            print("Start train...")            for epoch in range(self.epoch):                for _ in range(batchs):                    img,lable = self.dss.train.next_batch(self.batch_size)                    _ ,loss,summary = self.session.run((ts.train_opt,ts.loss,ts.summary_op),{ts.imgs:img,ts.lr:self.lr,ts.lable:lable})                    fw.add_summary(summary,global_step)                    global_step +=1                print("epoch:%s ,loss:%s"%(epoch,loss))                self.saver.save(self.session,self.savePath)                print("Save the model into %s sucession"%self.savePath)        print("Train finish!")    def test(self):        imgs, lable = self.dss.test.next_batch(self.batch_size)        _,predIISion = self.session.run((self.tensor.predict,self.tensor.predicsion),{self.tensor.imgs:imgs,self.tensor.lable:lable})# def make_dirs(path_and_name:str):#如果文件夹不存在则进行新建#     pos = path_and_name.rfind(os.sep)#     if pos >=0:#         path = path_and_name[:pos+1]#         os.makedirs(path,exist_ok=True)#重复创建不报错#         print("The path %s is made."%path)#     return path_and_nameif __name__ == '__main__':    with tf.Session() as session:        modle = Modle(session)        modle.train()        modle.test()
4-用tensorflow模型保存方法

上面代码解析,模型保存方法:
1、设置模型保存路径,需设置模型保存文件名,例如:
self.savePath = “./Model/P31_Mnist/p31” "./Model/P31_Mnist/"为模型文件保存路径,p31为保存的模型名称
2、定义模型保存方法为成员变量 self.saver = tf.train.Server()
3、加载模型 self.saver.restor(self.session,save_path = self.savePath)#把模型加载到self.session变量中
4、保存模型 self.saver.save(self.session,self.savePath)#训练一段时间后将session进行保存,保存后会自动覆盖上一次结果

5-用tensorboard训练过程的可视化

上面代码解析,tensorboard可视化步骤:
第一步设置日志目录
tensorboard --logdir=path(path为数据所在文件夹路径) --host=127.0.0.1 --port 6006
–logdir:日志文件的位置(如果不存在,则要单独新建一个日志目录)
–host:主机名(如果给出的网站打不开,则需要设置主机名)
–port:端口,可以使用默认的,也可以使用指定的端口
设置完成后会d出你可以访问的网站,从这个网站上进行监视你要监控的变量

第二步骤:
从代码中进行设置哪些变量要进行监控,在搭建网络的时候把loss损失和进度分别加入到summary中,最后进行汇总成summary_op,便于一次计算得出,下面只监控了两个变量(output和precision)

tf.summary.scalar(“loss”,self.output)#输出output,本质也是loss
tf.summary.scalar(“precision”,self.precision)#输出验证精度
self.summary_op = tf.summary.merge_all()#把前面两步 *** 作合并到一步 *** 作,可以在输出的时候计算summary_op就行了

第三步:
在训练过程中把summary_op计算出来,然后添加进去
fw = tf.summary.fileWriter(self.logdir)
global_step = 0

第四步
在tran的过程中,计算出summary_op
_,loss,summary = self.session.run([ts.train_op,ts.loss,ts.summary_op],{ts.lr:self.lr,ts.img:imgs,ts.label:labels})
fw.add_summary(summary,global_step)#把日志写进去
global_step+=1

模型监视界面:

@H_983_301@

总结

以上是内存溢出为你收集整理的python算法专项(七)——Tensorflow三层网络(进阶),训练手写字数据集、模型保存、tensorboard可视化全部内容,希望文章能够帮你解决python算法专项(七)——Tensorflow三层网络(进阶),训练手写字数据集、模型保存、tensorboard可视化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1188748.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存