摘要:本文将讲解TensorFlow如何保存变量和神经网络参数,通过Saver保存神经网络,通过Restore调用训练好的神经网络。本文分享自华为云社区《[[Python人工智能] 十一.Tensorflow如何保存神经网络参数 丨【百变AI秀】](https://bbs.huaweicloud.com/b...)》,作者:eastmount。1.保存变量通过tf.Variable()定义weight和bias变量,然后调用tf.train.Saver()保存变量,将数据保存到本地“my_net/save_net.ckpt”文件。#-*-编码:utf-8-*-"""创建于ThuJan220:04:572020@author:xiuzhangEastmountCSDN"""importtensorflowastfimportnumpyasnp#-------------------------------------保存文档--------------------------------------W=tf.Variable([[1,2,3],[3,4,5]],dtype=tf.float32,name='weights')#数据2行3列b=tf.Variable([[1,2,3]],dtype=tf.float32,name='biases')#初始化init=tf.initialize_all_variables()#定义saver来存储各种变量saver=tf.train.Saver()#使用Session运行初始化与tf.Session()assess:sess.run(init)#保存官方保存格式为ckptsave_path=节省。save(sess,"my_net/save_net.ckpt")print("Savetopath:",save_path)"Savetopath:my_net/save_net.ckpt"保存成功如下图:打开内容如下图如下图:然后定义Mark变量train,通过Restore操作使用我们保存的变量。注意Restore时需要定义相同的dtype和shape,不需要再定义init。最后直接通过saver.restore(sess,“my_net/save_net.ckpt”)提取保存的变量并输出。#-*-coding:utf-8-*-"""CreatedonThuJan220:04:572020@author:xiuzhangEastmountCSDN"""importtensorflowastfimportnumpyasnp#Markvariabletrain=False#---------------------------------------保存文件--------------------------------------#Saveiftrain==True:#定义变量W=tf.Variable([[1,2,3],[3,4,5]],dtype=tf.float32,name='weights')#数据2行3列b=tf.Variable([[1,2,3]],dtype=tf.float32,name='biases')#初始化init=tf.global_variables_initializer()#定义saver来存储各种变量saver=tf.train.Saver()#使用Session运行初始化withtf.Session()assess:sess.run(init)#保存官方保存格式为ckptsave_path=saver.save(sess,"my_net/save_net.ckpt")print("Savetopath:",save_path)#--------------------------------------恢复变量-----------------------------------#Restoreiftrain==False:#Restore时记得定义相同的dtype和shape#重新定义相同的shapeand变量类型相同W=tf.Variable(np.arange(6).reshape((2,3)),dtype=tf.float32,name='weights')#空变量b=tf.Variable(np.arange(3).reshape((1,3)),dtype=tf.float32,name='biases')#空变量#恢复不需要定义initsaver=tf.train.Saver()withtf.Session()assess:#提取保存的变量saver.restore(sess,"my_net/save_net.ckpt")#查找同名同标识的变量存入W和bprint("weights",sess.run(W))print("biases",sess.run(b))运行代码,如果报告错误“NotFoundError:从检查点恢复失败。这很可能是由于检查点中缺少变量名称或其他图形键。请确保您没有更改基于检查点的预期图形.",需要重新设置Spyder才能最终输出之前保存的变量,权重为[[1,2,3],[3,4,5]],偏置为[[1,2,3]].2.拯救神经网络那么,TensorFlow是如何拯救我们的神经网络框架的呢?我们需要在保存之前训练整个网络。方法和上面类似。完整代码如下:"""创建于SunDec2919:21:082019@author:xiuzhangEastmountCSDN"""importosimportglobimportcv2importnumpyasnpimporttensorflowastf#定义图片路径path='photo/'#--------------------------------第一步读取图像----------------------------------defread_img(path):cate=[path+xforxinos.listdir(path)ifos.path.isdir(path+x)]imgs=[]labels=[]fpath=[]foridx,folderinenumerate(cate):#遍历整个目录判断每个文件是否符合foriminglob.glob(folder+'/*.jpg'):#print('读取图像:%s'%(im))img=cv2.imread(im)#调用opencv库读取像素点img=cv2.resize(img,(32,32))#图片像素大小一致imgs.append(img)#图片数据labels.append(idx)#图片类标签fpath.append(path+im)#图片路径名#print(path+im,idx)返回np.asarray(fpath,np.string_),np.asarray(imgs,np.float32),np.asarray(labels,np.int32)#读取图像fpaths,data,label=read_img(path)print(data.shape)#(1000,256,256,3)#计算图片有多少类num_classes=len(set(label))print(num_classes)#生成算术序列随机调整图片顺序num_example=data.shape[0]arr=np.arange(num_example)np.random.shuffle(arr)data=data[arr]label=label[arr]fpaths=fpaths[arr]#splittrainingsetandtestset80%trainingset20%testsetratio=0.8s=np.int(num_example*ratio)x_train=data[:s]y_train=label[:s]fpaths_train=fpaths[:s]x_val=data[s:]y_val=label[s:]fpaths_test=fpaths[s:]print(len(x_train),len(y_train),len(x_val),len(y_val))#800800200200print(y_val)#-------------------------------第二步搭建神经网络--------------------------------#DefinePlaceholderxs=tf.placeholder(tf.float32,[None,32,32,3])#每张图32*32*3个点ys=tf.placeholder(tf.int32,[None])#每个样本有1个输出#存放DropOut参数的容器drop=tf.placeholder(tf.float32)#训练时为0.25,测试时为0#定义卷积层conv0conv0=tf.layers.conv2d(xs,20,5,activation=tf.nn.relu)#20个卷积核卷积核大小为5Reluactivation#定义最大池化层pool0pool0=tf.layers.max_pooling2d(conv0,[2,2],[2,2])#The池化窗口为2x2,步长为2x2print("Layer0:\n",conv0,pool0)#定义卷积层conv1conv1=tf.layers.conv2d(pool0,40,4,activation=tf.nn.relu)#40个卷积核卷积核的大小为4Reluactivation#定义max-pooling层pool1pool1=tf.layers.max_pooling2d(conv1,[2,2],[2,2])#poolingwindow为2x2,步长为2x2print("Layer1:\n",conv1,pool1)#将3维特征转化为1维向量flatten=tf.layers.flatten(pool1)#将全连接层转化为长度为400的特征向量fc=tf.层。dense(flatten,400,activation=tf.nn.relu)print("Layer2:\n",fc)#添加DropOut防止过拟合dropout_fc=tf.layers.dropout(fc,drop)#inactiveoutputLayerlogits=tf.layers.dense(dropout_fc,num_classes)print("Output:\n",logits)#定义输出结果predicted_labels=tf.arg_max(logits,1)#------------------------------第三步定义损失函数和优化器---------------------------------#使用交叉熵定义loss=tf.nn.softmax_cross_entropy_with_logits(labels=tf.one_hot(ys,num_classes),#convertinputone-hot类型数据的输出logits=logits)#平均损失mean_loss=tf.reduce_mean(losses)#定义优化器的学习效率,设置为0.0001optimizer=tf.train.AdamOptimizer(learning_rate=1e-4)。minimize(losses)#------------------------------------第四步模型训练和prediction--------------------------------#用于保存和加载模型saver=tf.train.Saver()#训练或预测train=False#模型文件路径model_path="model/image_model"withtf.Session()assess:iftrain:print("trainingmode")#训练初始化参数sess.run(tf.global_variables_initializer())#定义输入用Label填充容器时,dropout为0.25train_feed_dict={xs:x_train,ys:y_train,drop:0.25}#训练学习1000次forstepinrange(1000):_,mean_loss_val=sess.run([optimizer,mean_loss],feed_dict=train_feed_dict)ifstep%50==0:#每50次输出一次结果print("step={}\tmeanloss={}".format(step,mean_loss_val))#保存模型saver.保存(sess,model_path)print("训练结束,保存模型到{}".format(model_path))else:print("测试模式")#测试加载参数saver.restore(sess,model_path)print("从{}加载模型".format(model_path))#标签和名称映射label_name_dict={0:"Human",1:"Beach",2:"Building",3:"Bus",4:"Dinosaur",5:"BigElephant",6:"Flower",7:"WildHorse",8:"SnowMountain",9:"Food"}#定义在dropout为0时填充容器的input和Labeltest_feed_dict={xs:x_val,ys:y_val,drop:0}#真实标签和模型预测标签predicted_labels_val=sess.run(predicted_labels,feed_dict=test_feed_dict)forfpath,real_label,predicted_labelinzip(fpaths_test,y_val,predicted_labels_val):#Convertlabelidtolabelname=real_labellabel_name_dict[real_label]predicted_label_name=label_name_dict[predicted_label]print("{}\t{}=>{}".format(fpath,real_label_name,predicted_label_name))#评价结果print("正确预测个数:",sum(y_val==predicted_labels_val))print("准度为:",1.0*sum(y_val==predicted_labels_val)/len(y_val))核心步骤为:saver=tf.train.Saver()model_path="model/image_model"withtf.Session()assess:iftrain:#保存神经网络sess.run(tf.global_variables_initializer())对于范围内的步骤(1000):_,mean_loss_val=sess.run([优化器,mean_loss],feed_dict=train_feed_dict)如果步骤%50==0:打印(“step={}\tmeanloss={}”。format(step,mean_loss_val))saver.save(sess,model_path)else:#加载神经网络saver.restore(sess,model_path)predicted_labels_val=sess.run(predicted_labels,feed_dict=test_feed_dict)forfpath,real_label,predicted_labelinzip(fpaths_test,y_val,predicted_labels_val):real_label_name=label_name_dict[real_label]predicted_label_name=label_name_dict[predicted_label]print("{}\t{}=>{}".format(fpath,real_label_name,predicted_label_name))预测输出结果如下图所示,最终预测正确181张图片,精度为0.905phase,与之前机器学习KNN的0.500相比,有非常高的提升。测试模式信息:tensorflow:从model/image_modelb'photo/photo/3\\335.jpg'bus=>busb'photo/photo/1\\129.jpg'beach=从model/image_model加载模型恢复参数>海滩b'photo/photo/7\\740.jpg'野马=>野马b'photo/photo/5\\564.jpg'大象=>大象...b'photo/photo/9\\974.jpg'food=>foodb'photo/photo/2\\220.jpg'building=>busb'photo/photo/9\\912.jpg'food=>foodb'photo/photo/4\\459.jpg'Dinosaur=>Dinosaurb'photo/photo/5\\525.jpg'Elephant=>Elephantb'photo/photo/0\\44.jpg'Human=>人类正确预测的数量:181准确度:0.905点击关注,第一时间了解华为云的新鲜技术~
