参考;https://blog.csdn.net/weixin_38481963/article/details/109924004
https://blog.csdn.net/qq_48345413/article/details/121501308
卷积输出计算公式:卷积操作:
nn.Conv2d(in_channels, out_channels, kernel_size=patch_size, stride=patch_size) in_channels :输入通道数目 out_channels :输出通道数目 kernel_size :卷积核大小,如果输入是一个值,比如 3 33,那么卷积核大小就是 3 × 3 3 times 33×3 ,如果不想卷积核宽和高相等,还可以输入tuple类型数据,比如: ( 3 , 5 ) (3, 5)(3,5) stride :步长大小,跟上面卷积核参数一样,如果输入是一个值,比如 2 22 ,步长就是 2 × 2 2 times 22×2 ,还可以输入元组 ( 2 , 1 ) (2, 1)(2,1) ,表示卷积核每次向右移动 1 11 个步长,向下移动 2 22 个步长。 padding :填充,参数表示在周围补0的情况。补0的方向为上、下、左、右四个方向。如果是输入是单个值,比如1,就是在上下左右四个方向补一圈0。如果输入是元组比如 (2,1) ,表示在上下两个方向各补两行0,在左右两个方向各补一列0。
代码;
import torch a=torch.rand(20,3,224,224) ##20 batch 3 通道数 224 224是宽和高 proj = torch.nn.Conv2d(3, 768, kernel_size=16, stride=16) #构建2维卷积 ,768输出通道数 kk = proj(a) ## 卷积后kk 维度torch.Size([20, 768, 14, 14]) kk1= kk.flatten(2) #flatten: [B, C, H, W] -> [B, C, HW] kk1维度 torch.Size([20, 768, 196]) kk2=kk1.transpose(1, 2) #transpose: [B, C, HW] -> [B, HW, C] kk2维度torch.Size([20, 196, 768]) 表示196个patch,维度都为768
kk2的transpose 操作相当于是吧kk1的每行第一个取出展平得到
pip install einops
参考:https://zhuanlan.zhihu.com/p/443082493
***上面过程可以一句写成
from einops import rearrange a=torch.rand(20,3,224,224) ##20 batch 3 通道数 224 224是宽和高 img = rearrange(a, 'b c (h p1) (w p2) -> b (h w) (p1 p2 c)', p1=16, p2=16) ###p1,p2就是patch的大小,b batch,c 通道



