手写CNN的forward代码
时间: 2023-07-09 07:41:09 浏览: 39
好的,以下是手写CNN的forward代码,假设输入的特征图为 `input`,卷积核为 `weight`,偏置为 `bias`,步长为 `stride`,填充大小为 `padding`,激活函数为 ReLU:
```python
import numpy as np
def conv2d(input, weight, bias, stride=1, padding=0):
# 获取输入特征图的大小
N, C, H, W = input.shape
# 获取卷积核的大小
F, C, HH, WW = weight.shape
# 计算输出特征图的大小
out_h = int((H + 2 * padding - HH) / stride) + 1
out_w = int((W + 2 * padding - WW) / stride) + 1
# 对输入特征图进行填充
pad_width = ((0, 0), (0, 0), (padding, padding), (padding, padding))
padded_input = np.pad(input, pad_width, mode='constant')
# 创建输出特征图的张量
out = np.zeros((N, F, out_h, out_w))
# 对每个输出特征图的像素进行计算
for n in range(N):
for f in range(F):
for i in range(out_h):
for j in range(out_w):
out[n, f, i, j] = np.sum(padded_input[n, :, i*stride:i*stride+HH, j*stride:j*stride+WW] * weight[f]) + bias[f]
# 对输出特征图进行激活
out = np.maximum(out, 0)
return out
```
其中,`input` 和 `weight` 的维度分别为 `(N, C, H, W)` 和 `(F, C, HH, WW)`,表示输入特征图的大小和卷积核的大小。`bias` 的维度为 `(F,)`,表示偏置的大小。`stride` 和 `padding` 分别表示步长和填充大小。输出的特征图维度为 `(N, F, out_h, out_w)`,表示输出特征图的大小。