多个输入通道
- 参数图像可能有RGB三个通道
- 转换为灰度会丢失信息

- 每一个通道都有一个卷积核,结果是所有通道卷积结果的和

- 用公式表达如下:这里 c i c_i ci就是输入的通道数,卷积核的个数应该和输入的通道数一样,不管我们的输入有多少个通道我们的输出都是一个通道

多个输出通道
- 无论有多少个输入通道,到目前为止我们只用到单输出通道
- 我们可以有多个三维卷积核,每个核生成一个输出通道。比如:在RGB图片中,我们对每一个输出的通道我们都有一个三维的卷积核,也就是三输出通道
- 公式表达如下,这里的 c o c_o co就是输出通道的个数

多输入和输出通道
- 每个通道可以识别特定的模式。也就是可以认为每一个输出通道可以识别一个特定的模式。

- 输入通道核识别并组合输入中的模式。上面通过多输出通道可以识别出不同的模式,然后我们将多个输出给下一个层,然后下一个层将这些模式组合起来。
1 * 1的卷积层
- 1 * 1的卷积层就是融合通道的。也就是说将不同输入通道的对应位置的数据融合到一起。

二维卷积层

总结
- 下面第一点,输入通道不是一个超参数,它是前一个的超参数

代码演示
import torch
from torch import nn
from d2l import torch as d2l
def corr2d(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()
return Y
def corr2d_multi_in(X, K):
return sum(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.]])
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
torch.Size([3, 2, 2, 2])
corr2d_multi_in_out(X, K)
tensor([[[ 56., 72.],
[104., 120.]],
[[ 76., 100.],
[148., 172.]],
[[ 96., 128.],
[192., 224.]]])
def corr2d_muti_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))
X = torch.normal(0, 1, (3, 3, 3))
K = torch.normal(0, 1, (2, 3, 1, 1))
Y1 = corr2d_muti_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)
assert float(torch.abs(Y1 -Y2).sum()) < 1e-6
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)