Tensorflow,如名所示,是一個定義和計算求解張量tensor的框架。
Tensor張量就是基于數據類型dtype定義的n維數組。
tf.Tensor
對象表示最終將產生一個值,但自身并不直接是一個值。
先使用tensor張量和計算操作ops編織一個計算圖graph,然后再運行它獲得結果。
Tensor兩個屬性:數值類型dtype和數值形狀(維數與長度)shape。
每個tensor內的數值必須是同樣類型;并且數值類型dtype必須是已知的,shape是半已知的(比如[None,3]表示n個三元數組)。
對于大部分操作來說,如果輸入的張量形狀確定,那么操作結果輸出的張量形狀也是確定的,但有些時候只有在計算圖被執行的時候才能知道張量的形狀。
特殊張量tf.Variable、tf.constant、tf.placeholder、tf.SparseTensor
將留在稍后文章中介紹。
注意下面的
tf.Variable()
所生成的張量是固定不變的,每次張量被執行的時候,它只會有一個值。
Rank等級:張量的維度
Rank 屬性名稱
0 標量Scalar (只有大小magnitude only)
1 矢量Vector (大小與方向magnitude and direction)
2 矩陣Matrix (數字表table of numbers)
3 三維張量3-Tensor (數字立方體cube of numbers)
n N維張量n-Tensor (你猜you get the idea)
Rank 0:標量
mammal = tf.Variable("Elephant", tf.string)
ignition = tf.Variable(451, tf.int16)
floating = tf.Variable(3.14159265359, tf.float64)
its_complicated = tf.Variable(12.3 - 4.85j, tf.complex64)
注意:在tensorflow中字符串string被當作標量處理,而不是數組隊列。
Rank 1:矢量,數組
mystr = tf.Variable(["Hello"], tf.string)
cool_numbers = tf.Variable([3.14159, 2.71828], tf.float32)
first_primes = tf.Variable([2, 3, 5, 7, 11], tf.int32)
its_very_complicated = tf.Variable([12.3 - 4.85j, 7.5 - 6.23j], tf.complex64)
Higher rank更高等級:更多層的數組
mymat = tf.Variable([[7],[11]], tf.int16)
myxor = tf.Variable([[False, True],[True, False]], tf.bool)
linear_squares = tf.Variable([[4], [9], [16], [25]], tf.int32)
squarish_squares = tf.Variable([ [4, 9], [16, 25] ], tf.int32)
rank_of_squares = tf.rank(squarish_squares)
mymatC = tf.Variable([[7],[11]], tf.int32)
my_image = tf.zeros([10, 299, 299, 3]) # batch x height x width x color
獲取tensor的rank等級
import tensorflow as tf
sess= tf.Session()
t=tf.Variable([ [4, 9], [16, 25] ], tf.int32)
img = tf.zeros([10, 299, 299, 3])
init = tf.global_variables_initializer()
sess.run(init)
v1=sess.run(tf.rank(t))
v2=sess.run(tf.rank(img))
print(v1,v2)
注意必須run運行張量,才能在運行中獲取張量的rank。以上代碼輸出2,4。
2 4
張量切片索引
因為張量本身是一個n維的嵌套數組,每個單元如何使用索引訪問?
rank0只有一個值不存在索引問題。
rank1是數組,直接my_vector[2]形式就可以,甚至[]中可以使用tensor動態變化。
rank2是數字表,my_matrix[1, 2]得到的是一個標量數字,使用冒號選擇子層數組,my_matrix[:, 3]選擇第三列。
Shape形狀
張量的形狀是指在每個等級(rank維度)上元素的數量,因為一個張量可能不止1個維度,所以,形狀也是多個數字組成的數組??梢允菙到M[3,2],元組(3,3),也可以是個整數4,還可以是tf.TensorShape
對象例如TensorShape([16, 256]),TensorShape([None, 256])
。
當計算圖graph被計算的時候,tensorflow自動推斷張量的形狀,由于等級可能是未知也可能已知的,所以形狀也可能是未知的。
獲取張量的形狀
import tensorflow as tf
sess= tf.Session()
t=tf.Variable([ [4, 9], [16, 25] ], tf.int32)
img = tf.zeros([10, 299, 299, 3])
my_matrix=tf.Variable([[1,2],[2,4],[4,3]])
zeros = tf.zeros(my_matrix.shape[1])
print(t.shape)
print(img.shape)
print(my_matrix.shape)
print(zeros)
輸出:
(2, 2)
(10, 299, 299, 3)
(3, 2)
Tensor("zeros_1:0", shape=(2,), dtype=float32)
注意zeros是一個行數2,列數未知的張量。
改變tf.Tensor
的形狀
因為shape就是指張量每層數組的元素數,所以我們可以使用tf.reshape
方法改變張量,也就是元素數量,注意在轉變過程中元素總數不能變多也不能變少,張量的形狀也不能出現小數。
import tensorflow as tf
rank_three_tensor = tf.ones([3, 4, 5]) #3x4x5=60共60的數字立方體
matrix = tf.reshape(rank_three_tensor, [6, 10]) #變為6x10 matrix
matrixB = tf.reshape(matrix, [3, -1]) # 3x20matrix,-1 表示自動計算這維度元素個數.
matrixAlt = tf.reshape(matrixB, [4, 3, -1]) # 4x3x5數字立方
notgood = tf.reshape(matrixB, [6,2]) #代碼報錯,因為6x2不等于60,無法決定取舍
notgood2 = tf.reshape(matrixAlt, [13, 2, -1]) #代碼報錯,因為13x2無法被60整除!
數據類型tf.Datatype
tf.cast
可以用來轉化數據類型
#整數轉到小數
float_tensor = tf.cast(tf.constant([1, 2, 3]), dtype=tf.float32)
使用張量的dtype來獲取張量的數據類型。
計算張量
除了使用tf.Session().run()
方法以外,還可以用張量的eval()方法快速計算張量結果:
import tensorflow as tf
sess=tf.Session()
constant = tf.constant([1, 2, 3])
tensor = constant * constant
with sess.as_default():
print(tensor.eval())
print(tensor.eval(session=sess)) #格式不同
Tensor.eval(session,feed_dict)
輸出
[1 4 9]
[1 4 9]
使用喂食字典的示例
import tensorflow as tf
sess=tf.Session()
p = tf.placeholder(tf.float32)
t = p + 1.0
v=t.eval(session=sess,feed_dict={p:2.0}) #此處p必須與placeholder變量名相同
print(v)
輸出
3
注意,如果張量的值依賴一個隊列queues,那么只會計算隊列一遍。結合隊列的情況需要先呼叫tf.train.start_queue_runners
打印張量
print方法打印的是Tensor對象,不是計算得到的值。tf.print()
方法是一個操作,被計算的時候打印輸出。
import tensorflow as tf
sess=tf.Session()
t=tf.Variable(5, tf.int32)
tf.Print(t, [t])
t = tf.Print(t, [t]) #計算時被打印
result = t + 1
init = tf.global_variables_initializer()
sess.run(init)
print(t)
sess.run(result)
輸出結果
Tensor("Print_1:0", shape=(), dtype=int32)
[5]
本篇小結
- 張量的基本概念
- Rank 張量的等級,就是維度,是數組嵌套的層數
- rank0標量,1矢量,2矩陣,3數字立方體
- 獲取等級```sess.run(tf.rank(t))
- 獲取元素my_matrix[1, 2],my_matrix[:, 2]
- Shape張量的形狀就是每個等級的元素數量
- 獲取張量形狀
直接 print(t.shape)
- 改變張量的形狀
tf.reshape(t,[m,n,..]),元素數必須保持不變 *數據類型tf.Datatype,
t.eval(session=sess,feed_dict={p:2.0})```
- 獲取張量形狀
- 打印張量操作
tf.print(t,[t])
探索人工智能的新邊界
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,感謝轉發~
END