使用之前那个格式写法到后面层数多的话会很乱,所以编写了一个函数创建层,这样看起来可读性高点也更方便整理后期修改维护

#全连接层函数

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. 深度学习原理与框架-卷积网络细节-图像分类与图像位置回归任务 1.模型加载 2.串接新的全连接层 3.使用SGD梯度对参数更新 4.模型结果测试 5.各个模型效果对比

    对于图像的目标检测任务:通常分为目标的类别检测和目标的位置检测 目标的类别检测使用的指标:准确率, 预测的结果是类别值,即cat 目标的位置检测使用的指标:欧式距离,预测的结果是(x, y, w, h ...

  2. 基于tensorflow实现mnist手写识别 (多层神经网络)

    标题党其实也不多,一个输入层,三个隐藏层,一个输出层 老样子先上代码 导入mnist的路径很长,现在还记不住 import tensorflow as tf import tensorflow.exa ...

  3. tensorflow 1.0 学习:池化层(pooling)和全连接层(dense)

    池化层定义在 tensorflow/python/layers/pooling.py. 有最大值池化和均值池化. 1.tf.layers.max_pooling2d max_pooling2d( in ...

  4. tensorflow 添加一个全连接层

    对于一个全连接层,tensorflow都为我们封装好了. 使用:tf.layers.dense() tf.layers.dense( inputs, units, activation=None, u ...

  5. keras channels_last、preprocess_input、全连接层Dense、SGD优化器、模型及编译

    channels_last 和 channels_first keras中 channels_last 和 channels_first 用来设定数据的维度顺序(image_data_format). ...

  6. resnet18全连接层改成卷积层

    想要尝试一下将resnet18最后一层的全连接层改成卷积层看会不会对网络效果和网络大小有什么影响 1.首先先对train.py中的更改是: train.py代码可见:pytorch实现性别检测 # m ...

  7. Caffe源码阅读(1) 全连接层

    Caffe源码阅读(1) 全连接层 发表于 2014-09-15   |   今天看全连接层的实现.主要看的是https://github.com/BVLC/caffe/blob/master/src ...

  8. 深度学习基础系列(十)| Global Average Pooling是否可以替代全连接层?

    Global Average Pooling(简称GAP,全局池化层)技术最早提出是在这篇论文(第3.2节)中,被认为是可以替代全连接层的一种新技术.在keras发布的经典模型中,可以看到不少模型甚至 ...

  9. TensorFlow------单层(全连接层)实现手写数字识别训练及测试实例

    TensorFlow之单层(全连接层)实现手写数字识别训练及测试实例: import tensorflow as tf from tensorflow.examples.tutorials.mnist ...

随机推荐

  1. Linux下搭建lnmp环境

    前提:假设阅读本文的读者已经拥有基本的linux使用技巧,能够解决系统安装问题,以及软件安装的技巧. 注意: 本文所涉及的主要安装包(需要下载使用的)安装包,在本文最后会给出百度云盘链接,需要使用的, ...

  2. 乘风破浪:LeetCode真题_027_Remove Element

    乘风破浪:LeetCode真题_027_Remove Element 一.前言 这次是从数组中找到一个元素,然后移除该元素的所有结果,并且返回长度. 二.Remove Element 2.1 问题 2 ...

  3. DevExpress 使用条形码二维码控件打印

    参考文章: https://www.cnblogs.com/wuhuacong/p/6112976.html 转载请注明出处:撰写人:伍华聪 其实主要是二维码的实现,在使用条形码控件时,又一个属性Sy ...

  4. October 27th, 2017 Week 43rd Friday

    The only thing predictable about life is its unpredictability. 人生唯一可以预知的,就是它的变化莫测. Is it really unpr ...

  5. SDN 第五次上机作业

    1.搭建如下拓扑并连接控制器 2.下发相关流表和组表实现负载均衡 s1: s2: s3: s4: 3.抓包分析验证负载均衡 s4-eth1: s4-eth2: s4-eth3

  6. 【2017下集美大学软工1412班_助教博客】团队作业4——Alpha冲刺日志公示

    作业要求 团队作业4--第一次项目冲刺(Alpha版本) 团队评分结果和评分标准 检查项 总分 会议内容 代码签入 心得体会或其他记录 燃尽图 会议照片 评论区反馈 组别 分值 10 2 2 2 1 ...

  7. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  8. 静态工厂方法和实例工厂方法及普通的bean

    容纳你的bean  bean工厂:最简单的容器,提供了基础的依赖注入支持.创建各种类型的Bean.  应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务. ...

  9. Windows10 + eclipse + JDK1.8 + Apache Maven 3.6.0 + dl4j深度学习环境配置

    Windows10 + eclipse + JDK1.8 + Apache Maven 3.6.0 + dl4j深度学习环境配置 JDK下载安装请自行,并设置好环境变量1 查看Java版本C:\Use ...

  10. 测试计划&性能测试分析报告模板(仅供参考)

    一.测试计划 1. 引言 1.1  编写目的 2. 参考文档 3. 测试目的 4. 测试范围 4.1  测试对象 4.2  需要测试的特性 4.3  无需测试的特性 5. 测试启动与结束准则 5.1  ...