Tensorflow线性回归编程框架以及模型存储与恢复

  • 常用库:
    • 使用 Pandas 库导入 csv 数据
    • 使用 Numpy 库建立训练集和测试集的 ndarray 矩阵
    • 使用 Scikit-learn 库进行数据预处理
    • 使用 TensorFlow 库进行线性回归训练与测试
    • 使用 matplotlib 进行结果可视化

一、TensorFloe机器学习编程框架

TensorFlow没有Scikit-learn当中预定义的各种模型函数,如回归、神经网络等。
不能直接将数据以参数形式送入。
手写计算图
计算图不参与计算
Session执行计算图

编程模式

Graph 建图

  1. 创建数据,定义输入结点 (Placeholder)
    • 1定义Placeholder

      占位,指定要求数据类型和数据的大小。None表示本维度根据实际输入数据自适应调整。

      • data = tf.placeholder(tf.float32,[None,4])
      • real_label = tf.placeholder(tf.float32,[None,1])
    • 2使用Placeholder

  1. 定义模型主要部分计算图 (Graph, Variable, …)

    定义一组操作以及操作附带的参数

    • 1定义操作
      • y_lable = tf.add(tf.matmul(data, weight), bias) #定义回归函数计算方法
      • loss = tf.reduce_mean(tf.square(real_label−y_label)) #定义目标函数loss
      • train = tf.train.GradientDescentOptimizer(0.2).minimize(loss) # 定义优化器及优化目标,其中0.2为学习率。
    • 2定义变量
      • 在graph中给定初始化值函数 tensor=tf.Variable(initial_value = , 形状, 数据类型, 是否可训练? , 名字, …)
      • 在Session中执行初始化方法
        • init = tf.gloabal_variables_initializer() session.run(init)
        • 或者 session.run(tf.global_variables_initializer())
        • 常用的TF初始化值函数
          • tf.constant (const):常量初始化
          • tf.random_normal ():正态分布初始化
          • tf.truncated_normal (mean = 0.0, stddev = 1.0, seed = None, dtype =dtypes.float32):截取的正太分布初始化
          • tf.random_uniform():均匀分布初始化

Session 执行

  • 初始化参数
  • 定义迭代训练脚本并执行
    with tf.Session() as sess:
       sess.run(tf.global_variables_initializer()) # 参数初始化
       
       	for i in range(1000): # 训练1000次迭代
       		sess.run(train, feed_dict={data:X_train , real_label:y_train}) # 执行训练脚本
    

二、TensorFlow线性回归 demo

1.准备训练和测试数据

X_train, X_test, y_train, y_test =sklearn.model_selection.train_test_split(X, y, test_size=0.2) 
# 随机划分20%的数据作为测试集

2.建立计算图

2.1定义占位节点和参数节点

# 定义占位节点,数据入口
data = tf.placeholder(tf.float32, [None, 4])
real_label = tf.placeholder(tf.float32, [None, 1]) 

# 定义参数节点
weight = tf.Variable(tf.random_normal([4, 1]), dtype=tf.float32)
bias = tf.Variable(tf.ones([1]), dtype=tf.float32) 

2.2定义目标函数和优化器

y_label = tf.add(tf.matmul(data, weight), bias)

# 定义目标函数loss
loss = tf.reduce_mean(tf.square(real_label - y_label)) 

# 定义优化器及优化目标 (最小化 loss)
train = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

3.Session

在 sess.run中配置输入输出及优化器,并启动训练

with tf.Session() as sess:
	sess.run(tf.global_variables_initializer()) # 参数初始化
	
	for i in range(1000): # 训练1000次迭代
		sess.run(train, feed_dict={data:X_train, real_label:y_train}) # 执行训练脚本
		
	forecast_set = sess.run(y_label,  feed_dict={data:X_lately}) 
	#执行测试。 X_lately: 一部分不包括在训练集和测试集中的数据,用于生成股价预测结果

总结及代码

  • Graph 建图:
    • 创建数据,定义输入结点 (Placeholder)
    • 定义模型主要部分计算图 (Graph, Variable, …)
    • 定义损失函数 (loss)
    • 定义优化器及优化目标 (train_op)
  • Session 执行:
    • 初始化参数 (initialization)
    • 定义(迭代)训练脚本并执行(fetch: train_op,  feed: input_data, input_label)
# 定义占位符
data = tf.placeholder(tf.float32, [None, 4])
real_label = tf.placeholder(tf.float32, [None, 1])

#定义变量
weight = tf.Variable(tf.random_normal([4, 1]), dtype=tf.float32)
bias = tf.Variable(tf.ones([1]), dtype=tf.float32)

#定义计算图、优化器
y_label = tf.add(tf.matmul(data, weight), bias)
loss = tf.reduce_mean(tf.square(real_label - y_label))
train = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

