1、图的相关操作
1.1默认图
- 访问方法:tf.get_default_graph()
- 查看属性:.graph (op、sess都含有graph属性)
1.2创建图
#自定义图
new_g = tf.Graph()
#在图中定义数据和操作
with new_g.as_default():
具体的操作...
#开启会话
with tf.Session(graph=new_g) as new_sess:
具体操作...
2、TensorBoard:可视化学习
#数据序列化-events文件
tf.summary.FileWriter(path,graph = )
#启动TensorBoard
在终端输入 tensorboard --logdir=path
在浏览器中打开图页面127.0.0.1:6006
3、OP
3.1 指令名称
一个图一个命名空间
a = tf.constant(3.0, name="a")
4、会话(2.0没有了)
4.1 会话的两种创建方式:
- tf.Session:用于完整的程序当中
- tf.InteractiveSession:用于交互式上下文中的TensorFlow
4.2 会话里查看张量的值:
.eval()
4.3 初始化会话的参数:
target=‘’,graph=None, config=None
4.4 开启会话:
with tf.Session() as sess:
具体操作...
4.5 会话的run:
- session.run(fetches,feed_dict=None,options=None,run_metadata=None)
4.6 feed操作
placeholder提供占位符,run时候通过feed_dict制定参数
- 定义占位符(相当于提前声明)
a = tf.placeholder(tf.float32)
5、张量(Tensor)
- 标量:一个数字 0阶张量
- 向量:一维数组 [1,2,3,4] 1阶张量
- 矩阵:二维数组 [ [1,2,3,4], 2阶张量
[1,2,3,4]]
- 张量:n维数组 n阶张量
5.1 张量的类型
tf.int32; tf.float32; tf.float64等
5.2 张量的阶
- 0阶张量:纯量,只有大小
- 1阶张量:向量,有大小和方向
- 2阶张量:矩阵,数据表
- 3阶张量:数据立体
5.3 创建张量
创建张量时若不指定类型,则默认为tf.float32,整型默认为tf.int32,浮点型默认为tf.float32
1. 固定值
- 所有元素为0:tf.zeros(shape=[3,4],dype=tf.float32,name=None)
tf.zeros_like(tensor1,dype=tf.float32,name=None)
- 所有元素为1:tf.ones(shape=[3,4],dype=tf.float32,name=None)
tf.ones_like(tensor1,dype=tf.float32,name=None)
- 元素为标量值
tf.constant(value,dype=None,shape=None,name='Const')
2. 随机值
tf.random(shape=[3,4],mean=0.0,stddev=1.0,dype=tf.float32,seed=None,name=None)
5.4 张量的变换
1. 类型改变:
- tf.string_to_number(string_tensor, out_type=None, name=None)
- tf.to_double(tensor, name='ToDouble')
- tf.to_float(tensor, name='ToFloat')
- tf.to_int32(tensor, name='ToInt32')
- tf.cast(tensor,dtype, name=None) 不改变原始的张量,会返回新的张量
2. 形状改变:
- 形态形状:初始创建张量时的形状
只有在形状没有完全固定下来的时候才能通过tensor.set_shape()改变
形状未固定的例子:a = tf.placeholder(dtype=tf.float32,shape=[None,None])
- 动态形状:tensor.reshape(tensor,shape), 要保证前后元素的数量一样;不改变原始的张量,会返回新的张量
5.5 张量的数学运算
看官网介绍
6、变量OP
特点:存储持久化
可修改值
可指定被训练
适合保存模型参数
6.1 创建变量
tf.Variable.init(initial_value, trainable=True, collections=None, validate_shape=True, name=None))
例:a = tf.Variable.init(initial_value=30),30是初始化值,还需要对变量初始化
init = tf.global_variables_initializer()
在会话里运行sess.run(init)
6.2 修改变量命名空间
使用tf.variable_scope
with tf.variable_scope("my_scope"):
a = tf.Variable.init(initial_value=30)
7、高级API
7.1 其他基础API
tf.app
tf.image
tf.gfile
tf.summary
tf.python_io
tf.train
tf.nn
7.2 高级API
tf.keras
tf.layers
tf.estimator
tf.contrib
8、增加其他功能
8.1 增加变量显示
1.收集变量
- tf.summary.scalar(name=' ',tensor) 收集单值变量,name为名字,tensor为值
- tf.summary.histogram(name=' ',tensor) 收集高纬度的变量参数
- tf.summary.image(name=' ',tensor) 收集输入的图片张量
2.合并写入事件中
- merged = tf.summary.merage_all()
- 运行合并:summary = sess.run(merged),每次迭代都要运行
- 添加FileWriter.add_summary.image(summary,i) 表示第几次值
def linear_regression():
x = tf.random_normal(shape=[100,1])
y_true = tf.matmul(x,[[0.8]])+0.7
weights = tf.Variable.init(initial_value=tf.random_normal(shape = [1,1]))
bias = tf.Variable.init(initial_value=tf.random_normal(shape = [1,1]))
y_predict = tf.matmul(x,weights)+bias
error = tf.reduce_mean(tf.square(y_predict-y_true))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.07).minimize(error)
init = tf.global_variables_initializer()
tf.summary.scalar("error",error)
tf.summary.histogram("weights",weights)
tf.summary.histogram("bias",bias)
merged = tf.summary.merage_all()
with tf.Session as sess:
sess.run(init)
file_writer = tf.summary.FileWriter("./tmp/linear",graph = sess.graph)
print("训练前参数为:权重%f,偏置%f,损失%f" % (weights.eval(),bias.eval(),error.eval()))
for i in range(100):
sess.run(optimizer)
print("第%d次训练后参数为:权重%f,偏置%f,损失%f" % (i+1,weights.eval(),bias.eval(),error.eval()))
summary = sess.run(merged)
filew_riter.add_summary.image(summary,i)
return None
8.2 增加命名空间
def linear_regression():
with tf.variable_scope("prepare_data"):
x = tf.random_normal(shape=[100,1],name = "Features")
y_true = tf.matmul(x,[[0.8]])+0.7
with tf.variable_scope("create_model"):
weights = tf.Variable.init(initial_value=tf.random_normal(shape = [1,1]),name = "Weights")
bias = tf.Variable.init(initial_value=tf.random_normal(shape = [1,1]),name = "Bias")
y_predict = tf.matmul(x,weights)+bias
with tf.variable_scope("loss_function"):
error = tf.reduce_mean(tf.square(y_predict-y_true))
with tf.variable_scope("optimizer"):
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.07).minimize(error)
init = tf.global_variables_initializer()
tf.summary.scalar("error",error)
tf.summary.histogram("weights",weights)
tf.summary.histogram("bias",bias)
merged = tf.summary.merage_all()
with tf.Session as sess:
sess.run(init)
file_writer = tf.summary.FileWriter("./tmp/linear",graph = sess.graph)
print("训练前参数为:权重%f,偏置%f,损失%f" % (weights.eval(),bias.eval(),error.eval()))
for i in range(100):
sess.run(optimizer)
print("第%d次训练后参数为:权重%f,偏置%f,损失%f" % (i+1,weights.eval(),bias.eval(),error.eval()))
summary = sess.run(merged)
filew_riter.add_summary.image(summary,i)
return None
8.3 模型保存和加载
1、保存
tf.train.saver(var_list=None,max_to_keep=5)
- var_list:指定要保存和还原的变量
- max_to_keep:指示要保留的最近检查点文件的数量
2、加载模型
checkpoint = tf.train.latest_checkpoint(path)
saver.restore(sess,checkpoint)
例子:
//实例化
saver = tf.train.saver(var_list=None,max_to_keep=5)
//保存
saver.save(sess,"./tmp/model/my_linear.ckpt"),path里包括模型的名字,名字的后缀是.ckpt;路径里的文件夹必须是已经存在的
//加载
if os.path.exists("./tmp/model/checkpoint"):
saver.restore(sess,"./tmp/model/my_linear.ckpt")
8.4 命令行参数的使用
tf.app.flags.DEFINE_integer("max_step",100,"模型的训练步数")
tf.app.flags.DEFINE_string("model_dir",Unkonwn,"模型保存的路径+名字")
FLAGS = tf.app.flags.FLAGS
print("max_step:\n",FLAGS.max_step)
print("model_dir:\n",FLAGS.model_dir)