卷积层里的多输入和多输出的通道
多输入通道
灰度图只有一个通道
多通道输入的计算
c–>channel h–>high w–>width
多输出通道
多输出通道:每一个输出通道在识别不同的模式,即特征识别
多输入通道:将多个识别出来的模式放到下一层进行组合输入,得到一个组合的模式识别
对几个通道进行加权和得到新的输出,多个卷积核分别与输入进行加权和得到多个输出
不识别空间信息是因为1×1卷积层只看了对应的像素点,没有看周围的信息
co是输出的通道数
卷积层的计算量很大,但存储代价很小
QA:
- 网络越深,padding越大,不会影响精度,但是会影响模型性能
- 不同通道的卷积核是不一样的,不同通道的卷积核大小是一样的
- 核的参数是学习出来的
- 卷积层之间是不共享参数的,因为我们希望每一个通道都去学习对应的有效信息
代码
import torch
from torch import nn
from d2l import torch as d2l
def corr2d(X,K):
"""二维互相关,输入矩阵X, 核矩阵K"""
h,w = K.shape
Y = torch.zeros((X.shape[0] - h + 1,X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i,j] = (X[i:i+h,j:j+w]*K).sum()
print(Y)
return Y
def corr2d_multi_in(X,K):
# zip对最外层的输入通道做遍历
return sum(d2l.corr2d(x,k) for x,k in zip(X,K))
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])
corr2d_multi_in(X, K)
计算多个通道的输出的互相关函数
def corr2d_multi_in_out(X,K):
# 把计算结果叠起来
return torch.stack([corr2d_multi_in(X,k) for k in K],0)
K = torch.stack((K,K+1,K+2),0)
K.shape
corr2d_multi_in_out(X,K)
1×1卷积
def corr2d_multi_in_out_1x1(X,K):
# 输入通道数和长宽
c_i, h, w = X.shape
# 输出通道数
c_o = K.shape[0]
# X变形为输入通道数,并将二维张量拉成一维
X = X.reshape((c_i, h * w))
K = K.reshape((c_o, c_i))
# 全连接层中的矩阵乘法
Y = torch.matmul(K, X)
return Y.reshape((c_o, h, w))
X = torch.normal(0, 1, (3, 3, 3))
K = torch.normal(0, 1, (2, 3, 1, 1))
Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)
assert float(torch.abs(Y1 - Y2).sum()) < 1e-6