def forward(self, x): N, C, H, W = x.shape out_h = int(1 + (H - self.pool_h) / self.stride) out_w = int(1 + (W - self.pool_w) / self.stride) # 展开 col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad) col = col.reshape(-1, self.pool_h * self.pool_w) # 最大值 out = np.max(col, axis=1) # 转换 out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2) return out
def forward(self, x): FN, C, FH, FW = self.W.shape N, C, H, W = x.shape out_h = int(1 + (H + 2 * self.pad - FH) / self.stride) out_w = int(1 + (W + 2 * self.pad - FW) / self.stride) col = im2col(x, FH, FW, self.stride, self.pad) col_W = self.W.reshpe(FN, -1).T # 滤波器的展开 out = np.dot(col, col_W) + self.b # 转换时使用了 # NumPy的 transpose 函数。 transpose 会更改多维数组的轴的顺序 out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2) return out
def forward(self, x): FN, C, FH, FW = self.W.shape N, C, H, W = x.shape out_h = int(1 + (H + 2 * self.pad - FH) / self.stride) out_w = int(1 + (W + 2 * self.pad - FW) / self.stride) col = im2col(x, FH, FW, self.stride, self.pad) #这里通过 reshape(FN,-1) 将参数指定为 -1 ,这是 # reshape 的一个便利的功能。通过在reshape 时指定为 -1,reshape 函数会自 # 动计算 -1 维度上的元素个数,以使多维数组的元素个数前后一致。比如, # (10, 3, 5, 5)形状的数组的元素个数共有750个,指定 reshape(10,-1)后,就 # 会转换成(10, 75)形状的数组。 col_W = self.W.reshape(FN, -1).T # 滤波器的展开 out = np.dot(col, col_W) + self.b # 转换时使用了 NumPy的 transpose 函数。 transpose 会更改多维数组的轴的顺序 out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2) return out
import sys, os import numpy as np sys.path.append(os.pardir) from com.common.util import im2col # im2col(input_data, filter_h, filter_w, stride=1, pad =0) # input_data 由(数据量,通道,高,长)的4维数组构成的输入数据 # filter_h 滤波器的高 # filter_w 滤波器的长 # stride 步幅 # pad 填充 # 批的大小为1,通道大小为3的 7 * 7 的数据 x1 = np.random.rand(1, 3, 7, 7) col1 = im2col(x1, 5, 5, stride=1, pad=0) print(col1.shape) # (9,75) # x2 = np.random.rand(10, 3, 7, 7) col2 = im2col(x2, 5, 5, stride=1, pad=0) print(col2.shape) # (90, 75)