神經網絡的“齒輪”:張量運算

所有計算機程序最終都可以簡化為二進制運算(AND、OR、NOR等),深度神經網絡的所有變換也都可以簡化為數值張量上的一些張量運算(tensor operation)。

keras.layers.Dense(512, activation='relu')
這個層可以理解為一個函數,輸入一個2D張量,返回另一個2D張量,即輸入張量的新表示。這個函數如下所示(其中W是一個2D張量,b是一個向量,二者都是該層的屬性)。
output=relu(dot(W, input)+b)
有三個張量運算:輸入張量和張量W之間的點積運算(dot)、得到的2D張量與向量b之間的加法運算(+)、最後的relu運算。relu(x)是max(x, 0)。

逐元素運算


relu運算和加法都是逐元素(element-wise)的運算,即該運算獨立地應用於張量中的每個元素,這類運算非常適合大規模並行實現

逐元素運算——逐元素relu運算的實現

def naive_relu(x): 
 assert len(x.shape)==2 ←------ x是一個Numpy的2D張量 
 x=x.copy() ←------避免覆蓋輸入張量 
 for i in range(x.shape[0]): 
 for j in range(x.shape[1]): 
 x[i, j]=max(x[i, j], 0) 
 return x
神經網絡的“齒輪”:張量運算

逐元素運算——逐元素加法運算的實現

神經網絡的“齒輪”:張量運算

這些運算都是優化好的Numpy內置函數,這些函數將大量運算交給安裝好的基礎線性代數子程序(BLAS,basic linear algebra subprograms)實現。BLAS是低層次的、高度並行的、高效的張量操作程序,通常用Fortran或C語言來實現。在Numpy中進行逐元素運算,速度非常快。

神經網絡的“齒輪”:張量運算


分享到:


相關文章: