欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-06 17:31:00
...

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

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 卷积层通常用来调整网络层之间的通道数,并控制模型复杂度。

手动@小宋是呢

相关标签: pytorch