class Convolution: def __init__(self, W, b, stride=1, pad=0): self.W = W self.b = b self.stride = stride self.pad = pad # 中间数据(backward时使用) self.x = None self.col = None self.col_W = None # 权重和偏置参数的梯度 self.dW = None self.db = None def forward(self, x): FN, C, FH, FW = self.W.shape N, C, H, W = x.shape out_h = 1 + int((H + 2*self.pad - FH) / self.stride) out_w = 1 + int((W + 2*self.pad - FW) / self.stride) col = im2col(x, FH, FW, self.stride, self.pad) col_W = self.W.reshape(FN, -1).T out = np.dot(col, col_W) + self.b out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2) self.x = x self.col = col self.col_W = col_W return out def backward(self, dout): FN, C, FH, FW = self.W.shape dout = dout.transpose(0,2,3,1).reshape(-1, FN) self.db = np.sum(dout, axis=0) self.dW = np.dot(self.col.T, dout) self.dW = self.dW.transpose(1, 0).reshape(FN, C, FH, FW) dcol = np.dot(dout, self.col_W.T) dx = col2im(dcol, self.x.shape, FH, FW, self.stride, self.pad) return dx
时间: 2023-12-30 14:03:47 浏览: 92
Residual-Networks.zip_-baijiahao_47W_python residual_python残差网络
这段代码定义了 Convolution 类的前向传播和反向传播方法,其中前向传播方法 forward 接受输入张量 x,返回卷积层的输出张量 out。在前向传播方法中,它首先计算输出张量 out 的高度和宽度,然后将输入张量 x 转换成列向量 col,并将卷积核的权重 W 转换成列向量 col_W。接着,它计算输出张量 out,将其 reshape 成 4 维,并将通道轴移动到最后一维。最后,它将计算出的中间变量保存在类的属性中,并返回输出张量 out。
反向传播方法 backward 接受输入梯度张量 dout,计算并返回输入张量 x 的梯度 dx。在反向传播方法中,它首先将输入梯度张量 dout 转换成 2 维,并计算偏置参数的梯度 db 和权重参数的梯度 dW。然后,它将 dW 转换成与权重 W 相同的形状,并计算列向量 dcol。最后,它将 dcol 转换成输入张量 x 的梯度 dx,并返回该张量作为输出。
阅读全文