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

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

1.多输入通道

卷积核的通道数要和输入通道数一样才能进行互相关运算。逐通道计算完结果再相加即得到输出。

图5.4中阴影部分为第一个输出元素及其计算所使用的输入和核数组元素: (1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56 。

1ecd1b2606ed46e9956a89f231c9802c.png多个通道的互相关运算代码实现:

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月前
|
机器学习/深度学习 算法 PyTorch
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
227 1
|
1月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解
【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解
28 1
|
2月前
|
机器学习/深度学习 编解码 PyTorch
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
|
1月前
|
机器学习/深度学习 PyTorch 测试技术
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)
【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)
58 0
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【PyTorch实战演练】使用Cifar10数据集训练LeNet5网络并实现图像分类(附代码)
【PyTorch实战演练】使用Cifar10数据集训练LeNet5网络并实现图像分类(附代码)
60 0
|
9天前
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch小技巧:使用Hook可视化网络层激活(各层输出)
这篇文章将演示如何可视化PyTorch激活层。可视化激活,即模型内各层的输出,对于理解深度神经网络如何处理视觉信息至关重要,这有助于诊断模型行为并激发改进。
11 1
|
1月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
55 2
|
1月前
|
机器学习/深度学习 自然语言处理 PyTorch
【PyTorch实战演练】基于全连接网络构建RNN并生成人名
【PyTorch实战演练】基于全连接网络构建RNN并生成人名
23 0
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
卷积神经元网络中常用卷积核理解及基于Pytorch的实例应用(附完整代码)
卷积神经元网络中常用卷积核理解及基于Pytorch的实例应用(附完整代码)
20 0