Vit 实战营 Class2:图像与Transformer基础

这篇具有很好参考价值的文章主要介绍了Vit 实战营 Class2:图像与Transformer基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数组图像:图像与像素

Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
什么是数字图像?在计算机图像的图像格式。每一个点叫pixel。type是uint8。
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
左边比右边清楚。
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
105可以用8位的二进制表示。24位的话,可以表示1600万个不同的颜色。HDR和杜比视界,用10位二进制表示一个颜色,所以是30位,1 billion个不同的颜色。
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
注意flatten是维度的展平,而Expand是一个维度的复制。

图像分类:机器如何学习?

Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能

NMT:Neuron Machine Translation

Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
sequetial to sequential的。一个句子就是一个sequetial,一个序列,S2S,又是一个Encoder -> Decoder的过程。

Transformer

Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能

Transformer本质是一个Encoder+Decoder的过程。

Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能

Encoder和Decoder都不是一层,可能是多层。

Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能

FFN:Feed Forward Network
MSA:Multi head self-Attention

Vision Transformer

Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
Vit 是没有Decoder的。Encoder就是实现每一层,然后resnet去跳连。
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能

映射就是linear层,或者说可学习的层。
把图像分成块,就相当于NLP领域把一个句子分成分词。
Patch Embedding过程:一张[h, w, 3] img 按照window的大小,分成不同的patch,他们的维度变成[num_patch, Wh, Ww, 3]. 每一个patch我们讲他flatten成1维,然后过一个linear层,最后输出的就是一个token,所有token就是patch embedding。每一个token拉平就是embed_dim。

关于Linear Prejection是怎么操作的,可以看下图。

Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
从卷积CNN的角度理解patch embedding。卷积里的参数值,其实就是Linear Project中的可学习参数w。embed_di的长度,其实就是卷积核的个数,比如我们有32个filter,那么embed_dim=32。

关于CNN卷积,台大李宏毅老师有过很好的描述,如下图。
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
其实我们的filter就相当于DNN中的权重,只不过不是全部的权重,而Feature Map就是第一层的hidden layer。那么与多少个filter 卷积,就有多少层的hidden layer,也就有多少个feature map。每一层的hidden layer,由一个卷积负责,backpropagation的时候,这一层的反传,会更新这一层的卷积核权重。
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
由上图可以看出,Filter1 对于图片的左上角来说,它只作用于pixel=1,2,3,7,8,9,13,14,15。Filter里面对应的值,可以看到就是DNN的input与神经元3的连线。不同的位置对应不同的颜色。
Vit 实战营 Class2:图像与Transformer基础,Transformer,transformer,深度学习,人工智能
综上所属,其实linear projection就是做的卷积,我们的代码里也是用的Conv2d实现的。output_channels=embedd_dim。也就是把这个patch通过卷积做成了特征图feature。

所以,不难理解Vit的工作,其实就是把原始图像做了不用的“块分割”(patch embedding)。对每一“块”(patch)进行特征的提取(linear projection)。每一“块”提取出的feature map,作为image token加入到Transformer中。

至于Transformer内部具体是怎么工作的,请看下一篇。文章来源地址https://www.toymoban.com/news/detail-576356.html

代码实战

import paddle
t = paddle.zeros([3, 3])
print(t)

t = paddle.randn([5, 3])
print(t)

from PIL import Image
import numpy as np
img = np.array(Image.open("img.png"))
print(img.shape)
# print(img)
t = paddle.to_tensor(img, dtype='float32')
print(type(t))
print(t.dtype)
t = t.transpose([2, 1, 0])
print(t.shape)

# chunk
t = paddle.randint(0, 10, [5, 15])
print(t)
qkv = t.chunk(3, -1)
print(qkv)
q, k, v = qkv
print(q)
# ViT Online Class
# Author: Dr. Zhu
# Project: PaddleViT (https://github.com/BR-IDL/PaddleViT)
# 2021.11
import paddle
import paddle.nn as nn
import numpy as np
from PIL import Image

# paddle.set_device('cpu')

class Identity(nn.Layer):
    def __init__(self):
        super().__init__()

    def forward(self, x):
        return x


class Mlp(nn.Layer):
    def __init__(self, embed_dim, mlp_ratio=4.0, dropout=0.):
        super().__init__()
        self.fc1 = nn.Linear(embed_dim, int(embed_dim*mlp_ratio))
        self.fc2 = nn.Linear(int(embed_dim*mlp_ratio), embed_dim)
        self.act = nn.GELU()
        self.dropout = nn.Dropout(dropout)

    def forward(self, x):
        x = self.fc1(x)
        x = self.act(x)
        x = self.dropout(x)
        x = self.fc2(x)
        x = self.dropout(x)
        return x



class PatchEmbedding(nn.Layer):
    def __init__(self, image_size, patch_size, in_channels, embed_dim, dropout=0.):
        super().__init__()
        self.patch_embedding = nn.Conv2D(in_channels,
                                        embed_dim,
                                        kernel_size=patch_size,
                                        bias_attr=False)
        self.dropout = nn.Dropout(dropout)

    def forward(self, x):
        # [n, c, h, w] [1, 1, 28, 28]
        x = self.patch_embedding(x) # [n, c', h', w']
        x = x.flatten(2) # [n, c', h'*w']
        x = x.transpose([0, 2, 1]) # [n, h'*w', c']  h'*w'=num_patches
        x = self.dropout(x)
        return x


class Attention(nn.Layer):
    def __init__(self):
        super().__init__()

    def forward(self, x):
        return x


