神经网络的“齿轮”:张量运算

所有计算机程序最终都可以简化为二进制运算(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中进行逐元素运算,速度非常快。

神经网络的“齿轮”:张量运算


分享到:


相關文章: