赞
踩
当输入包含多个通道时,需要构造一个输入通道与之相等的卷积核,以便进行数据互相关计算。
例如李沐老师中的例子:
输入有两个通道(前后),故卷积核也应有两个输入通道。
计算式子如下:
(11 + 22 + 43 + 54) + (00 + 11 + 32 + 43) = 56
import torch
from d2l import torch as d2l
def corr2d_multi_in(X, K):
# 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起
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]] ]) print(X.shape) print(K.shape) print(corr2d_multi_in(X, K))
输出结果:
torch.Size([2, 3, 3])
torch.Size([2, 2, 2])
tensor([[ 56., 72.],
[104., 120.]])
多个输入通道并不会影响输出张量个数。
zip():
zip() 是将不同张量中的数据,对应位置拼接起来形成元组。
例如:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z)
print xyz
'''结果是:'''
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
在本例子中呢,根据X,K的shape可知:
第一个元组:
tensor([[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]])
tensor([[0., 1.],
[2., 3.]])
第二个元组:
tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
tensor([[1., 2.],
[3., 4.]])
多个输出通道,也就意味着有多个卷积核的存在。
def corr2d_multi_in_out(X, K):
# 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
# 最后将所有结果都叠加在一起
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.stack(),实现将多个张量堆叠起来,0表示从0维的位置插入。
K = torch.stack((K, K + 1, K + 2), 0) 如何理解这句代码呢?
K 一开始我们就定义了:
K = torch.tensor([[[0.0, 1.0],
[2.0, 3.0]],
[[1.0, 2.0],
[3.0, 4.0]]
])
那么K+1 也就是在K的基础上,将所有元素进行加一操作。
通过stack将K,K+1,K+2 三个不同的张量(三个不同的卷积核)堆叠在一起,形成了三个输出通道。与X进行互相关操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。