1. 程式人生 > >一、tensorflow的資料型別彙總&變數的建立,初始化等&佔位符建立以及完善

一、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)最好都要單獨定義,在會話中執行,否則會建立多餘的節點,消耗記憶體。