基于tensorflow使用全连接层函数实现多层神经网络并保存和读取模型
使用之前那个格式写法到后面层数多的话会很乱,所以编写了一个函数创建层,这样看起来可读性高点也更方便整理后期修改维护
- #全连接层函数
- def fcn_layer(
- inputs, #输入数据
- input_dim, #输入层神经元数量
- output_dim,#输出层神经元数量
- activation =None): #激活函数
- W = tf.Variable(tf.truncated_normal([input_dim,output_dim],stddev = 0.1))
- #以截断正态分布的随机初始化W
- b = tf.Variable(tf.zeros([output_dim]))
- #以0初始化b
- XWb = tf.matmul(inputs,W)+b # Y=WX+B
- if(activation==None): #默认不使用激活函数
- outputs =XWb
- else:
- outputs = activation(XWb) #代入参数选择的激活函数
- return outputs #返回
- #各层神经元数量设置
- H1_NN = 256
- H2_NN = 64
- H3_NN = 32
- #构建输入层
- x = tf.placeholder(tf.float32,[None,784],name='X')
- y = tf.placeholder(tf.float32,[None,10],name='Y')
- #构建隐藏层
- h1 = fcn_layer(x,784,H1_NN,tf.nn.relu)
- h2 = fcn_layer(h1,H1_NN,H2_NN,tf.nn.relu)
- h3 = fcn_layer(h2,H2_NN,H3_NN,tf.nn.relu)
- #构建输出层
- forward = fcn_layer(h3,H3_NN,10,None)
- pred = tf.nn.softmax(forward)#输出层分类应用使用softmax当作激活函数
这样写方便后期维护 不必对着一群 W1 W2..... Wn
接下来记录一下保存模型的方法
- #保存模型
- save_step = 5 #储存模型力度
- import os
- ckpt_dir = '.ckpt_dir/'
- if not os.path.exists(ckpt_dir):
- os.makedirs(ckpt_dir)
5轮训练保存一次,以后大模型可以调高点,接下来需要在模型整合处修改一下
- saver = tf.train.Saver() #声明完所有变量以后,调用tf.train.Saver开始记录
- 和
- if(epochs+1) % save_step == 0:
saver.save(sess, os.path.join(ckpt_dir,"mnist_h256_model_{:06d}.ckpt".format(epochs+1)))#储存模型
print("mnist_h256_model_{:06d}.ckpt saved".format(epochs+1))#输出情况
至此储存模型结束
接下来是还原模型,要注意还原的模型层数和神经元数量大小需要和之前储存模型的大小一致。
第一步设置保存模型文件的路径
- #必须指定存储位置
- ckpt_dir = "/ckpt_dir/"
存盘只会保存最近的5次,恢复会恢复最新那一份
- #恢复模型,创建会话
- saver = tf.train.Saver()
- sess = tf.Session()
- init = tf.global_variables_initializer()
- sess.run(init)
- ckpt = tf.train.get_checkpoint_state(ckpt_dir)#选择模型保存路径
- if ckpt and ckpt.model_checkpoint_path:
- saver.restore(sess ,ckpt.model_checkpoint_path)#从已保存模型中读取参数
- print("Restore model from"+ckpt.model_checkpoint_path)
至此模型恢复完成 下面可以选择继续训练或者评估使用
最后附上完整代码
- import tensorflow as tf
- import tensorflow.examples.tutorials.mnist.input_data as input_data
- import numpy as np
- import matplotlib.pyplot as plt
- from time import time
- mnist = input_data.read_data_sets("data/",one_hot = True)
- #导入Tensorflwo和mnist数据集等 常用库
- #全连接层函数
- def fcn_layer(
- inputs, #输入数据
- input_dim, #输入层神经元数量
- output_dim,#输出层神经元数量
- activation =None): #激活函数
- W = tf.Variable(tf.truncated_normal([input_dim,output_dim],stddev = 0.1))
- #以截断正态分布的随机初始化W
- b = tf.Variable(tf.zeros([output_dim]))
- #以0初始化b
- XWb = tf.matmul(inputs,W)+b # Y=WX+B
- if(activation==None): #默认不使用激活函数
- outputs =XWb
- else:
- outputs = activation(XWb) #代入参数选择的激活函数
- return outputs #返回
- #各层神经元数量设置
- H1_NN = 256
- H2_NN = 64
- H3_NN = 32
- #构建输入层
- x = tf.placeholder(tf.float32,[None,784],name='X')
- y = tf.placeholder(tf.float32,[None,10],name='Y')
- #构建隐藏层
- h1 = fcn_layer(x,784,H1_NN,tf.nn.relu)
- h2 = fcn_layer(h1,H1_NN,H2_NN,tf.nn.relu)
- h3 = fcn_layer(h2,H2_NN,H3_NN,tf.nn.relu)
- #构建输出层
- forward = fcn_layer(h3,H3_NN,10,None)
- pred = tf.nn.softmax(forward)#输出层分类应用使用softmax当作激活函数
- #损失函数使用交叉熵
- loss_function = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = forward,labels = y))
- #设置训练参数
- train_epochs = 50
- batch_size = 50
- total_batch = int(mnist.train.num_examples/batch_size) #随机抽取样本
- learning_rate = 0.01
- display_step = 1
- #优化器
- opimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss_function)
- #定义准确率
- correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(pred,1))
- accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
- #保存模型
- save_step = 5 #储存模型力度
- import os
- ckpt_dir = '.ckpt_dir/'
- if not os.path.exists(ckpt_dir):
- os.makedirs(ckpt_dir)
- #开始训练
- sess = tf.Session()
- init = tf.global_variables_initializer()
- saver = tf.train.Saver() #声明完所有变量以后,调用tf.train.Saver开始记录
- startTime = time()
- sess.run(init)
- for epochs in range(train_epochs):
- for batch in range(total_batch):
- xs,ys = mnist.train.next_batch(batch_size)#读取批次数据
- sess.run(opimizer,feed_dict={x:xs,y:ys})#执行批次数据训练
- #total_batch个批次训练完成后,使用验证数据计算误差与准确率
- loss,acc = sess.run([loss_function,accuracy],
- feed_dict={
- x:mnist.validation.images,
- y:mnist.validation.labels})
- #输出训练情况
- if(epochs+1) % display_step == 0:
- epochs += 1
- print("Train Epoch:",epochs,
- "Loss=",loss,"Accuracy=",acc)
- if(epochs+1) % save_step == 0:
- saver.save(sess, os.path.join(ckpt_dir,"mnist_h256_model_{:06d}.ckpt".format(epochs+1)))
- print("mnist_h256_model_{:06d}.ckpt saved".format(epochs+1))
- duration = time()-startTime
- print("Trian Finshed takes:","{:.2f}".format(duration))#显示预测耗时
- #评估模型
- accu_test = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
- print("model accuracy:",accu_test)
- #恢复模型,创建会话
- saver = tf.train.Saver()
- sess = tf.Session()
- init = tf.global_variables_initializer()
- sess.run(init)
- ckpt = tf.train.get_checkpoint_state(ckpt_dir)#选择模型保存路径
- if ckpt and ckpt.model_checkpoint_path:
- saver.restore(sess ,ckpt.model_checkpoint_path)#从已保存模型中读取参数
- print("Restore model from"+ckpt.model_checkpoint_path)
完整代码
基于tensorflow使用全连接层函数实现多层神经网络并保存和读取模型的更多相关文章
- 深度学习原理与框架-卷积网络细节-图像分类与图像位置回归任务 1.模型加载 2.串接新的全连接层 3.使用SGD梯度对参数更新 4.模型结果测试 5.各个模型效果对比
对于图像的目标检测任务:通常分为目标的类别检测和目标的位置检测 目标的类别检测使用的指标:准确率, 预测的结果是类别值,即cat 目标的位置检测使用的指标:欧式距离,预测的结果是(x, y, w, h ...
- 基于tensorflow实现mnist手写识别 (多层神经网络)
标题党其实也不多,一个输入层,三个隐藏层,一个输出层 老样子先上代码 导入mnist的路径很长,现在还记不住 import tensorflow as tf import tensorflow.exa ...
- tensorflow 1.0 学习:池化层(pooling)和全连接层(dense)
池化层定义在 tensorflow/python/layers/pooling.py. 有最大值池化和均值池化. 1.tf.layers.max_pooling2d max_pooling2d( in ...
- tensorflow 添加一个全连接层
对于一个全连接层,tensorflow都为我们封装好了. 使用:tf.layers.dense() tf.layers.dense( inputs, units, activation=None, u ...
- keras channels_last、preprocess_input、全连接层Dense、SGD优化器、模型及编译
channels_last 和 channels_first keras中 channels_last 和 channels_first 用来设定数据的维度顺序(image_data_format). ...
- resnet18全连接层改成卷积层
想要尝试一下将resnet18最后一层的全连接层改成卷积层看会不会对网络效果和网络大小有什么影响 1.首先先对train.py中的更改是: train.py代码可见:pytorch实现性别检测 # m ...
- Caffe源码阅读(1) 全连接层
Caffe源码阅读(1) 全连接层 发表于 2014-09-15 | 今天看全连接层的实现.主要看的是https://github.com/BVLC/caffe/blob/master/src ...
- 深度学习基础系列(十)| Global Average Pooling是否可以替代全连接层?
Global Average Pooling(简称GAP,全局池化层)技术最早提出是在这篇论文(第3.2节)中,被认为是可以替代全连接层的一种新技术.在keras发布的经典模型中,可以看到不少模型甚至 ...
- TensorFlow------单层(全连接层)实现手写数字识别训练及测试实例
TensorFlow之单层(全连接层)实现手写数字识别训练及测试实例: import tensorflow as tf from tensorflow.examples.tutorials.mnist ...
随机推荐
- 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇
第三方登录平台接入 (QQ\微信登录) QQ登录接入 第一步成为QQ应用开发者,审核期限七天 一.所需材料 1.公司注册相关信息 2.营业执照扫描件 微信登录接入 第一步成为微信开发平台开发者,认证费 ...
- 4、url控制系统
第1节:简单配置 参考代码: from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/ ...
- Node.js实战(三)之第一个Web服务器
这次的示例同样也可以说是HelloWorld,只不过不同的是这是web服务器示例. (1)编写web.js,内容如下: var http = require("http") fun ...
- 青岛大学开源OJ平台搭建
源码地址为:https://github.com/QingdaoU/OnlineJudge 可参考的文档为:https://github.com/QingdaoU/OnlineJudgeDeploy/ ...
- Leetcode——198. 打家劫舍
题目描述:题目链接 这道题目也是一道动态规划的题目: 分析一道动态规划的题目可以将解决问题的思路分为下面三个部分: 1:问题的描述.可以定义数组d[ i ] 用于表示第i -1家可以获得的最大金额. ...
- js 自己项目中几种打开或弹出页面的方法
自己项目中,几种打开或弹出页面的方法(部分需要特定环境下) var blnTop = false;//是否在顶层显示 ///动态生成模态窗体(通过字符串生成) ///strModalId:模态窗体ID ...
- mysql中查看一个字段中,有几个逗号
利用replace.length的内置函数
- 【js】AddFavorite/SetHome提醒用户自行操作加入收藏/设置主页
除了老版本的ie, 就已经没有浏览器能支持js添加收藏夹和设置首页, 浏览器没有开放这个权限了,external.addFavorite这个给禁了. 不过AddFavorite可以起到提醒用户自行操作 ...
- jQuery对底部导航进行跳转并高亮显示
这两天弄一个mui的底部菜单,有点费时了,尝试了用vue写,纯js写,还有根据mui的写,还是有些问题和麻烦.直到看了网上的一些例子,才想明白,之前一直是一种点击触发事件才高亮的思维去做,这个虽然可以 ...
- UWP 下载文件显示下载进度
<Page x:Class="WgscdProject.TestDownloadPage" xmlns="http://schemas.microsoft.com/ ...