一 输入通道
1.多个输入通道
①彩色图像有RGB(红绿蓝组成)三个通道
②转换为灰度会丢失信息 灰度一个通道
2.多个通道输出的结果:只有一个输出
每个通道都有对应的卷积核,输出的结果是所有通道卷积核的和
【演示】二个通道的输出结果
输出结果某个值的计算:
3.输入多通道
①输入X:
②卷积核W:
③输出Y:
单通道。不管输入的是多个通道,每个通道都有对应的卷积核,输出通道的结果是所有卷积核的和。
【比如】:下图的输入通道是2,所以对应2个卷积核(一组),输出结果是单通道。
那么,如何让结果输出多个通道呢?下图是2个卷积核是一组,再加上一组(2个)卷积核。输出就是两个了。每组卷积核提取的特征不一样。结果也就不一样
①无论输入通道有多少个,目前只用到单通道输出
②怎样让输出有多个通道呢?可以有多个三维卷积核(多个组),每个核生成一个输出通道
Ci:输入通道的层数
Co:输出通道的层数
为了提取不同的特征,两者没有相关性。
我的猜测是,比如有一个图片,加上一个滤镜(一组卷积核),是朦胧的。加上另一个滤镜(一组卷积核)是黑白的。所以输出两个图片:朦胧。黑白。
4.多输出的作用:
①每个输出通道可以识别特定的模式
输入一个猫:
输出的6个通道模式:
②把输出的6个通道传入,此刻的输入通道识别并组合输入中的各个模式【组合模式识别】
5: 1*1的卷积层(受欢迎的卷积核)
因为只识别一个像素点,不去看像素周围的像素是多少。所以不识别空间模式。
通过一组卷积核,把输入的三个通道的信息对应像素进行加权和,得到一个输出通道。所以是融合通道。
【等价于】把输入的三个通道拉成一个向量的全连接层,不考虑空间信息
6. 二维卷积层:
【总结】
①输出通道数是卷积层的超参数
②每个输入通道有独立的二维卷积核。所有通道结果相加得到一个输出的通道的结果
③每个输出通道有独立的三维卷积核。
【代码实现】
1.多输入通道: 输入多个通道验证卷积核1*1等价于全连接层:
import torch
from d2l import torch as d2l
# 多输入通道
def corr2d_multi_in(X, K):
'''先遍历X和K的第0个维度,再把他们加在一起'''
'''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)
输出结果:
'''
tensor([[ 56., 72.],
[104., 120.]])
'''
2.多输出通道
def corr2d_multi_in_out(X, K):
'''
迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
最后将所有结果都叠加在一起
torch.stack()沿着一个新维度对输入张量连接,序列中的所有张量一个形状
'''
return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
3.构造几组卷积核: 3组卷积核,有三个输出
K = torch.stack((K, K + 1, K + 2), 0)
print(K)
print(K.shape) # torch.Size([3, 2, 2, 2])
【输出K】
tensor([[[[0., 1.],
[2., 3.]],
[[1., 2.],
[3., 4.]]],
[[[1., 2.],
[3., 4.]],
[[2., 3.],
[4., 5.]]],
[[[2., 3.],
[4., 5.]],
[[3., 4.],
[5., 6.]]]])
torch.Size([3, 2, 2, 2])
4.验证:实现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.matmul(K, X) # 矩阵乘法
return Y.reshape((c_o, h, w))
【验证 卷积的结果 和 全连接层 相减为0 说明相等】
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)
print(float(torch.abs(Y1 - Y2).sum()) < 1e-6) # True =0相等。
文章出处登录后可见!