面试的时候让手撕正向卷积,当时懵了一下然后按照卷积的定义磕磕巴巴写了个大概,现在修改整理一下,博主也是深度学习刚入门,有错误的话请指出。
输入:NHWC
kernel:k*k*C_input*C_output
输出:outputs
def conv2d_forward(inputs, kernel):
outputs = []
for n in range(C_output): # 遍历每个卷积核
h = (H-k+2*padding)/strides + 1
w = (W-k+2*padding)/strides + 1
output = [[bias]*range(w) for _ in range(h)]
for c in range(C): # 输入的每个通道做卷积
for i in range(h):
for j in range(w):
output[i][j] += sum(np.multiply(inputs[c][i:k+i][j:k+j],kernel[n][c]))
outputs.append(output)
return outputs
时间复杂度: C _ o u t p u t ( 输 出 卷 积 核 的 通 道 数 ) ∗ C ( 输 入 的 通 道 数 , 也 就 是 卷 积 核 的 个 数 ) ∗ ( h ∗ w ) ( 输 出 特 征 图 的 尺 寸 ) ∗ k 2 ( 卷 积 核 的 尺 寸 ) C\_output(输出卷积核的通道数)*C(输入的通道数,也就是卷积核的个数)*(h*w)(输出特征图的尺寸)*k^2(卷积核的尺寸) C_output(输出卷积核的通道数)∗C(输入的通道数,也就是卷积核的个数)∗(h∗w)(输出特征图的尺寸)∗k2(卷积核的尺寸)