一、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)