# 多输入多输出通道
def corr2d_multi_in_out(X, K): # X 是一个包含多个输入通道的输入张量(输入特征图的集合)。K 是一个包含多个输出通道的卷积核的张量(卷积核的集合)。
# 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
# 最后将所有结果都叠加在一起
return torch.stack([corr2d_multi_in(X, k) for k in K], 0) # corr2d_multi_in(X, k) 函数,执行多通道输入的互相关运算。最后,torch.stack(..., 0) 将所有通道的互相关运算结果在新的维度0上叠加在一起,得到最终的输出结果。
K = torch.stack((K, K + 1, K + 2), 0)
/*最后输出的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.]]]])
*/
# 池化层
import torch
from torch import nn
from d2l import torch as d2l
def pool2d(X, pool_size, mode='max'): # X 是输入的二维张量,表示需要进行池化操作的输入数据。pool_size 是一个包含两个元素的元组,表示池化窗口的大小,即在高度和宽度方向上的窗口尺寸。mode 是池化的模式,可以是 'max'(最大池化)或 'avg'(平均池化),默认为最大池化模式。
p_h, p_w = pool_size # 将池化窗口的高度和宽度分别赋值给 p_h 和 p_w 变量。
Y = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w + 1)) # 这行代码创建一个用于存储池化结果的零张量 Y,其形状根据输入 X 和池化窗口的大小计算而来。
for i in range(Y.shape[0]): # 接下来的两个嵌套循环遍历 Y 的每个元素,以计算池化后的值
for j in range(Y.shape[1]):
if mode == 'max':
Y[i, j] = X[i: i + p_h, j: j + p_w].max()
elif mode == 'avg':
Y[i, j] = X[i: i + p_h, j: j + p_w].mean()
return Y
当有多个输入通道时,经过池化层也会有多个输出结果