一、tensorflow的資料型別彙總&變數的建立,初始化等&佔位符建立以及完善
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)最好都要單獨定義,在會話中執行,否則會建立多餘的節點,消耗記憶體。