一 输入通道

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相等。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信