DL:神经网络算法简介之Affine 层的简介、使用方法、代码实现之详细攻略

DL:神经网络算法简介之Affine 层的简介、使用方法、代码实现之详细攻略


Affine 层的简介

Affine层:神经网络的正向传播中,进行的矩阵的乘积运算,在几何学领域被称为“仿射变换”。几何中,仿射变换包括一次线性变换和一次平移,分别对应神经网络的加权和运算与加偏置运算。

Affine层的计算图:求矩阵的乘积与偏置的和的运算用计算图表示。各个节点间传播的是矩阵。

Affine层的反向传播:注意变量是多维数组。反向传播时各个变量的下方标记了该变量的形状。

注意矩阵的形状:矩阵的乘积(“dot”节点)的反向传播可以通过组建使矩阵对应维度的元素个数一致的乘积运算而推导出来。

批版本的Affine 层

当考虑N个数据一起进行正向传播的情况,就是批版本的Affine层。

批版本的Affi ne 层的计算图

Affine 层的使用方法

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经过激活函数转换后,传递给下一层。这就是神经网络正向传播的流程。

Affine 层的代码实现

#输入数据为张量(四维数据)
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 层的简介、使用方法、代码实现之详细攻略

(0)

相关推荐