当前位置:   article > 正文

多输入通道和多输出通道_多输入多输出神经网络

多输入多输出神经网络

【目录】

1. 什么是多输入通道和多输出通道

卷积神经网络(Convolutional Neural Network,CNN)中,多输入通道和多输出通道是两个非常重要的概念。在介绍多输入通道和多输出通道之前,我们先来回顾一下卷积神经网络中的卷积操作。

卷积神经网络中的卷积操作是指,将输入张量与卷积核进行卷积操作,得到输出张量的过程。其中,输入张量和卷积核都是多维数组,通常都是三维数组。在卷积操作中,输入张量的每个二维数组都称为一个输入通道,卷积核的每个二维数组都称为一个输出通道。

多输入通道和多输出通道则是指,输入张量和输出张量分别包含多个输入通道和输出通道的情况。具体来说,多输入通道指的是输入张量包含多个二维数组,即包含多个输入通道;多输出通道指的是输出张量包含多个二维数组,即包含多个输出通道。

2. 多输入通道和多输出通道的实现

在卷积神经网络中,多输入通道和多输出通道的实现方式主要有两种:多输入通道和多输出通道的卷积操作、多输入通道和多输出通道的全连接操作。下面我们将分别介绍这两种实现方式。

2.1 多输入通道和多输出通道的卷积操作

在多输入通道和多输出通道的卷积操作中,输入张量和卷积核的维度分别为 n i × c i × h i × w i n_i \times c_i \times h_i \times w_i ni×ci×hi×wi n o × c i × k h × k w × c o n_o \times c_i \times k_h \times k_w \times c_o no×ci×kh×kw×co,其中 n i n_i ni n o n_o no 分别是输入张量和输出张量的样本数, c i c_i ci 是输入张量的通道数, h i h_i hi w i w_i wi 分别是输入张量的高度和宽度, k h k_h kh k w k_w kw 分别是卷积核的高度和宽度, c o c_o co 是输出张量的通道数。具体来说,假设输入张量为 X X X,卷积核为 W W W,输出张量为 Y Y Y,则多输入通道和多输出通道的卷积操作可以表示为:

y n , o , h , w = ∑ i = 1 c i ∑ j = 1 k h ∑ k = 1 k w x n , i , h + j − 1 , w + k − 1 w i , j , k , o y_{n,o,h,w} = \sum_{i=1}^{c_i} \sum_{j=1}^{k_h} \sum_{k=1}^{k_w} x_{n,i,h+j-1,w+k-1} w_{i,j,k,o} yn,o,h,w=i=1cij=1khk=1kwxn,i,h+j1,w+k1wi,j,k,o

其中, y n , o , h , w y_{n,o,h,w} yn,o,h,w 表示输出张量 Y Y Y 的第 n n n 个样本、第 o o o 个输出通道、第 h h h 行、第 w w w 列的值; x n , i , h + j − 1 , w + k − 1 x_{n,i,h+j-1,w+k-1} xn,i,h+j1,w+k1 表示输入张量 X X X 的第 n n n 个样本、第 i i i 个输入通道、第 h + j − 1 h+j-1 h+j1 行、第 w + k − 1 w+k-1 w+k1 列的值; w i , j , k , o w_{i,j,k,o} wi,j,k,o 表示卷积核 W W W 的第 i i i 个输入通道、第 j j j 行、第 k k k 列、第 o o o 个输出通道的值。

2.2 多输入通道和多输出通道的全连接操作

在多输入通道和多输出通道的全连接操作中,输入张量和输出张量的维度分别为 n i × c i × h i × w i n_i \times c_i \times h_i \times w_i ni×ci×hi×wi n o × c o n_o \times c_o no×co,其中 n i n_i ni n o n_o no 分别是输入张量和输出张量的样本数, c i c_i ci 是输入张量的通道数, h i h_i hi w i w_i wi 分别是输入张量的高度和宽度, c o c_o co 是输出张量的通道数。具体来说,假设输入张量为 X X X,全连接层的权重为 W W W,输出张量为 Y Y Y,则多输入通道和多输出通道的全连接操作可以表示为:

y n , o = ∑ i = 1 c i ∑ j = 1 h i ∑ k = 1 w i x n , i , j , k w i , j , k , o y_{n,o} = \sum_{i=1}^{c_i} \sum_{j=1}^{h_i} \sum_{k=1}^{w_i} x_{n,i,j,k} w_{i,j,k,o} yn,o=i=1cij=1hik=1wixn,i,j,kwi,j,k,o

其中, y n , o y_{n,o} yn,o 表示输出张量 Y Y Y 的第 n n n 个样本、第 o o o 个输出通道的值; x n , i , j , k x_{n,i,j,k} xn,i,j,k 表示输入张量 X X X 的第 n n n 个样本、第 i i i 个输入通道、第 j j j 行、第 k k k 列的值; w i , j , k , o w_{i,j,k,o} wi,j,k,o 表示全连接层的权重,表示输入通道为 i i i、高度为 j j j、宽度为 k k k、输出通道为 o o o 的权重值。

3. 多输入通道和多输出通道的实例

下面我们使用 PyTorch 来实现一个多输入通道和多输出通道的卷积神经网络,并对其进行训练和测试。具体来说,我们将使用 CIFAR-10 数据集,该数据集包含 10 类物体的彩色图像。每张图像的大小为 32 × 32 32 \times 32 32×32,共有 3 个通道(即 RGB 三个通道)。我们将使用一个包含多个卷积层和全连接层的卷积神经网络来对 CIFAR-10 数据集进行分类。

