文章目录
- 常用库:
- 使用 Pandas 库导入 csv 数据
- 使用 Numpy 库建立训练集和测试集的 ndarray 矩阵
- 使用 Scikit-learn 库进行数据预处理
- 使用 TensorFlow 库进行线性回归训练与测试
- 使用 matplotlib 进行结果可视化
一、TensorFloe机器学习编程框架
TensorFlow没有Scikit-learn当中预定义的各种模型函数,如回归、神经网络等。
不能直接将数据以参数形式送入。
手写计算图
计算图不参与计算
Session执行计算图
编程模式
Graph 建图
- 创建数据,定义输入结点 (Placeholder)
- 1定义Placeholder
占位,指定要求数据类型和数据的大小。None表示本维度根据实际输入数据自适应调整。
- data = tf.placeholder(tf.float32,[None,4])
- real_label = tf.placeholder(tf.float32,[None,1])
- 2使用Placeholder
- 1定义Placeholder
- 定义模型主要部分计算图 (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():均匀分布初始化
- 1定义操作
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