Tensorflow进阶
记录,成为更好的自己
1.图
2.会话
3.张量
4.变量
5.模型保存和加载
6.自定义命令行参数
1. 图
不管写什么程序,都要先把图建好,写Python程序也是一样的,把业务逻辑理好,再写程序。
- 图默认已经注册好了,定义一张图,相当于是给程序分配内存。
- 图的创建,使用:tf.Gragh()。图中包含了一组op(操作)和tensor(张量)。
- op:使用tensorflow的API定义的函数都是op
- tensor:就是指代数据,计算的时候都是使用的tensor,op相当于一个载体。
- 使用新创建的图
g=tf.Graph() with g.as_default(): a=tf.constant(1.0)
- 获取资源
- tf.get_default_graph()
- op、sess或者tensor的graph属性。
2. 会话
-
tensorflow分为前端系统和后端系统
- 前端系统:定义程序的图的结构
- 后端系统:运算图结构
-
会话:相当于是一个桥梁,连接前端和后端
- 作用:
- 运行图结构
- 分配资源计算
- 掌握资源(变量的资源,队列,线程(都是多线程,得益于使用的numpy))
- 作用:
-
tf.Session(graph=指定的图),一次只能运行一张图。使用默认注册的图(可以指定)
- sess=tf.sess()
sess.run()启动整个图。
会话可能有很多资源,因此,会话结束后要释放资源。sess.close()关闭整个图。
- 使用上下文管理器,会自动释放。
with tf.Session() as sess: sess.run(.....)
config=tf.ConfigProto(log_device_placement=True)这张图中的所有资源。
-
交互式的,一般用于命令行。
tf.InteractiveSession()import tensorflow as tf a=tf.constant(3.0) tf.InteractiveSession() a.eval()//打印出a的值,只要有上下文环境,就可以使用eval。
-
会话的run方法
run(fetches, feed_dict=None, graph=None)
- 用于运行ops和计算tensor
- 嵌套的列表,元组。
- 如sess.run([a, b, sum1])
- feed_dict允许调用者覆盖图中指定张量的值,提供给placeholder使用
- placeholder是占位符,用于实时训练数据,run的时候通过feed_dict指定数据。
plt = tf.placeholder(dtype, shape=[None, 3])//不指定行数,3列 sess.run(plt, feed_dict={plt : [[1,2,3],[4,5,,6]]})
-
返回值异常
RuntimeError:如果它Session处于无效状态(已关闭)
TypeError:如果fetches或feed_dict键是不合适的类型
ValueError:如果fetches或feed_dict键无效或引用Tensor不存在。
3.张量
-
张量的阶和数据类型
张量类似于Numpy,tensorflow依赖了numpy,对numpy进行了封装,类型为tensor。其实就是数组,只不过把名字改了。
- 一个类型化的N维度数组。
- Tensor类型由3部分组成,名字(op的名字,如add),形状,数据类型。
张量的维度成为阶
阶 数学实例 Python 例子 0 纯量 (只有大小) s=483 1 向量 (大小和方向) v=[1,2,3] 2 矩阵 (数据表) m=[[1,2,3],[4,5,6]] 3 3阶张量 (数据立体) t=[[],[],[]] n n阶 (自己想) .....
张量的数据类型,跟平常的数据类型查不多
数据类型 python类型 描述 DT_FLOAT tf.float32 32位浮点数 DT_DOUBLE tf.float64 64位浮点数 DT_INT64 ... ... ...
张量的属性
- graph 张量所属的默认图
- op 张量的操作名
- name 张量的字符串描述
- shape 张量的形状
形状的改变
-
静态形状
创建一个张量或者有操作推导出一个张量是,初始的形状
- tf.get_shape:获取静态形状
- tf.set_shape:更行Tensor对象的静态形状
plt = tf.placeholder(tf.float32, [None, 3]) plt.set_shape([2,3]) print(plt)
对于静态形状来说,一旦张量形状固定了,不能再次设置静态形状, 不能夸维度修改
-
动态形状
一种描述原始张量在执行过程中的一种形状
plt = tf.placeholder(tf.float32, [None, 3]) plt_reshape = tf.reshape(plt, [3,3]) print(plt_reshape)
动态形状可以去创建一个新的张量,改变时候一定要注意元素数量要匹配,可以跨维度
-
区别
有没有生成一个新的张量数据
-
张量操作
- 生成张量
- 固定张量值
-
创建所有元素为0的张量
tf.zeros(shape, dtype=tf.float32, name=None)
-
创建所有元素为1的张量
tf.ones(shape, dtype=tf.float32, name=None)
-
创建一个填充了标量值的张量
tf.constant(value,dtype=None,shape=None,name='Const')
-
- 创建随机张量
-
从正态分布中输出随机值,由随机正态分布的数字组成的矩阵,mean为均值,seddev为方差。
tf.random_normal(shape, mean=0.0, seddev=1.0, dtype=tf.float32,seed=None, name=None)
-
- 固定张量值
- 改变类型
- tf.string_to_number(string_tensor, out_type=None,name=None)
- tf.cast(x,dtye,name=None)
- 切片与扩展
- tf.concat(values, axis, name='Concat')
网友评论