图像 patch Embedding

import torch
import torch.nn as nn


class PatchEmbed(nn.Module):
    """ Image to Patch Embedding
    """

    def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):
        super().__init__()
        img_size = (img_size, img_size)
        patch_size = (patch_size, patch_size)
        num_patches = (img_size[1] // patch_size[1]) * (img_size[0] // patch_size[0])
        self.img_size = img_size
        self.patch_size = patch_size
        self.num_patches = num_patches

        self.project = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)

    def forward(self, x):
        B, C, H, W = x.shape
        # FIXME look at relaxing size constraints
        assert H == self.img_size[0] and W == self.img_size[1], \
            f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})."
        x = self.project(x)
        x = x.flatten(2)
        x = x.transpose(1, 2)
        return x


if __name__ == "__main__":
    x = torch.rand([1, 3, 224, 224])
    model = PatchEmbed()
    y = model(x)
    print(y.shape)

torch.Size([1, 196, 768])

Process finished with exit code 0

你可能感兴趣的:(算法,机器学习,python,深度学习,cv,计算机视觉,python)