#Session
with tf.Session() as sess:
    # 参数初始化,目的是给Graph上的图中的变量初始化。
    sess.run(tf.global_variables_initializer())

    for i in range(1000):
    	#执行训练
        sess.run(train, feed_dict={data: X_train, real_label: y_train})
        if (i % 100 == 0):
            print(sess.run(loss, feed_dict={data: X_train, real_label: y_train}))

    test_set = sess.run(y_label, feed_dict={data: X_test})
    forecast_set = sess.run(y_label, feed_dict={data: X_lately})

accuracy = tf.reduce_mean(tf.square(test_set - y_test))

forecast_set = forecast_set.reshape(-1)
print(forecast_set, accuracy)

三、TF模型存储及恢复

存什么?

  • Graph结构
  • 变量值

1.ckpt模式

  • 特点
    • 计算图和变量分开保存
    • 读取模型时需要重新定义计算图,无需指明变量名
  • 保存内容
    在这里插入图片描述

ckpt模型存储

# 设置定时保存,且只保存四个最新的模型
Saver = tf.train.Saver(max_to_keep=4, keep_checkpoint_every_n_hours=2)

Saver.save(sess, ckpt_file_path, global_step)
# 如:设置存储步长,每1000个迭代保存一次,过程中可以不更新meta文件
Saver.save(sess, 'my_test_model', global_step=1000, write_meta_graph=False)

存储代码示例:

import tensorflow as tf

x = tf.Variable(tf.random_uniform([3]))
y = tf.Variable(tf.random_uniform([3]))
z = tf.add(x, y)

saver = tf.train.Saver()

with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())
	print(sess.run(x))
	print(sess.run(y))
	print(sess.run(z))
	
	save_path = saver.save(sess, './tmp/tfplus.ckpt')

ckpt模型恢复

  • 两种方式恢复
    • 重复定义计算图为默认图,用tf.train.Saver()中的restore工具恢复默认图
    • 指定.meta文件中的计算图为所需恢复图,用该图的Saver()恢复。
      • 获取图中张量:get_tensor_by_name(’‘name’’)
      • 需要记住图中张量的名字

模型恢复代码示例:

import tensorflow as tf

x = tf.Variable(tf.random_uniform([3]))
y = tf.Variable(tf.random_uniform([3]))
z = tf.add(x, y)

saver = tf.train.Saver()

with tf.Session() as sess:
	saver.restore(sess, './tmp/tfplus.ckpt')
	
	print(sess.run(x))
	print(sess.run(y))
	print(sess.run(z))

2.pb模式

封装存储方案,隐藏模型结构

  • 计算图和变量封装在一个文件中
  • 无需重新定义计算图,但是需要指明变量名

pb模型存储

import tensorflow as tf
from tensorflow.python.framework import graph_util

x = tf.Variable(tf.random_uniform([3]))
y = tf.Variable(tf.random_uniform([3]))
z = tf.add(x, y, name='op_to_store')

with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())
	print(sess.run(x))
	print(sess.run(y))
	print(sess.run(z))
	constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph_def, ['op_to_store'])
	with tf.gfile.FastGFile('./tmp2/pbplus.pb', mode='wb') as f:
		f.write(constant_graph.SerializeToString())

pb模型恢复

import tensorflow as tf
from tensorflow.python.platform import gfile

# ...... something disappeared ......

with tf.Session() as sess:
	with gfile.FastGFile('./tmp2/pbplus.pb', 'rb') as f:
		graph_def = tf.GraphDef()
		graph_def.ParseFromString(f.read())
		sess.graph.as_default()
		tf.import_graph_def(graph_def, name='')
	sess.run(tf.global_variables_initializer())
		z = sess.graph.get_tensor_by_name('op_to_store:0')    # x? y?
		print(sess.run(z))

四、黑科技Eager Execution

  • tensorflow问题

    • TensorFlow 程序的输入采用 placeholder 模式,难以指定具体输数据进行调试
    • Session.run() 的运行模式降低了调试效率

    这是因为TensorFlow是静态图机制,而PyTorch为动态图机制,调试更加灵活。2017年Google Brain发布Eager Execution机制
    1.Eager Execution 采用直接定义输入变量的模式,不使用 placeholder。
    2.当启动 Eager Execution 时,运算会即刻执行,无需 Session.run() 就可以把它们的值返回到 Python。

import tensorflow as tf
import tensorflow.contrib.eager as tfe

tfe.enable_eager_execution()

x = [[2.]]
m = tf.matmul(x,x)

print(m)

另外,Eager Execution不能自动调用GPU资源,如果需要使用则需要显式地将tensor移动到指定的GPU中。

a = a.gpu( )	# copies tensor to defalt GPU (GPU0)
a = a.gpu(0)	# copies tensor to GPU0
a = a.gpu(1)	# copies tensor to GPU1
a = a.cpu( )	# copies tensor back to CPU
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值