3.1 导入必要的库和数据集

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms

# 定义数据增强的操作
transform_train = transforms.Compose([
    transforms.RandomCrop(32, padding=4),  # 随机裁剪
    transforms.RandomHorizontalFlip(),  # 随机水平翻转
    transforms.ToTensor(),  # 转为张量
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 归一化
])
transform_test = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# 加载训练集和测试集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)
testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False, num_workers=2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3.2 定义卷积神经网络

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 第一层卷积层
        self.conv1 = nn.Conv2d(3, 6, 5)
        # 第二层卷积层
        self.conv2 = nn.Conv2d(6, 16, 5)
        # 第三层全连接层
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        # 第四层全连接层
        self.fc2 = nn.Linear(120, 84)
        # 第五层全连接层
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # 第一层卷积层
        x = self.conv1(x)
        x = nn.functional.relu(x)
        x = nn.functional.max_pool2d(x, 2)
        # 第二层卷积层
        x = self.conv2(x)
        x = nn.functional.relu(x)
        x = nn.functional.max_pool2d(x, 2)
        # 第三层全连接层
        x = x.view(-1, 16 * 5 * 5)
        x = self.fc1(x)
        x = nn.functional.relu(x)
        # 第四层全连接层
        x = self.fc2(x)
        x = nn.functional.relu(x)
        # 第五层全连接层
        x = self.fc3(x)
        return x

net = Net()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

3.3 训练卷积神经网络

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data

        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 100 == 99:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

3.4 测试卷积神经网络

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4 结构图和计算

Input
Convolutional Layer
Output
Input 1
Convolutional Layer 1
Input 2
Output 1

其中,A表示单通道输入,A1和A2表示多通道输入;B表示单通道卷积层,B1表示多通道卷积层;C表示单通道输出,C1表示多通道输出。

对于多输入通道和多输出通道的卷积神经网络,其计算过程与单通道的卷积神经网络类似,只是在输入和输出的张量维度上会有所不同。

假设输入张量为 X ∈ R C i n × H i n × W i n X\in R^{C_{in}\times H_{in}\times W_{in}} XRCin×Hin×Win,其中 C i n C_{in} Cin表示输入通道数, H i n H_{in} Hin W i n W_{in} Win分别表示输入张量的高和宽;卷积核张量为 W ∈ R C o u t × C i n × K H × K W W\in R^{C_{out}\times C_{in}\times K_H\times K_W} WRCout×Cin×KH×KW,其中 C o u t C_{out} Cout表示输出通道数, K H K_H KH K W K_W KW分别表示卷积核的高和宽;输出张量为 Y ∈ R C o u t × H o u t × W o u t Y\in R^{C_{out}\times H_{out}\times W_{out}} YRCout×Hout×Wout,其中 H o u t H_{out} Hout W o u t W_{out} Wout分别表示输出张量的高和宽。

对于单通道输入和单通道输出的情况,卷积运算的计算过程如下:

Y k , i , j = ∑ c = 1 C i n ∑ p = 1 K H ∑ q = 1 K W W k , c , p , q X c , ( i − 1 ) × s + p , ( j − 1 ) × s + q + b k Y_{k,i,j}=\sum_{c=1}^{C_{in}}\sum_{p=1}^{K_H}\sum_{q=1}^{K_W}W_{k,c,p,q}X_{c,(i-1)\times s+p,(j-1)\times s+q}+b_k Yk,i,j=c=1Cinp=1KHq=1KWWk,c,p,qXc,(i1)×s+p,(j1)×s+q+bk

其中, Y k , i , j Y_{k,i,j} Yk,i,j表示输出张量 Y Y Y中第 k k k个通道、第 i i i行、第 j j j列的元素; W k , c , p , q W_{k,c,p,q} Wk,c,p,q表示卷积核张量 W W W中第 k k k个通道、第 c c c个通道、第 p p p行、第 q q q列的元素; X c , i , j X_{c,i,j} Xc,i,j表示输入张量 X X X中第 c c c个通道、第 i i i行、第 j j j列的元素; s s s表示步幅; b k b_k bk表示偏置项。

对于多输入通道和多输出通道的情况,卷积运算的计算过程如下:

Y k , i , j = ∑ c = 1 C i n ∑ p = 1 K H ∑ q = 1 K W ∑ m = 1 M W k , c , p , q , m X c , ( i − 1 ) × s + p , ( j − 1 ) × s + q , m + b k Y_{k,i,j}=\sum_{c=1}^{C_{in}}\sum_{p=1}^{K_H}\sum_{q=1}^{K_W}\sum_{m=1}^{M}W_{k,c,p,q,m}X_{c,(i-1)\times s+p,(j-1)\times s+q,m}+b_k Yk,i,j=c=1Cinp=1KHq=1KWm=1MWk,c,p,q,mXc,(i1)×s+p,(j1)×s+q,m+bk

其中, M M M表示输入张量 X X X的通道数; Y k , i , j Y_{k,i,j} Yk,i,j W k , c , p , q , m W_{k,c,p,q,m} Wk,c,p,q,m X c , i , j , m X_{c,i,j,m} Xc,i,j,m s s s b k b_k bk的含义同单通道的情况。

5. 总结

本文介绍了卷积神经网络中的多输入通道和多输出通道的概念和实现方式,并使用 PyTorch 实现了一个包含多个卷积层和全连接层的卷积神经网络,对 CIFAR-10 数据集进行了分类

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/303317
推荐阅读
相关标签
  

闽ICP备14008679号