Constants as Sequences
tf.lin_space(start,stop,num,name=None)
TensorFlow数据类型汇总
tf.float16 | 半精度浮点数16-bit half-precision floating-point |
---|---|
tf.float32 | 单精度浮点数32-bit single-precision floating-point |
tf.float64 | 双精度浮点数64-bit double-precison floating-point |
tf.bfloat16 | 16位截断浮点数16-bit truncated floating-point |
tf.complex64 | 64位复数64-bit single-precision complex |
tf.complex128 | 128位复数128-bit double-precision complex |
tf.int8 | 8位有符号整型8-bit signed integer |
tf.uint8 | 8位无符号整型8-bit unsigned integer |
tf.uint16 | 16位无符号整型16-bit unsigned integer |
tf.int16 | 16位有符号整型16-bit signed integer |
tf.int32 | 32位有符号整型32-bit signed integer |
tf.int64 | 64位有符号整型64-bit signed integer |
tf.bool | 布尔型Boolean |
tf.string | 字符串型,每一个张量元素都是一个字节数组 String |
tf.qint8 | 用于量化Ops的8位有符号整型Quantized 8-bit signed integer |
tf.uqint8 | 用于量化Ops的8位无符号整型Quantized 8-bit unsigned integer |
tf.qint16 | Quantized 16-bit signed integer |
tf.uqint16 | Quantized 16-bit unsigned integer |
tf.qint32 | Quantized 32-bit signed integer |
tf.resource | Handle to a mutable resource |
变量(tf.Variable)
要多使用tf.Variable而不是tf.constant。因为当常量很多的时候,导入图就会开销很大。所以只在基本类型中使用常量。
变量的创建
变量的创建可以使用下面两种方式:
使用tf.Variable创建,例如
s = tf.Variable(2, name="scalar")
m = tf.Variable([[0, 1], [2, 3]], name="matrix")
W = tf.Variable(tf.zeros([784,10]))
使用tf.get_variable创建,例如
s = tf.get_variable("scalar", initializer=tf.constant(2))
m = tf.get_variable("matrix", initializer=tf.constant([[0, 1], [2, 3]]))
W = tf.get_variable("big_matrix", shape=(784, 10), initializer=tf.zeros_initializer())
tf.Variable和tf.get_variable的定义分别是下面:
tf.Variable(initial_value=None, trainable=True, collections=None, validate_shape=True, caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None, import_scope=None)
tf.get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None, trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True, custom_getter=None)
这两种创建变量的方式都能得到一个variable对象,而该变量具有好几种ops,比如创建了变量x=tf.Variable(…),那么具有以下的ops:x.initializer(初始化)x.value()(read op)x.assign(…)(写入)opx.assign_add(…)(加)
所以可以看出:tf.constant是一个op,而tf.Variable是具有很多op的一个类。
变量必须初始化
变量在使用之前必须初始化,而需要注意的是,初始化操作(initializer)也是一个Op,必须在会话(session)中执行。
一次初始化所有的变量:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
只是初始化一个变量的时候,可以使用initializer
with tf.Session() as sess:
sess.run(d.initializer)
d是定义好的一个变量。
tf.Variable.assign()
assign也是一个Op,需要在会话(session)中执行才能生效。
w=tf.Variable(10)
assign_op=w.assign(100)
with tf.Session() as sess:
sess.run(w.initializer)
sess.run(assign_op)
print(w.eval())
assign_add() &assign_sub()分别对变量进行加和减运算。
每一个会话session都会有一个复制的变量。
占位符tf.placeholder()
占位符类似于函数的“形参”,先定义好变量的形式,执行的时候再赋予具体的值。占位符并没有初始值,只是分配了必要的内存。使用占位符,可以在想执行计算的时候再完善数据。
tf.placeholder(dtype,shape=None,name=None)
shape张量的形状
下面是创建占位符,并完善占位符的例子:
# create a placeholder for a vector of 3 elements, type tf.float32
a = tf.placeholder(tf.float32, shape=[3])
b = tf.constant([5, 5, 5], tf.float32)
# use the placeholder as you would a constant or a variable
c = a + b # short for tf.add(a, b)
with tf.Session() as sess:
print(sess.run(c)) # >> InvalidArgumentError: a doesn’t an actual value
执行会报错,所以在执行前要完善占位符。完善占位符的办法如下所示:
with tf.Session() as sess:
print(sess.run(c, feed_dict={a: [1, 2, 3]})) # the tensor a is the key, not the string ‘a’
# >> [6, 7, 8]
或者省略掉feed_dict:
with tf.Session() as sess:
print(sess.run(c, {a: [1, 2, 3]}))
feed_dict是一个字典,在字典中给出用到占位符的取值,feed_dict={key:value,key:value…}
lazy loading问题
每一步计算(computing)或者运行(running)用到的操作(op)最好都要单独定义,在会话中执行,否则会创建多余的节点,消耗内存。