import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
'''
1、怎么构建图,并设置为默认图
2、变量的name
3、默认情况下,创建的Session使用的是默认的graph ,会话关闭后不能再使用
4、fetch
5、session和eval底层一致
6、交互式会话(基本不用)
7、张量:Tensor,就是数据(阶,常量,变量(变量初始化))
全局变量初始化,也可以单个变量的初始化(初始化也是一个操作,需要在会话中run)
name的意义:tensorflow中是通过name来查找变量
8、变量的更新
tf.assign(ref=x,value=x+1) 更新的变量,更新的操作
validate_shape=False参数,不检查形状
tf.control_dependencies() 控制依赖
案例1:实现变量的累加,每次加1
案例2:实现变量的累加,每次加的数来自placeholder
9、执行设备
一般情况下,如果安装的GPU版本,tensorflow会自动的在CPU GPU上执行
tensorflow认为只有一个cpu,不管多少核
tf.device('/gpu:0')
10、作用域
python 以函数内外分为局部作用域和全局作用域
tensorflow中作用域
1)便于管理变量(可以使用tf.Variable()来创建变量,肯定正确,但是创建的变量名不好管理;使用tf.get_variable())
期望重复使用某些变量
2)便于构建共享变量(reuse=tf.AUTO_REUSE的功劳,如果变量存在,那就重用这个变量。不会像tf.Variable一样又重新建了变量)
3)作用域支持嵌套
4)name_score是为了可视化设计的,它限制了节点的作用域,对变量无效
11、tensorflow的可视化
12、tensorflow的线程和队列
这个在具体的CNN案例中会提到,主要是利用多线程将训练和数据读取分开,提高训练的效率
13、tensorflow的数据读取
三种方式
1)feed(小数据)
2) 明确给数据(小数据集)
3)从文件中多线程和队列读取(大样本)
14、模型的保存和存储
Tensorflow不管用来做深度学习还是机器学习,保存和加载模型的方式都是一样的
saver 保存模型 saver = tf.train.Saver() saver.save(sess,'./model/model.ckpt')
checkpoint:不用管,就是描述信息
index:数据的索引
meta:源数据信息,图信息
data:具体的数据
restore 加载模型
1)完全提取,完全恢复保存前的数据格式(和保存前的现场一样,变量名称值等必须都一样)saver.restore(sess,'./model/model.ckpt')
注意:和从新定义一个模型不一样,加载模型不需要初始化所有的变量;另外,加载模型即使自己的声明了变量并给了初始值,加载
出来的值也会赋予模型中的值。
2)直接加载图,不定义变量
注意:
优点:不需要重新写代码构建图 缺点:需要通过变量或操作名获得张量的值 tf.get_default_graph().get_tensor_by_name()
3) 完全提取,加载的时候同时建立映射关系
15、分布式训练
'''
'''变量的更新'''
def variable_update():
#案例2:实现变量的累加,每次加的数来自placeholder
#方法:更新操作tf.assign
# a = tf.Variable(0,dtype=tf.float32,name = "v_a")
# h_a = tf.placeholder(shape=[],dtype=tf.float32,name='v_h_a')
# assign_op = tf.assign(ref=a,value=a+h_a)
#
# with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
# tf.global_variables_initializer().run()
# for i in range(5):
# sess.run(assign_op,feed_dict={h_a:i})
# print(a.eval())
#tf.assign是很重要的更新操作,控制依赖会简化操作,期望使用控制依赖
#优化:控制依赖
with tf.device("/gpu:0"):
a = tf.Variable(0,dtype=tf.float32,name = "v_a")
h_a = tf.placeholder(shape=[],dtype=tf.float32,name='v_h_a')
assign_op = tf.assign(ref=a,value=a+h_a)
#每次执行op_a操作之前,都会先执行assign_op操作
with tf.control_dependencies([assign_op]):
op_a = a + tf.constant(0.0) #此处必须形成一个操作
with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
tf.global_variables_initializer().run()
for i in range(5):
r = sess.run(op_a,feed_dict={h_a:i})
print(r)
# variable_update()
'''变量的作用域'''
def variable_scope():
def f(x):
w = tf.get_variable('w',[],dtype=tf.float32,initializer=tf.random_normal_initializer(seed=0))
b = tf.get_variable('b',[],dtype=tf.float32,initializer=tf.random_normal_initializer(seed=0))
r = tf.add(tf.multiply(w,x),b,name='add_r')
# r = w*x+b
return r
def f1(x):
with tf.variable_scope('op1',reuse=tf.AUTO_REUSE): #为什么加上reuse,因为默认是不允许重用的,重复建一个变量报错,如果是True,如果变量存在就新建(期望存在就重用)
r1 = f(x)
with tf.variable_scope('op2',reuse=tf.AUTO_REUSE):
r2 = f(x)
return r1,r2
r1,r2 = f1(2)
r3,r4 = f1(1)
with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
tf.global_variables_initializer().run()
print(r1.eval())
print(r2.eval())
print(r3.eval())
print(r4.eval())
# variable_scope()
'''模型保存'''
def model_saver_save():
w = tf.Variable(3,dtype=tf.float32,name='w')
b = tf.Variable(1,dtype=tf.float32,name='b')
r = w*tf.constant(3.0)+b
saver = tf.train.Saver() #模型保存类库
with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
tf.global_variables_initializer().run()
saver.save(sess,'./model/model.ckpt') #保存模型
# model_saver_save()
'''模型加载,完全加载'''
def model_saver_restore():
w = tf.Variable(3,dtype=tf.float32,name='w')
b = tf.Variable(1,dtype=tf.float32,name='b')
r = w*tf.constant(3.0)+b
saver = tf.train.Saver() #模型保存类库
with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
saver.restore(sess,'./model/model.ckpt') #加载模型
print(sess.run(r))
# model_saver_restore()
'''模型加载,直接加载图'''
def model_saver_restore_graph():
#加载图
saver = tf.train.import_meta_graph('./model/model.ckpt.meta')
with tf.Session(config=tf.ConfigProto(log_device_placement=True, allow_soft_placement=True)) as sess:
saver.restore(sess, './model/model.ckpt') # 加载模型
#问题在于r操作没了,那只能用名字去找
print(sess.run(tf.get_default_graph().get_tensor_by_name('add:0')))
# model_saver_restore_graph()
'''模型加载,完全加载,加载的时候建立映射关系'''
def model_saver_restore_mapping():
v1 = tf.Variable(3,dtype=tf.float32,name='v1')
v2 = tf.Variable(1,dtype=tf.float32,name='v2')
r = v1*tf.constant(3.0)+v2
saver = tf.train.Saver({'w':v1,'b':v2}) #模型保存类库,建立映射关系
with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
saver.restore(sess,'./model/model.ckpt') #加载模型
print(sess.run(r))
# model_saver_restore_mapping()