动手学深度学习(Pytorch版)代码实践 -卷积神经网络-21多输入多输出通道

21多输入多输出通道


python 复制代码
import torch
from d2l import torch as d2l

def corr2d(X, K):
    """计算二维互相关运算"""
    h, w = K.shape
    Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            Y[i, j] = (X[i:i + h, j:j + w] * K).sum()
    return Y

# 多输入通道互相关运算
def corr2d_multi_in(X, K):
     #对于每对输入通道 x 和滤波器 k,调用 corr2d 函数,并将所有结果相加。
     return sum(corr2d(x, k) for x, k in zip(X, K))
    #zip(X, K) 会生成一个元组迭代器,其中每个元组包含 X 和 K 中的对应元素

# X 是一个具有两个输入通道的张量,K 是一个具有两个通道的滤波器。
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
               [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])

print(corr2d_multi_in(X, K))
"""
tensor([[ 56.,  72.],
        [104., 120.]])
"""

# 多输出通道
def corr2d_multi_in_out(X, K):
    #对于每个输出通道的滤波器 k,调用 corr2d_multi_in 函数,并将所有结果堆叠在一起形成新的张量。
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

# 将 K 扩展为一个具有三个输出通道的新滤波器
# K,K中每个元素加1,K中每个元素加2
K = torch.stack((K, K + 1, K + 2), 0)
print(K.shape)
#torch.Size([3, 2, 2, 2])
#具有3个输出通道、每个输出通道有2个输入通道的2x2滤波器的卷积核集合。
"""
第0维:新维度插入到最前面,堆叠的张量沿着第0维度排列。torch.Size([3, 2, 2, 2])
第1维:新维度插入到第二个位置,堆叠的张量沿着第1维度排列。torch.Size([2, 3, 2, 2])
第2维:新维度插入到第三个位置,堆叠的张量沿着第2维度排列。torch.Size([2, 2, 3, 2])
"""

print(corr2d_multi_in_out(X, K))
"""
tensor([[[ 56.,  72.],
         [104., 120.]],

        [[ 76., 100.],
         [148., 172.]],

        [[ 96., 128.],
         [192., 224.]]])
"""

# 1 * 1 卷积核
#可以将卷积层看作在每个像素位置应用的全连接层
#以c_i个输入值转换为c_o个输出值
def corr2d_multi_in_out_1x1(X, K):
    c_i, h, w = X.shape #获取输入张量 X 的通道数、高度和宽度。
    c_o = K.shape[0] #获取卷积核 K 的输出通道数。
    X = X.reshape((c_i, h * w)) # 3 * 9
    K = K.reshape((c_o, c_i)) # 2 * 3

    Y = torch.matmul(K, X)
    return Y.reshape((c_o, h, w)) # 2 * 3 * 3

X = torch.normal(0, 1, (3, 3, 3))

#表示具有2个输出通道,每个通道对应3个输入通道 1x1的滤波器
K = torch.normal(0, 1, (2, 3, 1, 1))
Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)
assert float(torch.abs(Y1 - Y2).sum()) < 1e-6
相关推荐
weixin_429630265 小时前
3.49 HVLF:一种跨场景的整体视觉定位框架
深度学习·机器学习·计算机视觉
广州灵眸科技有限公司5 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) Easy-Eai编译环境准备与更新
服务器·前端·人工智能·python·深度学习
深度学习lover5 小时前
<数据集>yolo樱桃识别<目标检测>
人工智能·深度学习·yolo·目标检测·计算机视觉·数据集·樱桃识别
科研小刘带你玩学术6 小时前
【科研快报】Nature子刊重磅|HESpotEx:深度学习首次实现从病理图像直接预测基因表达
深度学习·神经网络·科学计算·插值算法·工程仿真·热环境建模·稀疏网格
钓了猫的鱼儿11 小时前
基于深度学习+AI的蚕病害目标检测与预警系统(Python源码+数据集+UI可视化界面+YOLOv11训练结果)
人工智能·深度学习·目标检测
程序猿追11 小时前
画个饼,给数据点颜色看看——在 HarmonyOS 模拟器上手搓一个饼图/环形图组件
深度学习·算法·harmonyos
X54先生(人文科技)12 小时前
《元创力》纪实录·卷宗2.1边界测绘:一枚信标的沉没与一张舆图的诞生
人工智能·深度学习·开源·ai写作
王_teacher12 小时前
ResNet-18网络模型+原理解析+Pytorch实现+手写模型
人工智能·cnn·卷积神经网络
大模型最新论文速读13 小时前
UnityMAS-O:专用于多 agent 工作流训练的 RL 框架
论文阅读·人工智能·深度学习·机器学习·自然语言处理
love530love13 小时前
根治 PyTorch CUDA `pynvml` 弃用警告:直接修改 `torch/cuda/__init__.py` 的实践记录
人工智能·pytorch·windows·python·深度学习·机器学习·pynvml