import numpy as np
def conv2d(inputs, kernels, bias, stride, padding):
"""
正向卷积操作
inputs: 输入数据,形状为 (C, H, W)
kernels: 卷积核,形状为 (F, C, HH, WW),C是图片输入层数,F是图片输出层数
bias: 偏置,形状为 (F,)
stride: 步长
padding: 填充
"""
# 获取输入数据和卷积核的形状
C, H, W = inputs.shape
F, _, HH, WW = kernels.shape
# 对输入数据进行填充。在第一个轴(通常是通道轴)上不进行填充,在第二个轴和第三个轴(通常是高度和宽度轴)上在开始和结束位置都填充padding个值。
inputs_pad = np.pad(inputs, ((0, 0), (padding, padding), (padding, padding)))
# 初始化输出数据,卷积后的图像size大小
H_out = 1 + (H + 2 * padding - HH) // stride
W_out = 1 + (W + 2 * padding - WW) // stride
outputs = np.zeros((F, H_out, W_out))
# 进行卷积操作
for i in range(H_out):
for j in range(W_out): # 找到out图像对于的原始图像区域,然后对图像进行sum和bias
inputs_slice = inputs_pad[:, i*stride:i*stride+HH, j*stride:j*stride+WW]
outputs[:, i, j] = np.sum(inputs_slice * kernels, axis=(1, 2, 3)) + bias
# axis=(1, 2, 3)表示在通道、高度和宽度这三个轴上进行求和。
return outputs
# test
# 创建模拟数据
inputs = np.random.rand(3, 5, 5) # 3通道,5x5的输入数据
kernels = np.random.rand(4, 3, 3, 3) # 4个输出通道,3通道的3x3卷积核
bias = np.random.rand(4) # 4个偏置项
stride = 1
padding = 1
# 调用conv2d函数进行卷积操作
outputs = conv2d(inputs, kernels, bias, stride, padding)
# 打印卷积后的输出形状
print("卷积后的输出形状:", outputs.shape)
文章来源地址https://www.toymoban.com/news/detail-738770.html
文章来源:https://www.toymoban.com/news/detail-738770.html
到了这里,关于pytorch复现_conv2d的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!