Tensorflow基础
Tensorflow基础
基础概念
- tensor:张量(数据)
- operation(op):专门运算的操作节点,所有操作都是一个op
- graph:图,整个程序的结构
- Session:会话,运算程序的图
Tensorflow属于计算密集型,大多是在cpu上进行计算。
django、scrapy属于IO密集型,比如http请求,磁盘操作等等。
图
图默认已经注册,一组表示 tf.Operation计算单位的对象和tf.Tensor表示操作之间流动的数据单元的对象。
获取调用:
tf.get_default_graph()
op、sess或者tensor 的graph属性
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
#创建一张图,包含了op和tensor
g = tf.Graph()
print(g)
#新创建的图分配新的内存地址
with tf.compat.v1.Session() as sess:
c = tf.constant(11.0)
print(c.graph)
#这个sess下的图和下面sess下的图共用一个地址
a = tf.constant(5.0)
b = tf.constant(6.0)
sum1 = tf.add(a, b)
#默认的这张图,相当于是给程序分配一段内存
graph = tf.compat.v1.get_default_graph()
print(graph)
with tf.compat.v1.Session() as sess:
print(sess.run(sum1))
print(a.graph)
print(sum1.graph)
print(sess.graph)
op
op:只要使用tensorflow的API定义的函数都是op
tensor:知道的就是数据,进行运算,载体
会话
1.会话
前端系统:定义程序的图的结构(用API)
后端系统:运算图结构
会话:连接前端和后端,解析API进行运算。
作用:运行图结构;分配资源计算;掌握资源(变量、队列、线程)
tf.Session()
运行TensorFlow操作图的类,使用默认注册的图(可以指定运行图)
sess = tf.Session() #创建图
sess.run(…) # 启动图
sess.close() #关闭图,资源释放
使用上下文管理器,默认使用完关闭图
with tf.Session() as sess:
sess.run(…)
一个图可以在多个sess中运行,一个sess也能运行多个图
2.会话的run方法
run(fetches, feed_dict=None,graph=None)
运行ops和计算tensor
feed_dict 允许调用者覆盖图中指定张量的值,提供给placeholder使用
a = tf.constant(5.0)
var = 2.0
sum2 = a + var
print(sum2)
with tf.compat.v1.Session() as sess:
print(sess.run(sum2))
#也可以运行,var会被重载为tensor类型。
3.Tensorflow Feed操作
意义:在程序执行的时候,不确定输入的是什么,提前“占个坑”
语法:placeholder提供占位符,run时候通过feed_dict指定参数
import tensorflow as tf
input1 = tf.compat.v1.placeholder(tf.float32)
input2 = tf.compat.v1.placeholder(tf.float32)
output = tf.add(input1, input2)
with tf.compat.v1.Session() as sess:
print(sess.run(output, feed_dict={input1:10.0,input2:20.0}))
张量
1.张量的阶
- Tensorflow基本的数据格式
- 一个类型化的N维度数组(tf.Tensor)
- 三部分,名字,形状,数据类型
2.张量的数据类型
张量属性:
graph 张量所属的默认图
op 张量的操作名
name 张量的字符串描述
shape 张量形状
张量的形状:
0维:() 1维: (5) 2维:(5,6) 3维:(2,3,4)
3.静态形状和动态形状
TensorFlow中,张量具有静态形状和动态形状。
静态形状:创建一个张量或者由操作推导出一个张量时,初始状态的形状。
tf.Tensor.get_shape:获取静态形状
tf.Tensor.set_shape():更新Tensor对象的静态形状
对于静态形状来说,一旦张量形状固定,不能再次设置张量形状。并且,不能跨维度修改。
plt = tf.compat.v1.placeholder(tf.float32, ([None, 2]))
print(plt)
plt.set_shape([3,2])
print(plt)
动态形状:一种描述原始张量在执行过程中的一种形状
tf.reshape:创建一个具有不同动态形状的新张量
用动态形状可以创建一个新的张量,但是改变时候要注意元素数量的匹配。可以跨维度修改。
plt_reshape = tf.compat.v1.reshape(plt,([2,3]))
总结:
1、转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形状
2、 对于已经固定或者设置静态形状的张量/变量,不能再次设置静态形状
3、tf.reshape()动态创建新张量时,元素个数不能不匹配
4.张量操作——生成张量
(1)固定值张量
(2)创建随机张量
5.张量操作-张量变换
(1)改变类型
改变张量的数值类型。常用万能的:tf.cast()
(2)形状和变换
可用于改变张量的形状。
张量的合并:
tf.concat(values, axis, name=‘concat’)
a = [[1,2,3],[4,5,6]]
b = [[7,8,9],[10,11,12]]
c = tf.concat([a, b], axis=0)
d = tf.concat([a, b], axis=1)
with tf.compat.v1.Session() as sess:
print(sess.run(c))
print(sess.run(d))
----------------------------------------------------
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
查询API:https://www.tensorflow.org/versions/r1.0/api_guides/python/math_ops
6.变量
变量也是一种OP,是一种特殊的张量,能够进行存储持久化,它的
值就是张量。
(1)变量的创建
tf.Variable(initial_value=None,name=None)
创建一个带值initial_value的新变量
assign(value)
为变量分配一个新值
返回新值
eval(session=None)
计算并返回此变量的值
name属性表示变量名字
(2)变量的初始化
tf.compat.v1.global_variables_initializer()
添加一个初始化所有变量的op
要在在会话中开启。
a = tf.constant([1,2,3,4,5])
var = tf.Variable(tf.compat.v1.random_normal([2, 3], mean=0, stddev = 1.0))
init = tf.compat.v1.global_variables_initializer()
with tf.compat.v1.Session() as sess:
sess.run(init)
print(sess.run([a, var]))
-----------------------------------------------------------------
[array([1, 2, 3, 4, 5]), array([[-0.07054713, -0.5413116 , 0.31160733],[-1.5784912 , 1.5512209 , -1.481433 ]], dtype=float32)]
tensorboard可视化
1.可视化步骤
(1)数据序列化—events文件
TensorBoard 通过读取 TensorFlow 的事件文件来运行
tf.summary.FileWriter(‘路径/’, graph=default_graph)
返回filewriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用
(2)开启:tensorboard --logdir=路径
2.增加变量显示
目的:观察模型的参数、损失值等变量值的变化。
(1)收集变量
tf.summary.scalar(name=’’,tensor) 收集对于损失函数和准确率
等单值变量,name为变量的名字,tensor为值
tf.summary.histogram(name=‘’,tensor) 收集高维度的变量参数
tf.summary.image(name=‘’,tensor) 收集输入的图片张量能显示图
(2)合并变量写入事件文件
merged = tf.summary.merge_all()
运行合并:summary = sess.run(merged),每次迭代都需运行
添加:FileWriter.add_summary(summary,i),i表示第几次的值
a = tf.constant(3.0, name='a')
b = tf.constant(4.0, name='b')
c = tf.add(a, b, name='add')
var = tf.Variable(tf.compat.v1.random_normal([2, 3], mean=0, stddev = 1.0), name='variable')
init = tf.compat.v1.global_variables_initializer()
with tf.compat.v1.Session() as sess:
sess.run(init)
filewriter = tf.compat.v1.summary.FileWriter('logs', graph = sess.graph)
print(sess.run([a, var]))
线性回归的实现
API:
矩阵运算:tf.matmul(x, w)
平方:tf.square(error)
均值:tf.reduce_mean(error)
梯度下降API:tf.train.GradientDescentOptimizer(learning_rate)
模型保存和加载
tf.train.Saver(var_list=None,max_to_keep=5)
var_list:指定将要保存和还原的变量。它可以作为一个
dict或一个列表传递.
max_to_keep:指示要保留的最近检查点文件的最大数量。
创建新文件时,会删除较旧的文件。如果无或0,则保留所有
检查点文件。默认为5(即保留最新的5个检查点文件。)
例如:
saver.save(sess, ‘/tmp/ckpt/test/model’)
saver.restore(sess, ‘/tmp/ckpt/test/model’)
保存文件格式:checkpoint文件