tensorflow2.0常用操作記錄

tensorflow是非常流行的深度學習框架,其2.0版本與其1.0版本也有較大不同,因此筆者就近期對tensorflow2.0的基本操作的學習進行記錄,以供日後查閱。

創建tensor

tf.constant(1)
tf.constant(1.)
tf.constant(2.2, dtype=tf.double)
tf.constant(2.2, dtype=tf.float16)
tf.constant([True, False])
tf.constant('Hello World!')

判斷變量創建在cpu還是gpu上

c = tf.constant([1,2,3])
d = tf.range(5)
c.device
d.device

輸出如下:
在這裏插入圖片描述
也可以強制變量創建在cpu或者gpu上
在這裏插入圖片描述
也可以將cpu上的變量換到gpu上,同理也可以將gpu上變量換到cpu上,現在新版本tensorflow允許cpu和gpu上變量進行計算了,老版本則不允許,此時需要將cpu的變量保存到gpu上才能和gpu上變量進行運算。如下:
在這裏插入圖片描述
在這裏插入圖片描述

張量基本操作

查看張量大小可以用shape()
在這裏插入圖片描述
查看張量的值用numpy()
在這裏插入圖片描述
判斷一個變量a是不是張量,用isinstance(a, tf.Tensor),或tf.is_tensor(a),推薦使用後者,因爲前者在判斷Variable類型時會返回False而後者返回True
在這裏插入圖片描述
將普通變量轉爲tensor,可以使用tf.convert_to_tensor(a)
在這裏插入圖片描述
張量內部數據類型轉換,用cast(a, dtype=xxx)
在這裏插入圖片描述
查看張量內部數據類型,用a.dtype,還有個已經廢棄的屬性,即name屬性,同時張量也可以很容易轉換成Variable類型,事實上不嚴謹地說可以把Variable當成Tensor的子類(其實不是而且區別挺大的)。且Variable類型的變量具有trainable屬性,且默認爲true且不能修改
在這裏插入圖片描述

張量的生成函數

# tf.zeros系列
tf.zeros([]) #<tf.Tensor: id=70, shape=(), dtype=float32, numpy=0.0>
tf.zeros([1]) # <tf.Tensor: id=76, shape=(1,), dtype=float32, numpy=array([0.], dtype=float32)>

a = tf.zeros([2,3,3])
tf.zeros_like(a) # 生成與a的維度相同的全零張量
tf.zeros(a.shape) # 與tf.zeros_like(a)作用相同

# tf.ones系列
tf.ones([1,2,3])
tf.ones_like(a)

# tf.fill系列
tf.fill([2,2],0)

# tf.random系列
# tf.random.normal是正態分佈,mean是均值,stddev是標準差(方差開根號)
tf.random.normal([2,2], mean=1, stddev=1)
# tf.random.truncated_normal是截斷正態分佈,其數據分佈限制在均值±2倍標準差的範圍
tf.random.truncated_normal([2,2], mean=0, stddev=1)
# tf.random.uniform是均勻分佈
tf.random.uniform([2,2], minval=0,maxval=1)

# tf.range系列
a = tf.range(10)
# 將張量內部順序隨機打亂,用tf.random.shuffle
idx=tf.range(10)
idx=tf.random.shuffle(idx) 
# <tf.Tensor: id=151, shape=(10,), dtype=int32, numpy=array([8, 7, 1, 6, 2, 5, 9, 3, 4, 0])>

數據打亂整形技巧shuffle與gather

比如給定一個一維張量,要把其元素隨機打亂,要如何處理?
如下圖,假設給定的一維張量爲b,長度爲10,idx爲打亂後的索引值,則可以根據一個給定的索引列表idx來打亂張量b。
在這裏插入圖片描述
當然如果只是單純的要打亂b的話可以使用如下方法,使用gather的好處是知道和原列表的對應關係:
在這裏插入圖片描述

one_hot編碼

在這裏插入圖片描述

mse

下圖爲計算y與out之間的MSE
在這裏插入圖片描述

reduce系列

reduce_min, reduce_max, reduce_mean, reduce_sum

分別求一個張量中的最小值、最大值、平均值、和
可以指定axis,默認是求全局,之所以前面加上reduce是因爲該函數必然會導致降維

最大最小值的索引

採用tf.argmax(a,axis=xx)可以獲得a沿着xx維上的最大值的索引,tf.argmin同理。

取張量中數據的操作

a = tf.ones([1,5,5,3])
a[0][0]
a[0, 0] # 和上式效果相同,推薦這種寫法
a[-1:, :]
a[0::2] # 隔一個取一個

gather和gather_nd

tf.gather在上面已經見過了,但是其實它的真正用法在於從張量中抽取數據,可以指定抽取的維度,和某個緯度上抽取的元素的索引。
在這裏插入圖片描述
gather_nd可以取多個維度指定索引的數據(圖源網絡)
在這裏插入圖片描述

boolean_mask

boolean_mask可以取指定維度標爲true的數據(圖源網絡)
在這裏插入圖片描述

維度變化

轉置:

# 將a中元素按指定軸的順序轉置,此處爲將axis=0和axis=1進行轉置
tf.transpose(a, [0,2,1,3])

維度擴展:
在這裏插入圖片描述
維度降低(將長度爲1的維度刪除):
在這裏插入圖片描述
指定刪除維度:
在這裏插入圖片描述

矩陣乘法

A@Btf.matmul(A, B)

張量連接與取消連接

引入:concat,stack,unstack,split
concat不擴展維度,只增加長度,要求指定維度以外的維度的長度都相同
stack擴展維度,要求所有維度都相同
unstack降低緯度,將指定維度分爲指定維度的長度個低維張量
split緯度分割,可以將指定維度分爲指定長度的幾個部分

在這裏插入圖片描述

範數

# 求張量a沿着第3(2+1)個維度上的1範數
tf.norm(a, ord=1, axis=2)

張量列表不重複元素

使用unique可以獲得不重複元素和其索引組成的tuple,可以用gather給它還原
在這裏插入圖片描述


參考資料:https://github.com/dragen1860/TensorFlow-2.x-Tutorials

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章