赞
踩
1、多个输入通道
彩色图像可能有RGB三个通道,转化为灰度会丢失信息。
每个通道都有一个卷积核,结果是所有通道卷积结果的和。
用公式表示:
2、多个输出通道
无论有多少个输入通道,到目前为止我们只用到单输出通道;我们可以有多个三维卷积核,每个核生成一个输出通道。
每个输出通道可以识别特定模式;输入通道核识别并组合输入中的模式。
3、1x1的卷积层
kh=kw=1是一个受欢迎的选择,他不识别空间模式,只是融合通道;
1x1的卷积层也可以说是全连接层;
-
- import torch
- from torch import nn
- import sys
- sys.path.append("..")
- import d2lzh_pytorch as d2l
- """多输入通道
- 实现含多个输入通道的互相关运算。我们只需要对每个通道做互相关运算,然后通过add_n函数来进行累加
- """
- def corr2d_multi_in(X, K):
- # 沿着X和K的第0维(通道维)分别计算再相加
- res = d2l.corr2d(X[0, :, :], K[0, :, :])
- for i in range(1, X.shape[0]):
- res += d2l.corr2d(X[i, :, :], K[i, :, :])
- return res
-
- #构造数组x和数组k来验证互相关运算的输出
- X = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],[[1, 2, 3], [4, 5, 6], [7, 8, 9]]])
- K = torch.tensor([[[0, 1], [2, 3]], [[1, 2], [3, 4]]])
- print(corr2d_multi_in(X, K))
-
- """多输出通道
- 实现一个互相关运算函数来计算多个通道的输出
- """
- def corr2d_multi_in_out(X, K):
- # 对K的第0维遍历,每次同输⼊X做互相关计算。所有结果使⽤stack函数合并在⼀起
- return torch.stack([corr2d_multi_in(X, k) for k in K])
- K = torch.stack([K, K + 1, K + 2]) #构成一个通道数为三的卷积核
- print(K.shape)
- #此时在输出有三个通道
- print(corr2d_multi_in_out(X, K))
-
- """1x1卷积层
- 窗口大小为1x1的多通道卷积层,输⼊和输出具有相同的⾼和宽。输出中的每个元素来⾃输⼊中在⾼和宽上相同位置的元素在不同通道之间的按权᯿累加。
- 假设我们将通道维当作特征维,将⾼和宽维度上的元素当成数据样本,那么 卷积层的作⽤与全连接层等价。
- """
- #使用全连接层中的举矩阵乘法来实现1x1卷积。
- def corr2d_multi_in_out_1x1(X, K):
- c_i, h, w = X.shape
- c_o = K.shape[0]
- X = X.view(c_i, h * w)
- K = K.view(c_o, c_i)
- Y = torch.mm(K, X) # 全连接层的矩阵乘法
- return Y.view(c_o, h, w)
-
- X = torch.rand(3, 3, 3)
- K = torch.rand(2, 3, 1, 1)
- Y1 = corr2d_multi_in_out_1x1(X, K)
- Y2 = corr2d_multi_in_out(X, K)
- print((Y1 - Y2).norm().item() < 1e-6)
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。