永兴的tensorflow笔记-5 tf编程基础 1

在这里插入图片描述

一、TensorFlow的编程模型:

TensorFlow的命名源于本身的运行原理。Tensor(张量)意味着N维度的数组,Flow (流)意味则 计算图 的计算。Tensorflow 是张量从一端流到另一端的计算过程,也就是Tensorflow的编程模型。

  • 模型的运行机制:
    Tensorflow 的机制属于定义与运行相互分离。从操作层面可以抽象为:模型构建 和 模型运行。
名称 定义
张量(Tensor) 数据,即某一种类型的多维数组
变量(Variable) 常用于定义模型中的参数,是通过不断训练得到的值
占位符(placeholder) 输入变量的载体。也可以理解成定义函数时的参数
节点(operation : OP) 即一个OP获得0个或多个tensor,执行计算,输出0个或多个tensor
  • session 的机制:
    session 将计算图的OP分发到CUP或者GPU之类的设备上,同时执行OP的方法。在 python 语言中,返回的 tensor 是 numpy ndarray 对象。
    session 与 计算图 的交互过程中,定义了2种数据的流向机制。
    • 注入赋值机制 feed : 通过占位符向模型传入数据
    • 取回获得机制 fetch : 从模型中得到结果
import tensorflow as tf
X = tf.placeholder("float")
Y = tf.placeholder("float")
#设置模型变量
w = tf.Variable(tf.random_normal([1]),name="weight")
b = tf.Variable(tf.random_normal([1]),name="bias")
#定义前向结构
z = tf.multiply(X,w) + b
with tf.Session() as sess:
    #向 X and Y 注入数据(feed)  ,并获得z的计算结果(fetch)
    sess.run(z,feed_dict={X:train_X,Y:train_Y})
  • 交互式的session:
    一般在Jupyter环境下使用的比较多
    sess = tf.InteractiveSession()
    使用该方法,会稍稍复杂,能自动管理session中的任务。比如:载入、载出检查点文件、写入 TensorBoard 等。
  • with session 的使用:
    with session 的用法非常的场景,沿用的 python 的 with 用法 ,即当session 下的操作完成后,自动关闭 session。

二、模型的保存和恢复:

1、模型的保存:
我们首先建立一个saver,然后在session中通过saver的方法save即可将模型进行保存:

saver = tf.train.Saver()
with tf.Session() as sess:
	sess.run(tf.global_variable_initializer()) #模型初始化
	saver.save(sess,"save_path/file_name")
	#如果file_name 如果不存在则自动创建

2、载入模型:
在session中调用saver的restore()函数,会从指定路径找到模型文件,并覆盖到相关参数中:

saver = tf.train.Saver()
with tf.Session() as sess :
	sess.run(tf.global_variables_initializer())
	saver.restore(sess,"save_path/file_name")
	#将保存的变量值resotre到变量中

3、设置检查点(Checkpoint):
在实际的开发中,保存模型并不限于训练之后,我们在训练当中一般每隔一段时间保存一次模型,也能有效保证模型训练意外中断的时候,有效保护模型。
saver 的 max_to_keep = 5 ,表示最多保存5个检查点文件。在保存时使用了如下代码传入了迭代次数。

saver.save(sess,savedir+"linermodel.ckpt",global_step=epoch)

Tensorflow 会将迭代次数放在检查点的名称中,所以在载入时,同样也要指定迭代次数。

saver.restore(sess2,savedir+"linermodel.ckpt"+str(load_epoch))

线性回归模型保存和恢复实例:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

train_X = np.linspace(-1,1,100) #从 [-1.1] 取 100个值 给 train_X
train_Y = 3 * train_X + np.random.randn(100) * 0.3 # 模拟 y = 3 * x + b 利用 np 模拟噪声b

# #显示模拟数据点
# plt.plot(train_X,train_Y,'ro',label="Original data") #设置图像参数 样式:“ro”就是红色的圆圈
# plt.legend() #绘制图例
# plt.show() #显示
# 占位符 , 用于构建计算图
X = tf.placeholder("float")
Y = tf.placeholder("float")

#设置模型变量
w = tf.Variable(tf.random_normal([1]),name="weight")
b = tf.Variable(tf.random_normal([1]),name="bias")

#定义前向结构
z = tf.multiply(X,w) + b

cost = tf.reduce_mean(tf.square(Y-z)) #计算真实值与实际值的平方差 作为 损失值 loss
learning_rate = 0.01  #设置学习率
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #设置梯度下降优化

#设置初始化所有变量
init = tf.global_variables_initializer()
#定义参数
training_epochs = 20
display_step = 2

saver  = tf.train.Saver(max_to_keep=5) # 生成server
savedir = "log/" #定义检查点位置
with tf.Session() as sess:
    sess.run(init) #进行初始化
    plodata = {"batchsize":[],"loss":[]} #定义字典 存放 批次值 和 损失值
    i = 0
    for epoth in range(training_epochs) :
            for (x,y) in zip(train_X,train_Y):
                print("i:", i)
                print("xL\n", x)
                print("yL\n:", y)
                sess.run(optimizer,feed_dict={X:x,Y:y})
                #显示训练中的详细信息
                if epoth % display_step ==  0 :  #每运行2次
                    loss = sess.run(cost,feed_dict={X:x,Y:y}) #使用feed 放入数据形成数据流
                    print("Epoch:",epoth+1,"cost:",loss,"w=",sess.run(w),"b=",sess.run(b)) #打印 相关信息
                    if not (loss == "NA"): # 将有效信息放入 plodata
                        plodata["batchsize"].append(epoth)
                        plodata["loss"].append(loss)
                saver.save(sess,savedir+"linermodel.ckpt",global_step=epoth) #保存检查点
    print("Finished !")
    print("coss=",sess.run(cost,feed_dict={X:train_X,Y:train_Y}),"w=",sess.run(w),"b=",sess.run(b)) #训练完成显示最近一次计算结果

load = int(input("请输入你要检查点检查点轮数")) # 必须有保存点的文件
with tf.Session() as sess2:
    sess2.run(tf.global_variables_initializer())
    saver.restore(sess2,savedir+"linermodel.ckpt-"+str(load))
    print("x=2 z=",sess2.run(z,feed_dict={X:2}))


4、设定根据时间保存模型:
我们可以使用
tf.train.MonitoredRrainingSession()
来实现每间隔多少时间来保存一次模型,利用save_checkpoint_secs 设置具体秒数

import tensorflow as tf
tf.reset_default_graph() #用于清除默认图形堆栈并重置全局默认图形。
global_step = tf.train.get_or_create_global_step()
#获取当前训练轮数(返回并创建(如有必要)全局步长张量。)
step = tf.assign_add(global_step,1) #累加
with tf.train.MonitoredTrainingSession(checkpoint_dir="log/checkpoints",save_checkpoint_secs=10) as sess2:
    print(sess2.run([global_step]))
    while not sess2.should_stop(): #启动死循环(一直循环下去)
        i = sess2.run(step)
        print(i)
发布了45 篇原创文章 · 获赞 28 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_43505377/article/details/103889046