DL:神经网络算法简介之Affine 层的简介、使用方法、代码实现之详细攻略
目录
Affine 层的简介
批版本的Affine 层
Affine 层的使用方法
Affine 层的代码实现
Affine层:神经网络的正向传播中,进行的矩阵的乘积运算,在几何学领域被称为“仿射变换”。几何中,仿射变换包括一次线性变换和一次平移,分别对应神经网络的加权和运算与加偏置运算。
Affine层的计算图:求矩阵的乘积与偏置的和的运算用计算图表示。各个节点间传播的是矩阵。
Affine层的反向传播:注意变量是多维数组。反向传播时各个变量的下方标记了该变量的形状。
注意矩阵的形状:矩阵的乘积(“dot”节点)的反向传播可以通过组建使矩阵对应维度的元素个数一致的乘积运算而推导出来。
当考虑N个数据一起进行正向传播的情况,就是批版本的Affine层。
批版本的Affi ne 层的计算图
1、神经网络中计算线性加权
#(1)、神经网络的正向传播中,为了计算加权信号的总和,使用了矩阵的乘积运算,即NumPy中是np.dot()。
X = np.random.rand(2) # 输入 W = np.random.rand(2,3) # 权重 B = np.random.rand(3) # 偏置 #X、W、B分别是形状为(2,)、(2, 3)、(3,) 的多维数组。 Y = np.dot(X, W) + B print(Y) #Y经过激活函数转换后,传递给下一层。这就是神经网络正向传播的流程。
#输入数据为张量(四维数据) class Affine: def __init__(self, W, b): self.W = W self.b = b self.x = None self.dW = None self.db = None def forward(self, x): self.x = x out = np.dot(x, self.W) + self.b return out def backward(self, dout): dx = np.dot(dout, self.W.T) self.dW = np.dot(self.x.T, dout) self.db = np.sum(dout, axis=0) return dx class Affine: def __init__(self, W, b): self.W =W self.b = b self.x = None self.original_x_shape = None # 权重和偏置参数的导数 self.dW = None self.db = None def forward(self, x): # 对应张量 self.original_x_shape = x.shape x = x.reshape(x.shape[0], -1) self.x = x out = np.dot(self.x, self.W) + self.b return out def backward(self, dout): dx = np.dot(dout, self.W.T) self.dW = np.dot(self.x.T, dout) self.db = np.sum(dout, axis=0) dx = dx.reshape(*self.original_x_shape) # 还原输入数据的形状(对应张量) return dx
参考文章”
DL学习—Affine 层:神经网络学习之Affine 层的简介、使用方法、代码实现之详细攻略