【pytorch实现】卷积神经网络(3)

1.多输入通道
卷积核的通道数要和输入通道数一样才能进行互相关运算。逐通道计算完结果再相加即得到输出。
图5.4中阴影部分为第一个输出元素及其计算所使用的输入和核数组元素: (1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56 。
在这里插入图片描述
多个通道的互相关运算代码实现:

from d2l import torch as d2l
import torch

def corr2d_multi_in(X, K):
    # First, traverse along the 0th dimension (channel dimension) of `X` and
    # `K`. Then, add them together
    return sum([d2l.corr2d(x, k) for x, k in zip(X, K)])

首先沿着X和K的第0维(通道维)遍历。然后使用*将结果列表变成add_n函数的位置参数(positional argument)来进行相加。
验证输出:

X = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],
                  [[1, 2, 3], [4, 5, 6], [7, 8, 9]]], dtype=torch.float32)
K = torch.tensor([[[0, 1], [2, 3]],
                  [[1, 2], [3, 4]]], dtype=torch.float32)

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

2.多输出通道
当输入通道有多个时,因为对各个通道的结果做了累加,所以不论输入通道数是多少,输出通道数总是为1。这个时候可以用多个核去做互相关运算,输出即为多通道的结果,用几个核就有几个通道。
例子:
对K的第0维遍历,每次同输入X做互相关计算。所有结果使用stack函数合并在一起

def corr2d_multi_in_out(X, K):
    # Traverse along the 0th dimension of `K`, and each time, perform
    # cross-correlation operations with input `X`. All of the results are
    # merged together using the stack function
    return torch.stack([corr2d_multi_in(X, k) for k in K], dim=0)

我们将核数组K同K+1(K中每个元素加一)和K+2连结在一起来构造一个输出通道数为3的卷积核。

K = torch.stack([K, K + 1, K + 2], dim=0)
K.shape

输出:

torch.Size([3, 2, 2, 2])

下面对输入数组X与核数组K做互相关运算。

corr2d_multi_in_out(X, K)

结果:

tensor([[[ 56.,  72.],
         [104., 120.]],

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

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

3.1×1 卷积层
1×1 卷积的主要计算发生在通道维上。图5.5展示了使用输入通道数为3、输出通道数为2的 1×1 卷积核的互相关计算。值得注意的是,输入和输出具有相同的高和宽。输出中的每个元素来自输入中在高和宽上相同位置的元素在不同通道之间的按权重累加。假设我们将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么 1×1 卷积层的作用与全连接层等价。
下面使用全连接层中的矩阵乘法来实现 1×1 卷积。这里需要在矩阵乘法运算前后对数据形状做一些调整。
代码实现:

def corr2d_multi_in_out_1x1(X, K):
    c_i, h, w = X.shape
    c_o = K.shape[0]
    X = X.reshape((c_i, h * w))
    K = K.reshape((c_o, c_i))
    Y = torch.mm(K, X)  # Matrix multiplication in the fully connected layer
    return Y.reshape((c_o, h, w))

验证结果:

X = torch.randn(size=(3, 3, 3))
K = torch.randn(size=(2, 3, 1, 1))

Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)

(Y1 - Y2).norm().item() < 1e-6
True

经验证,做 1×1 卷积时,以上函数与之前实现的互相关运算函数corr2d_multi_in_out等价。
总结:
使用多通道可以拓展卷积层的模型参数。
假设将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么 1×1 卷积层的作用与全连接层等价。
1×1 卷积层通常用来调整网络层之间的通道数,并控制模型复杂度。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醪糟小丸子

小小帮助,不足挂齿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值