class EncoderLayer(nn.Layer):
    def __init__(self, embed_dim):
        super().__init__()
        self.attn_norm = nn.LayerNorm(embed_dim)
        self.attn = Attention()
        self.mlp_norm = nn.LayerNorm(embed_dim)
        self.mlp = Mlp(embed_dim)

    def forward(self, x):
        h = x 
        x = self.attn_norm(x)
        x = self.attn(x)
        x = x + h

        h = x
        x = self.mlp_norm(x)
        x = self.mlp(x)
        x = x + h
        return x


class ViT(nn.Layer):
    def __init__(self):
        super().__init__()
        self.patch_embed = PatchEmbedding(224, 7, 3, 16)
        layer_list = [EncoderLayer(16) for i in range(5)]
        self.encoders = nn.LayerList(layer_list)
        self.head = nn.Linear(16, 10)
        self.avgpool = nn.AdaptiveAvgPool1D(1)
        self.norm = nn.LayerNorm(16)

    def forward(self, x):
        x = self.patch_embed(x) # [n, h*w, c]: 4, 1024, 16
        for encoder in self.encoders:
            x = encoder(x)
        # avg
        x = self.norm(x)
        x = x.transpose([0, 2, 1])
        x = self.avgpool(x)
        x = x.flatten(1)
        x = self.head(x)
        
        return x


def main():
    t = paddle.randn([4, 3, 224, 224])
    model = ViT()
    out = model(t)
    print(out.shape)


if __name__ == "__main__":
    main()

到了这里,关于Vit 实战营 Class2:图像与Transformer基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vision Transformer (ViT)

    生成式模型与判别式模型 生成式模型,又称概率模型 ,是指 通过学习数据的分布来建立模型P(y|x) ,然后利用该模型来生成新的数据。生成式模型的典型代表是 朴素贝叶斯模型 ,该模型通过学习数据的分布来建立概率模型,然后利用该模型来生成新的数据。 判别式模型,又

    2024年02月15日
    浏览(51)
  • Vision Transformer(VIT)

    Vision Transformer(ViT)是一种新兴的图像分类模型,它使用了类似于自然语言处理中的Transformer的结构来处理图像。这种方法通过将输入图像分解成一组图像块,并将这些块变换为一组向量来处理图像。然后,这些向量被输入到Transformer编码器中,以便对它们进行进一步的处理。

    2024年02月07日
    浏览(43)
  • Vision Transformer (ViT)介绍

    paper:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 把transformer直接应用于图像块序列,也可以在图像分类任务上表现很好。 通过在大数据集上预训练,然后迁移到中等规模和小规模数据集上,ViT可以取得和SOTA的卷积网络同样出色(甚至更好)的结果,同时需要更

    2024年02月13日
    浏览(51)
  • VIT与swin transformer

    VIT也就是vision transformer的缩写。是第一种将transformer运用到计算机视觉的网络架构。其将注意力机制也第一次运用到了图片识别上面。其结构图如下(采用的是paddle公开视频的截图) 看起来比较复杂,但实际上总体流程还是比较简单的。只需要看最右边的总的结构图,它的输

    2024年02月05日
    浏览(40)
  • Vision Transformer(VIT)调研

    综述参考:https://zhuanlan.zhihu.com/p/598785102 2020 VIT 代码库 https://github.com/lucidrains/vit-pytorch 只有分类任务,有训练的测试。有各种各样的vit模型结构。 原文 https://arxiv.org/abs/2010.11929 2021 Swim Transformer https://arxiv.org/abs/2103.14030 v2 https://arxiv.org/pdf/2111.09883.pdf code and pretrain_model https:/

    2023年04月11日
    浏览(54)
  • 论文阅读 Vision Transformer - VIT

    通过将图像切成patch线形层编码成token特征编码的方法,用transformer的encoder来做图像分类 解决问题: transformer输入限制: 由于自注意力+backbone,算法复杂度为o(n²),token长度一般要512才足够运算 解决:a) 将图片转为token输入 b) 将特征图转为token输入 c)√ 切patch转为token输入 tra

    2024年02月01日
    浏览(40)
  • ViT-vision transformer

    介绍 Transformer最早是在NLP领域提出的,受此启发,Google将其用于图像,并对分类流程作尽量少的修改。 起源 :从机器翻译的角度来看,一个句子想要翻译好,必须考虑上下文的信息! 如:The animal didn’t cross the street because it was too tired将其翻译成中文,这里面就涉及了it这个

    2024年02月15日
    浏览(39)
  • 图解Vit 3:Vision Transformer——ViT模型全流程拆解

    先把上一篇中的遗留问题解释清楚:上图中,代码中的all_head_dim就是有多少head。把他们拼接起来。 Encoder在Multi-Head Self-Attention之后,维度一直是BND`,一直没有变。 不论是BN(Batch Normalization)还是LN(Layer Normalization),都是对batch来做的。只是他们的归一化方式不同。我们在求mea

    2024年02月16日
    浏览(38)
  • 7.卷积和Transformer结合的ViT

    一、回顾与简介 前面两节课我们讲了Swin Transformer的结构,以及其中的细节部分,进行了实现,其中由Swin Block 以及 Patch Merging等等,上节课讲了 SW-MSA的shift和mask,对于shift之后,其中window中需要的保留,不需要的去掉,用到了boardcasting等等。 这节课我们考虑卷积和Transformer如

    2024年02月06日
    浏览(33)
  • ViT(Version Transformer)原始论文解读

    paper:2010.11929.pdf (arxiv.org) code:google-research/vision_transformer (github.com) 期刊/会议:ICLR 2020 虽然Transformer体系结构已经成为自然语言处理任务的事实上的标准,但它在计算机视觉方面的应用仍然有限。在视觉上,注意力要么与卷积网络结合应用,要么用于替换卷积网络的某些组件

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包