在多输入通道和多输出通道的卷积操作中,输入张量和卷积核的维度分别为
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=1∑cij=1∑khk=1∑kwxn,i,h+j−1,w+k−1wi,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+j−1,w+k−1 表示输入张量
X
X
X 的第
n
n
n 个样本、第
i
i
i 个输入通道、第
h
+
j
−
1
h+j-1
h+j−1 行、第
w
+
k
−
1
w+k-1
w+k−1 列的值;
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=1∑cij=1∑hik=1∑wixn,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 的权重值。
classNet(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)defforward(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()
3.3 训练卷积神经网络
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)for epoch inrange(10):
running_loss =0.0for i, data inenumerate(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
3.4 测试卷积神经网络
correct =0
total =0with 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))
假设输入张量为
X
∈
R
C
i
n
×
H
i
n
×
W
i
n
X\in R^{C_{in}\times H_{in}\times W_{in}}
X∈RCin×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}
W∈RCout×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}}
Y∈RCout×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=1∑Cinp=1∑KHq=1∑KWWk,c,p,qXc,(i−1)×s+p,(j−1)×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=1∑Cinp=1∑KHq=1∑KWm=1∑MWk,c,p,q,mXc,(i−1)×s+p,(j−1)×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的含义同单通道的情况。