TensorFlow学习笔记1:张量与变量
张量的概念
TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通.零阶张量表示标量,一阶张量表示向量,也就是一个以为数组,第n阶张量为矩阵,也就是一个n维数组。
但张量在tf中并不是采用数组的形式,只是对TF的运算结果的引用。
一个张量包含三个属性:名字name ,维度shape,类型 dtype:
- name:张量的唯一标识。命名规范:“node:src_input” 。node 表示图的节点的名称,src_input 表示张量来自节点的第几个输入(从0开始)
- shape:描述张量的维度信息。
- dtype:每一个张量有一个唯一的类型。不同类型计算会报错。
生成张量
- 创建固定值张量
tf.constant(value, dtype=None, shape=None, name=’Const’) 创建一个常数张量
tf.zeros(shape, dtype=tf.float32, name=None) 创建所有元素设置为零的张量。此操作返回一个dtype具有形状shape和所有元素设置为零的类型的张量。
tf.ones(shape, dtype=tf.float32, name=None) 创建一个所有元素设置为1的张量。此操作返回一个类型的张量,dtype形状shape和所有元素设置为1。
tf.fill(dims, value, name=None) 创建一个填充了标量值的张量。此操作创建一个张量的形状dims并填充它value。 创建相似形状的张量
tf.zeros_like(tensor, dtype=None, name=None) 给tensor定单张量(),此操作返回tensor与所有元素设置为零相同的类型和形状的张量。
tf.ones_like(tensor, dtype=None, name=None) 给tensor定单张量(),此操作返回tensor与所有元素设置为1 相同的类型和形状的张量。创建随机张量
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None) 从截断的正态分布中输出随机值,和 tf.random_normal() 一样,但是所有数字都不超过两个标准差
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None) 从正态分布中输出随机值,由随机正态分布的数字组成的矩阵
randunif_ts=tf.random_uniform(shape,minval=0,maxval=1) 生成均匀分布的随机数,结果返回从minval(包含)到maxval(不包含)的均匀分布的随机数
变量
tf.Variable.init(initial_value, trainable=True, collections=None, validate_shape=True, name=None)
- initial_value:A Tensor或Python对象可转换为a Tensor.变量的初始值.必须具有指定的形状,除非 validate_shape设置为False.
- trainable:如果True,默认值也将该变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES,该集合用作Optimizer类要使用的变量的默认列表
- collections:图表集合键列表,新变量添加到这些集合中.默认为[GraphKeys.VARIABLES]
- validate_shape:如果False允许使用未知形状的值初始化变量,如果True,默认形状initial_value必须提供.
- name:变量的可选名称,默认’Variable’并自动获取
变量的创建
1 | x = tf.Variable(5.0,name="x") |
调用tf.Variable()向图中添加了几个操作:
- 一个variable op保存变量值。
- 初始化器op将变量设置为其初始值。这实际上是一个tf.assign操作。
- 初始值的ops,例如 示例中biases变量的zeros op 也被添加到图中。
变量的初始化
变量的初始化必须在模型的其它操作运行之前先明确地完成。最简单的方法就是添加一个给所有变量初始化的操作,并在使用模型之前首先运行那个操作。最常见的初始化模式是使用便利函数 initialize_all_variables()将Op添加到初始化所有变量的图形中。1
2
3
4init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
通过另一个变量赋值
你有时候会需要用另一个变量的初始化值给当前变量初始化,由于tf.global_variables_initializer()初始化所有变量,所以需要注意这个方法的使用。
就是将已初始化的变量的值赋值给另一个新变量!1
2
3
4
5weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")
w2 = tf.Variable(weights.initialized_value(), name="w2")
w_twice = tf.Variable(weights.initialized_value() * 0.2, name="w_twice")
变量的属性
name
返回变量的名字op
返回变量所有的的op操作
变量的方法
assign
为变量分配一个新值1
2x = tf.Variable(5.0,name="x")
w.assign(w + 1.0)eval
在会话中,计算并返回此变量的值(必须要在初始化后)。这不是一个图形构造方法,它不会向图形添加操作。方便打印结果1
2
3
4
5
6
7
8
9
10v = tf.Variable([1, 2])
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
# 指定会话
print(v.eval(sess))
# 使用默认会话
print(v.eval())
管理图中的变量
- tf.global_variables()
返回图中收集的所有变量
占位符
占位符和变量是使用TensorFlow计算图的关键工具,两者是有区别的
- 变量 是TensorFlow算法中的参数,通过调整这些变量的状态来优化模型算法;
- 占位符 是TensorFlow对象,用于表示输入输出数据的格式,允许传入指定类型和形状的数据。
创建占位符
占位符仅仅是声明数据位置,也即先占个位,后面在会话中通过feed_dict传入具体的数据。示例代码如下:1
2
3
4a=tf.placeholder(tf.float32,shape=[1,2])
b=tf.placeholder(tf.float32,shape=[1,2])
adder_node=a+b #这里的“+”是tf.add(a,b)的简洁表达
print(sess.run(adder_node,feed_dict={a:[2,4],b:[5.2,8]}))