图 12-4
在代码实现中,直接通过一个卷积层来实现。 直接使用一个卷积核大小为 16x16,
步距为 16,卷积核个数为 768 的卷积来实现。通过卷积 [ 224, 224, 3 ] 转化为[14,
14, 768],然后把 H 以及 W 两个维度展平即可 [ 14, 14, 768] 转化为 [196, 768],
此时正好变成了一个二维矩阵,正是 Transformer 需要的数据格式。
代码如下:
from torch.nn.modules.utils import _pair
class PatchEmbeddings(nn.Module):
"""
Construct the embeddings from patch, position embeddings.
"""
def __init__(self, img_size, in_channels=3):
super(PatchEmbeddings, self).__init__()
#
原始大小为
int
,转为
tuple
,
#
即:
img_size
原始输入
224
,变换后为
[224,224]
img_size = _pair(img_size) #
生成
(img_size x img_size)
patch_size = _pair(16)
#
图像块的个数
num_patches = \
(img_size[0]//patch_size[0]) * (img_size[1]//patch_size[1])
# kernel_size=
块大小,即每个块输出一个值,
#
类似每个块展平后使用相同的全连接层进行处理
#
输入维度为
3
,输出维度为块向量长度
#
与原文中:分块、展平、全连接降维保持一致
#
输出为
[B, C, H, W]
self.patch_embeddings = Conv2d(in_channels=in_channels,
out_channels=768,
kernel_size=patch_size,
stride=patch_size)
#
或
# self.patch_embeddings=in_channels*patch_size[0]*patch_size[1]
评论0