4D 张量的乘法通常指的是卷积操作(convolution),在深度学习中被广泛应用于图像和语音处理等领域。下面以卷积操作为例,说明输入和输出张量的维度变化及乘法公式。
假设我们有一个形状为 ( N , C i n , H i n , W i n ) (N, C_{in}, H_{in}, W_{in}) (N,Cin,Hin,Win) 的输入张量 X X X,和一个形状为 ( C o u t , C i n , k h , k w ) (C_{out}, C_{in}, k_h, k_w) (Cout,Cin,kh,kw) 的卷积核张量 W W W,其中:
- N N N 表示 batch size,即批处理的样本数量;
- C i n C_{in} Cin 表示输入张量的通道数,即每个样本的特征图数量;
- H i n H_{in} Hin 表示输入张量的高度,即每个特征图的高度;
- W i n W_{in} Win 表示输入张量的宽度,即每个特征图的宽度;
- C o u t C_{out} Cout 表示输出张量的通道数,即卷积核的个数,也是输出张量的特征图数量;
- k h k_h kh 表示卷积核的高度;
- k w k_w kw 表示卷积核的宽度。
卷积操作的公式如下:
其中
n
∈
[
0
,
N
)
n \in [0, N)
n∈[0,N),
c
o
u
t
∈
[
0
,
C
o
u
t
)
c_{out} \in [0, C_{out})
cout∈[0,Cout),
h
o
u
t
∈
[
0
,
H
o
u
t
)
h_{out} \in [0, H_{out})
hout∈[0,Hout),
w
o
u
t
∈
[
0
,
W
o
u
t
)
w_{out} \in [0, W_{out})
wout∈[0,Wout),
H
o
u
t
=
H
i
n
−
K
h
+
1
H_{out} = H_{in} - K_h + 1
Hout=Hin−Kh+1,
W
o
u
t
=
W
i
n
−
K
w
+
1
W_{out} = W_{in} - K_w + 1
Wout=Win−Kw+1。
公式的意义是,对于输出张量的每个元素 ( n , c o u t , h o u t , w o u t ) (n, c_{out}, h_{out}, w_{out}) (n,cout,hout,wout),将卷积核 W W W 按照 c i n c_{in} cin 维度与输入张量 X X X 的对应特征图进行卷积运算,得到一个 k h × k w k_h \times k_w kh×kw 大小的卷积结果,然后将这个卷积结果与其他特征图的卷积结果相加,最终得到输出张量 Y Y Y 的一个元素。
卷积操作后,输出张量的形状为 ( N , C o u t , H o u t , W o u t ) (N, C_{out}, H_{out}, W_{out}) (N,Cout,Hout,Wout),其中:
-
N N N 保持不变;
-
C o u t C_{out} Cout 等于卷积核的个数,即输出的特征图数量;
-
H o u t H_{out} Hout 等于输入特征图高度
-
H i n H_{in} Hin 减去卷积核高度 k h k_h kh 再加 1,即 H o u t = H i n − k h + 1 H_{out} = H_{in} - k_h + 1 Hout=Hin−kh+1;
-
W o u t W_{out} Wout 等于输入特征图宽度 W i n W_{in} Win 减去卷积核宽度 k w k_w kw 再加 1,即 W o u t = W i n − k w + 1 W_{out} = W_{in} - k_w + 1 Wout=Win−kw+1。
举个例子,假设有一个形状为 ( 1 , 3 , 5 , 5 ) (1, 3, 5, 5) (1,3,5,5) 的输入张量 X X X,即 batch size 为 1,输入通道数为 3,每个特征图的高度和宽度均为 5。同时,我们有一个形状为 ( 2 , 3 , 3 , 3 ) (2, 3, 3, 3) (2,3,3,3) 的卷积核张量 W W W,即输出通道数为 2,输入通道数为 3,卷积核的高度和宽度均为 3。
我们对
X
X
X 进行卷积运算,得到形状为
(
1
,
2
,
3
,
3
)
(1, 2, 3, 3)
(1,2,3,3) 的输出张量
Y
Y
Y。具体地,我们可以用 PyTorch 中的 torch.nn.functional.conv2d
函数来实现:
import torch.nn.functional as F
x = torch.randn(1, 3, 5, 5) # 输入张量
w = torch.randn(2, 3, 3, 3) # 卷积核张量
y = F.conv2d(x, w) # 卷积运算,得到输出张量
在此示例中,输入张量
X
X
X 的形状为 (1, 3, 5, 5)
,卷积核张量
W
W
W 的形状为 (2, 3, 3, 3)
,则根据卷积公式,输出张量
Y
Y
Y 的形状为 (1, 2, 3, 3)
。
注意,在实际应用中,卷积操作通常会涉及到更多的参数和技巧,例如 padding、stride、dilation 等,以及不同的卷积层的组合和堆叠。此处只是介绍了基本的卷积操作和输入输出张量的维度变化。
5D Tensor 通常代表着包含多个样本的多通道 3D 图像或视频,例如形状为 ( B , C , D , H , W ) (B, C, D, H, W) (B,C,D,H,W) 的张量,其中 B B B 表示批量大小, C C C 表示通道数, D D D 表示深度, H H H 表示高度, W W W 表示宽度。对于 5D Tensor 的计算,可以类比于 4D Tensor,只是需要在其基础上再加一个维度。
例如,对于形状为 ( B , C i n , D i n , H i n , W i n ) (B, C_{in}, D_{in}, H_{in}, W_{in}) (B,Cin,Din,Hin,Win) 的输入张量 X X X 和形状为 ( C o u t , C i n , k d , k h , k w ) (C_{out}, C_{in}, k_d, k_h, k_w) (Cout,Cin,kd,kh,kw) 的卷积核张量 W W W,其卷积运算的计算方式如下:
- 将 X X X 和 W W W 转换为 2D 的形式,其中 X X X 的形状为 ( B × D i n × H i n × W i n , C i n ) (B \times D_{in} \times H_{in} \times W_{in}, C_{in}) (B×Din×Hin×Win,Cin), W W W 的形状为 ( C o u t , C i n × k d × k h × k w ) (C_{out}, C_{in} \times k_d \times k_h \times k_w) (Cout,Cin×kd×kh×kw);
- 对 2D 的 X X X 和 W W W 进行矩阵相乘,得到形状为 ( B × D o u t × H o u t × W o u t , C o u t ) (B \times D_{out} \times H_{out} \times W_{out}, C_{out}) (B×Dout×Hout×Wout,Cout) 的输出张量 Y Y Y,其中 D o u t = D i n − k d + 1 D_{out} = D_{in} - k_d + 1 Dout=Din−kd+1, H o u t = H i n − k h + 1 H_{out} = H_{in} - k_h + 1 Hout=Hin−kh+1, W o u t = W i n − k w + 1 W_{out} = W_{in} - k_w + 1 Wout=Win−kw+1;
- 将 Y Y Y 转换为 5D 的形式,即 ( B , C o u t , D o u t , H o u t , W o u t ) (B, C_{out}, D_{out}, H_{out}, W_{out}) (B,Cout,Dout,Hout,Wout)。
import torch
# 创建输入和卷积核的5D张量
batch_size = 2
in_channels = 3
out_channels = 4
input_size = (32, 32, 32)
kernel_size = (3, 3, 3)
# (2,3,32*32*32)
input_tensor = torch.randn(batch_size, in_channels, *input_size)
#(4,3,3*3*3)
kernel_tensor = torch.randn(out_channels, in_channels, *kernel_size)
# 执行卷积操作
output_tensor = torch.nn.functional.conv3d(input_tensor, kernel_tensor)
#(2,4,30*30*30)
print(output_tensor.shape)