————————————————————————————
原文发表于夏木青 | JoselynZhao Blog,欢迎访问博文原文。
————————————————————————————
深度学习 | 绪论
深度学习 | 线性代数基础
深度学习 | 机器学习基础
深度学习 | 实践方法论
深度学习 | 应用
深度学习 | 安装conda、opencv、pycharm以及相关问题
深度学习 | 工具及实践(TensorFlow)
深度学习 | TensorFlow 命名机制和变量共享、变量赋值与模型封装
深度学习 | TFSlim介绍
深度学习 | TensorFlow可视化
深度学习 | 训练及优化方法
深度学习 | 模型评估与梯度下降优化
深度学习 | 物体检测
深度学习| 实战1-python基本操作
深度学习 | 实战2-TensorFlow基础
深度学习 | 实战3-设计变量共享网络进行MNIST分类
深度学习 | 实战4-将LENET封装为class,并进行分类
深度学习 | 实战5-用slim 定义Lenet网络,并训练测试
深度学习 | 实战6-利用tensorboard实现卷积可视化
深度学习 | 实战7- 连体网络MINIST优化
深度学习 | 实战8 - 梯度截断
深度学习 | 实战9- 参数正则化
手写深度学习:
编程难度大
对非科研人员不友好
标注无法统一
目前的主流:TensorFlow、caffe、pytorch、matconvnet(小众)
Tensorflow(TF) 就是 Python 中调用的一个库
数据结构:TF 定义数据如何和 Python 中其他数据进行交互
算法思想:TF 进行计算的编程思想、编程模型
熟练 TF 库中常用的函数、工具
Graph: 描述数学计算的有向图 (有向 无环图)
上图为 ( ( w × x ) + b ) × c ((w\times x)+b)\times c ((w×x)+b)×c的计算图
张量 (Tensor)——Graph 节点 (Operation) 之间传递的数据可以看作 n 维的数组
0 维张量: 标量(数) 1 维张量: 向量
2 维向量:矩阵
n 维向量…
张量 Tensor——算子 Operation 的输 出
引用中间计算结果
计算流程的要素:
Graph 构图与 python 函数计算区别:
import tensorflow as tf
v1 = tf.Variable(tf.random_uniform([3]))
v2 = tf.Variable(tf.random_uniform([3]))
sum2 = tf.add(v1,v2)
print(v1)
print(v2)
print(sum)
'''运行结果如下:
Tensor("Add:0", shape=(3,), dtype=float32)'''
在静态图中,如果想要正常的得到运行数据,则代码如下:
import tensorflow as tf
v1 = tf.Variable(tf.random_uniform([3]))
v2 = tf.Variable(tf.random_uniform([3]))
sum2 = 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(sum2))
'''运行结果:
[0.6578543 0.625384 0.49183977]
[0.02306736 0.531626 0.8785937 ]
[0.6809217 1.15701 1.3704334]'''
# 动态
import torch
v1 = torch.rand(1,3)
v2 = torch.rand(1,3)
sum = v1+v2
print(v1)
print(v2)
print(sum)
调用 GPU 或 CPU 进行计算
调用GUP:输出中显示使用的设备
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')
sum12 = v1+v2
with tf.Session(config=tf.ConfigProto(log_device_placement = True)) as sess:
print sess.run(sum12)
'''ConfigProto(log_device_placement = True) 的目的是为了在输出中指明cpu'''
'''运行结果如下:
add: (Add): /job:localhost/replica:0/task:0/device:CPU:0
v2: (Const): /job:localhost/replica:0/task:0/device:CPU:0
v1: (Const): /job:localhost/replica:0/task:0/device:CPU:0
[2. 4. 6.]
'''
手动指定调用某个CPU/GUP
import tensorflow as tf
with tf.device('/CPU:0'):
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')
sum12 = v1 + v2
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print sess.run(sum12)
/cpu 或者/CPU 都是可以的
#会话模式1
sess = tf.Session()
sess.run()
sess.close()
#会话模式2
with tf.Session() as sess:
sess.run()
import tensorflow as tf
import numpy as np
a = tf.constant(1.,name='const1')
b = tf.constant(2.,name='const2')
c = tf.add(a,b)
with tf.Session() as sess:
print(sess.run(c))
print(c.eval)
# eval() 函数用来执行一个字符串表达式,并返回表达式的值。
'''运行结果如下:
3.0
>'''
以随机数的生成为例:
numpy 实现:
import numpy as np
a = np.random.rand(1)
for i in range(5):
print(a)
'''result:
[0.99835465]
[0.99835465]
[0.99835465]
[0.99835465]
[0.99835465]
'''
'''即生成的五个随机数是一样的'''
TensorFlow实现:
import tensorflow as tf
import numpy as np
a = tf.random_normal([1],name = "random")
with tf.Session() as sess:
for i in range(5):
print(sess.run(a))
'''result:
[-0.28919014]
[-0.516945]
[-0.5970153]
[1.6492158]
[0.2942117]'''
'''五个随机数各不相同'''
import sklearn
X_train,X_test,y_train,y_test = sklearn.model_selection.train_test_split(X,y,test_size = 0.2)
# 随机划分20%的数据作为测试集
clf = sklearn.linear_model.LinearRegression()
# 定义线性回归器
clf.fit(X_train,y_train) #开始训练
accuracy = clf.score(X_test,y_test) #测试并得到测试集性能
Graph建图
Session执行
5. 初始化参数 (initialization)
6. 定义(迭代)训练脚本并执行(fetch: train_op, feed: input_data, input_label)
feed 和 fetch 是 TensorFlow 模型与外界进行数据交互的方式
定义Placeholder:
使用 Placeholder:在会话中使用:
定义placeholder:
import tensorflow as tf
data = tf.placeholder(tf.float32,[None,4]) #后面是对输入数据规模的限制,4维
real_label = tf.placeholder(tf.float32,[None,1])
# 给定数据类型和数据大小。None表示本维度根据实际输入数据自适应调整
** 模型如何使用 Graph 定义:**
变量定义的基本形式:
示例:
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), 其中0.2为 学习率
** 变量初始化的两个步骤:**
常用的 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}) # 执 行 训 练 脚 本
...
** 准备训练和测试数据:**
定义占位节点和参数节点:
定义目标函数和优化器:
在 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框架如下:
import sklearn
import tensorflow as tf
# 下面使用TensorFlow的方法
# ------------------准备训练和测试数据------------------------#
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.2)
# 随机划分20%的数据作为测试集
# ------------------placeholder------------------------#
data = tf.placeholder(tf.float32, [None, 4])
real_label = tf.placeholder(tf.float32, [None, 1])
# 给定数据类型和数据大小。None表示本维度根据实际输入数 据自适应调整
# -------------------定义变量-------------------#
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), 其中0.2为 学习率
# ------------------初始化参数------------------------#
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_test})
# 执行测试。X_lately: 一部分不包括在 训练集和测试集中的数据,用于生成股价预测结果
accuracy = tf.reduce_mean(tf.square(forecast_set - y_test))
存什么?
怎么存?
主要两种模式:
保存内容:
模型存储方法:
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,save_file)
'''运行结果:
[0.6390506 0.26704168 0.09797013]
[0.98880136 0.55906487 0.00470507]
[1.627852 0.82610655 0.1026752 ]
并在save目录下参数相应的文件'''
模型恢复的两种方式:
模型恢复代码示例:
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, save_file)
print(sess.run(x))
print(sess.run(y))
print(sess.run(z))
'''运行结果:
[0.6390506 0.26704168 0.09797013]
[0.98880136 0.55906487 0.00470507]
[1.627852 0.82610655 0.1026752 ]
与刚才存储的结果完全一样'''
PB 文件定义:
MetaGraph 的 protocol buffer 格式的文件,包括计算图,数据流, 以及相关的变量等
PB 文件优点:
具有语言独立性,可独立运行,任何语言都可以解析
允许其他语言和深度学习框架读取、继续训练和迁移 TensorFlow 的模型
保存为 PB 文件时候,模型的变量都会变成常量,使得模型的大小 减小
可以把多个计算图保存到一个 PB 文件中
支持计算图的功能和使用设备命名区分多个计算图,例如 serving or training,CPU or GPU。
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(save_file, mode='wb') as f:
f.write(constant_graph.SerializeToString())
'''[0.5625318 0.71519125 0.34229362]
[0.49225044 0.16457498 0.53800344]
[1.0547823 0.8797662 0.88029706]
Converted 2 variables to const ops.'''
PB恢复代码示例:
import tensorflow as tf
from tensorflow.python.platform import gfile
# ...... something disappeared ......
with tf.Session() as sess:
with gfile.FastGFile(save_file, '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))
'''[1.0547823 0.8797662 0.88029706]'''
'''只取出了z的值'''
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, [None, 1])
m = tf.matmul(x, x)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
m_out = sess.run(m, feed_dict={x: [[2.]]})
print(m_out) #运行结果如下: '''
[[4.]]
'''
能否采用类似 python 或 PyTorch 的方式提高调试效率?
import tensorflow as tf
x = [[2.]]
m = tf.matmul(x, x)
print(m)
#运行结果如下:
'''
Tensor("MatMul:0", shape=(1, 1), dtype=float32) '''
结果是不能。
if __name__ =="__main__":
import tensorflow as tf
import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()
x = [[2.]]
m = tf.matmul(x,x)
print(m)
'''tf.Tensor([[4.]], shape=(1, 1), dtype=float32)'''
Eager Execution 中不能自动调用 GPU 资源
如果要在 Eager Execution 中使用 GPU 计算资源,则需要显式地将
tensor 移动到指定的 GPU 中
a = a.gpu() # copies tensor to default 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
https://github.com/zhaojing1995/DeepLearning.Advanceing/tree/master/DL-2