pytorch Tensor 4D和5D计算规则

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=HinKh+1 W o u t = W i n − K w + 1 W_{out} = W_{in} - K_w + 1 Wout=WinKw+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=Hinkh+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=Winkw+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,其卷积运算的计算方式如下:

  1. 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)
  2. 对 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=Dinkd+1 H o u t = H i n − k h + 1 H_{out} = H_{in} - k_h + 1 Hout=Hinkh+1 W o u t = W i n − k w + 1 W_{out} = W_{in} - k_w + 1 Wout=Winkw+1
  3. 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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值