TensorFlow中用张量(Tensor)来表示所有的数据结构。张量,可以理解为一个n维矩阵,所有类型的数据都是通过张量来表示的。
本文所用的TensorFlow版本为1.15,以下资料参考自TensorFlow官方API
常量
常量与其他编程语言中的一样,是不可改变的张量。
tf.constant()
tf.constant(
value,
dtype=None,
shape=None,
name='Const',
verify_shape=False
)
- value
常量的值,使用时必须指定。 - dtype
常量类型,默认为未指定,当未指定时,从value自动推断。如果dtype指定类型,则将value强制转换为dtype。 - shape
常量的形状,该参数是可选的。如果存在,将指定常量的尺寸。如果不存在,则使用value的形状。value在指定时,如果为列表,长度必须小于或等于shape所含的元素数量。如果列表长度小于指定的shape元素数量,则列表中的最后一个元素将用于填充其余的条目。tensor = tf.constant([1, 2, 3, 4],shape = [2,3]) => [[1,2,3] [4,4,4]]
- name
为常量定义名称,默认为Const。 - verify_shape
默认值为False,如果值为True时,在定义常量时会自动检测value和shape维度是否相同,不同则报错,例如value定义为1,而shape定义为一行两列的矩阵[1,2],那么肯定会报错。
变量
当一个量在会话中的值需要更新时,使用变量来表示。例如,在神经网络中,权重需要在训练期间更新,可以通过将权重声明为变量来实现。变量在使用前需要被显示初始化。
tf.Variable类
TensorFlow中的变量使用Variable类来保存,使用时用initial_value参数指定初始化函数,name参数指定变量名。同时,支持用常量函数对变量进行初始化。
#定义一个变量,该变量大小为[1],值取自(-1.0,1.0)均匀分布
Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
#定义一个变量,该变量大小为[1],值均为0
biases = tf.Variable(tf.zeros([1]))
变量与常量有所不同,变量只指定了生成的方法,但是在运行之前还没有进行真正的初始化,所以对变量都应该进行初始化操作。
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
tf.get_variable()
tf.get_variable() 函数也用于生成变量,相比于 tf.Variable 类,该函数多了对变量名进行检查的过程,该函数不允许在同一个变量上下文中出现同名变量。在使用 tf.Variable 类创建同名变量时,生成函数会自动修正变量的名称,而 tf.get_variable() 函数报错。
w_1 = tf.Variable(1,name="w_1")
w_2 = tf.Variable(1,name="w_1")
print (w_1.name)
print (w_2.name)
#输出
#w_1:0
#w_1_1:0
import tensorflow as tf
w_1 = tf.get_variable(name="w_1",initializer=1)
w_2 = tf.get_variable(name="w_1",initializer=2)
print (w_1.name)
print (w_2.name)
#ValueError:Variable w_1 already exists, disallowed.
在使用tf.get_variable()时,通常要指定初始化类initializer参数才能生成不同分布的数据。
初始化类 | 数据 |
---|---|
tf.constant_initizlizer | 使用常量初始化 |
tf.random_normal_initializer | 正态分布初始化 |
tf.random_uniform_initializer | 均匀分布初始化 |
tf.zeros_initializer | 全0初始化 |
tf.ones_initializer | 全1初始化 |
占位符
用于将值输入 TensorFlow 图中。它们可以和 feed_dict 一起使用来输入数据。在训练神经网络时,它们通常用于提供新的训练样本。在会话中运行计算图时,可以为占位符赋值。这样在构建一个计算图时不需要真正地输入数据。需要注意的是,占位符不包含任何数据,因此不需要初始化它们。
tf.placeholder(dtype,shape=None,name=None)
占位符在使用时,使用feed_dict来赋值,其格式为字典型。
import tensorflow as tf
x = tf.placeholder(tf.float32)
y = 2*x
data = tf.random_uniform([1,5],10)
with tf.Session() as sess:
x_data = sess.run(data)
print(sess.run(y, feed_dict= {x:x_data}))
输出结果为
[[10.778231 9.779522 15.694902 16.73773 5.340846]]