“深度学习与实践” 笔记(二)
Homework2:
基础作业:
假设有函数y = cos(ax + b), 其中a为学号前两位(18),b为学号最后两位(22)。
import tensorflow as tf
x_train
stp= tf.constant(initialize name= ‘stepwise’)# 常量
a = 18
b = 22
- 定义图
g = tf.Graph()
with g.as_default():
a= tf.constant(name= ‘a’)
b= tf.constant (name= ‘b’)
x= tf.placeholder # 占位节点
y= tf.cos(tf.add(tf.matmul(a,x),b))
1、
首先从此函数中以相同步长(点与点之间在x轴上距离相同),在0<(ax+b)<2pi范围内,采样出2000个点,
def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None):
https://blog.****.net/zywvvd/article/details/78593618
然后利用采样的2000个点作为特征点进行三次函数拟合
(三次函数形式为 y = w1 * x + w2 * x^2 + w3 * x^3 + b, 其中wi为可训练的权值,b为可训练的偏置值,x和y为输入的训练数据 ) 。
要求使用TensorFlow实现三次函数拟合的全部流程。
拟合完成后,分别使用ckpt模式和PB模式保存拟合的模型。
然后,针对两种模型存储方式分别编写恢复模型的程序。两个模型恢复程序分别使用ckpt模式和PB模式恢复模型,并将恢复的模型参数(wi和b)打印在屏幕上,同时绘制图像(图像包括所有的2000个采样点及拟合的函数曲线)。
请提交文档,内容包括模型参数配置、程序运行截图、拟合的三次函数以及绘制的图像,同时提交三个python脚本文件:1. 函数拟合及两种模式的模型保存程序2. ckpt模型恢复程序,3. PB模型恢复程序。
进阶作业:
使用TensorFlow定义函数y = 1 - sin(x)/x, 并求解y达到最小值时对应的x
步骤提示:
(1) 使用TensorFlow给出函数定义
(2) 利用tf.train.GradientDescentOptimizer定义优化器
(3) 启动会话,用梯度下降算法训练一定的迭代次数,在每次迭代之后输出当前的x和y值
提交内容:
源码、运行截图和报告,报告中应包括有关的参数,如x的初始化方式、学习率、迭代次数等,以及每次迭代后的x和y的值。
课程复习
TensorFlow基本原理
- 编程模型分为: 计算图Graph+会话Session
- 计算图定义计算模型
- e.g. :
- e.g. :
- 节点 : 是计算符号 Operation ,如 加减乘除。
- 连接节点的边:是计算的输出结果,或者是张量Tensor(n维数组),它是节点之间传递的数据。
- 边缘点: 数据的输入, 和参数变量。
- 计算过程需要组个节点**,每个节点的**需要前驱节点的**
Graph 边缘点:输入/模型参数
-
tf.Variable : 变量节点
(执行过程中需要更新的量, 存储权值) -
tf.constant: 常量节点
(建立计算图时确定, 传入python值 ,不能是tensor ) -
tf.placeholder:占位节点
(在运行时要给占位节点feed一个值) -
tf.zeros, tf.ones, tf.ones_like , tf.random, tf.zeros_like
- 定义计算图
- Graph 的构建:使用 tf 中的数据结构和算子 (tf.xxx),把整个模 型的所有连接都写一遍
- Graph 构建的每个操作都要像函数一样执行一遍,否则无法建立 Graph
- 构建的 Graph 仅仅定义了计算流程,不会给出计算结果 (Python 中则可以直接得到计算结果)
- 要用 Graph 进行计算,需要在 Session 中给出输入和输出方式并 启动计算
import tensorflow as tf
v1 = tf.Variable(tf.random_uniform([3]))
v2 = tf.Variable(tf.random_uniform([3]))
sumV12 = tf.add(v1, v2)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(sess.run(v1))
print(sess.run(v2))
print(sess.run(sumV12))
GPU/CPU调用
- 默认状态 : GPU:0
- 查看当前使用的GPU还是CPU:(config=tf.ConfigProto(log_device_placement=True))
import tensorflow as tf
v1 = tf.constant([1.0, 2.0, 3.0], shape=[3], name='v1')
v2 = tf.constant([1.0, 2.0, 3.0], shape=[3], name='v2')
sumV12 = v1 + v2
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print sess.run(sumV12)
- 手动指定GPU
with tf.device('/gpu:1')
- 随机数生成
a = tf.random_normal([1], name ='random')
with tf.Session() as sess:
for i in range(5):
print sess.run[a]
TensorFlow 机器学习编程框架
例子: 股票指数预测
Tensorflow 编程框架和机器学习模型的对应关系
TF优化机制
TF 优化编程模式
1、 定义目标函数 (如loss)
2、定义优化器 (基于目标函数和 优化目标)
opt = tf. train.GradientDescentOptimizer(0.01)
train_op= optminimize(loss)
3、 使模型获取数据, 并调用优化器进行训练
sess.run([train_op...], feed_dict= input_x: xxx, label:xx)
Tensorflow 编程框架步骤
1、创建数据 , 定义输入输出
feed 和 fetch 是 TensorFlow 模型与外界进行数据交互的方式
股票模型案例
模型定义
1、定义输入
- 首先定义placeholder:
data = tf.placeholder(tf.float32, [None,4])
real_label = tf.placeholder(tf.float32, [None,1])
- 然后定义有关变量 ,并输入数据执行计算图: Y= W*data + b ,中的W和 b。
2、定义模型主要部分计算图
- 参数在机器学习过程中 不断被调整, 一般用变量表示。
- Graph : 变量是依附其 所属 操作节点 的终端节点
- 变量 W\ b , 在使用前要进行初始化
变量定义的基本形式
w= tf.Variable(initial_value= np.random.randint(10,size=(2,1),name = 'col_vector',trainable = True))
3&4、定义损失函数 优化器和优化目标
y_label = 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) # 定义优化器及优化目标(最小化loss), 其中0.2为 学习率
5、 初始化参数
- TF常用初始化函数
tf.constant (const):常量初始化
tf.random_normal ():正态分布初始化
tf.truncated_normal (mean = 0.0, stddev = 1.0, seed = None, dtype =
dtypes.float32):截取的正态分布初始化 tf.random_uniform():均匀分布初始化
- Python 初始化
initial_value=np.random.randint(10,size=(2,1)) initial_value=22
- 注意: 即是用常量、随机数直接在变量定义时给定初始化值,变量 也此时也是没有值的,需要在 session 中运行初始化函数
全部初始化:tf.global_variables_initializer 部分初始化:tf.variables_initializer([a,b,...]) ...
init=tf.global_variables_initializer()
sess.run(init)
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}) # 执 行 训 练 脚 本
6、定义(迭代)训练脚本并执行
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.2) # 随机划 分 20% 的数据作为测试集
## 定义占位节点和参数节点:
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)) # 定义目标函数 loss
train = tf.train.GradientDescentOptimizer(0.2).minimize(loss) # 定义优 化器及优化目标 (最小化 loss)
# # 在 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: 一部分不包括在 训练集和测试集中的数据,用于生成股价预测结果
线性回归汇总
TensorFlow 模型存储
两种模式:
1、ckpt : 计算图和变量分开保存
2、pb : 计算图和变量封装在一起
ckpt模式 :
.meta .ckpt
ckpt 模型存储恢复
Saver=tf.train.Saver(max_to_keep = 4,
keep_checkpoint_every_n_hours = 2) Saver.save(sess, ckpt_file_path, global_step)
saver.restore(sess,tf.train.latest_checkpoint(’./ckpt’))
设置存储步长: 每 1000 个迭代保存一次
saver.save(sess, ’my_test_model’, global_step=1000)
过程中可以不更新 meta 文件:saver.save(sess, ’my_test_model’, global_step=1000, write_meta_graph=False)
设置定时保存,且只保存四个最新的模型
saver = tf.train.Saver(max_to_keep=4, keep_checkpoint_every_n_hours=2)
存储代码实例
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')
模型恢复代码实例
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))
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')
x = tf.Variable(tf.random_uniform([3])) y = tf.Variable(tf.random_uniform([3]))
z = tf.add(x, y)
saver = tf.train.Saver()^^I
with tf.Session() as sess: saver.restore(sess, './tmp/tfplus
.ckpt') print(sess.run(x))
print(sess.run(y)) print(sess.run(z))
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))
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())
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())
import tensorflow as tf
from tensorflow.python.platform
import gfile 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') print(sess.run(z))
Eager Execution
调试即可执行, 不能调用GPU
import tensorflow as tf
import tensorflow.contrib.eager as tfe
tfe.enable_eager_execltion()
x= [[2.]]
m=tf.matmul(x,x)