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

文章目录

  • 数组图像:图像与像素
  • 图像分类:机器如何学习?
  • NMT:Neuron Machine Translation
  • Transformer
  • Vision Transformer
  • 代码实战

数组图像:图像与像素

在这里插入图片描述
什么是数字图像?在计算机图像的图像格式。每一个点叫pixel。type是uint8。
在这里插入图片描述
左边比右边清楚。
在这里插入图片描述
105可以用8位的二进制表示。24位的话,可以表示1600万个不同的颜色。HDR和杜比视界,用10位二进制表示一个颜色,所以是30位,1 billion个不同的颜色。
在这里插入图片描述
在这里插入图片描述
注意flatten是维度的展平,而Expand是一个维度的复制。

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NMT:Neuron Machine Translation

在这里插入图片描述
sequetial to sequential的。一个句子就是一个sequetial,一个序列,S2S,又是一个Encoder -> Decoder的过程。

Transformer

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

Vision Transformer

在这里插入图片描述
Vit 是没有Decoder的。Encoder就是实现每一层,然后resnet去跳连。
在这里插入图片描述
在这里插入图片描述

映射就是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是怎么操作的,可以看下图。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从卷积CNN的角度理解patch embedding。卷积里的参数值,其实就是Linear Project中的可学习参数w。embed_di的长度,其实就是卷积核的个数,比如我们有32个filter,那么embed_dim=32。

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

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

至于Transformer内部具体是怎么工作的,请看下一篇。

代码实战

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 xclass 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 xclass 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_patchesx = self.dropout(x)return xclass Attention(nn.Layer):def __init__(self):super().__init__()def forward(self, x):return xclass 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 + hh = xx = self.mlp_norm(x)x = self.mlp(x)x = x + hreturn xclass 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, 16for encoder in self.encoders:x = encoder(x)# avgx = self.norm(x)x = x.transpose([0, 2, 1])x = self.avgpool(x)x = x.flatten(1)x = self.head(x)return xdef main():t = paddle.randn([4, 3, 224, 224])model = ViT()out = model(t)print(out.shape)if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/26356.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工欲善其事,必先利其器之—react-native-debugger调试react native应用

调试react应用通常利用chrome的inspector的功能和两个最常用的扩展 1、React Developer Tools (主要用于debug组件结构) 2、Redux DevTools (主要用于debug redux store的数据) 对于react native应用,我们一般就使用react-nativ…

ClickHouse

资料来源:尚硅谷ClickHouse 官方文档:什么是ClickHouse? | ClickHouse Docs 一、ClickHouse入门 1.1 ClickHouse特点 ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用 C语言编…

力扣算法数学类—Excel表列名称

目录 Excel表列名称 题解: 代码: Excel表列名称 168. Excel表列名称 - 力扣(LeetCode) 给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。 例如: A -> 1 B -> 2 C -> 3 ... Z -…

TCP的三次握手与四次挥手

目录 三次握手过程理解 四次挥手过程理解 常见问题 源码等资料获取方法 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号…

itheima苍穹外卖项目学习笔记--Day8: 用户下单 / 微信支付

Day8:用户下单、微信支付 Day8:用户下单、微信支付a. 用户下单b. 微信支付 Day8:用户下单、微信支付 a. 用户下单 创建OrderController并提供用户下单方法: /*** 用户下单* param ordersSubmitDTO* return*/ PostMapping("…

基于深度学习的高精度线路板瑕疵目标检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度线路板瑕疵目标检测系统可用于日常生活中来检测与定位线路板瑕疵目标,利用深度学习算法可实现图片、视频、摄像头等方式的线路板瑕疵目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

深度学习模型:Pytorch搭建ResNet、DenseNet网络,完成一维数据分类任务

2023.7.17 DenseNet和ResNet都是深度学习中常用的网络结构,它们各有优缺点。 DenseNet的优点是可以充分利用网络中的信息,因为每个层都可以接收来自前面所有层的信息。这种密集连接的结构可以提高网络的准确性,减少过拟合的风险。此外&…

DBeaver连接华为高斯数据库 DBeaver连接Gaussdb数据库 DBeaver connect Gaussdb

DBeaver连接华为高斯数据库 DBeaver连接Gaussdb数据库 DBeaver connect Gaussdb 一、概述 华为GaussDB出来已经有一段时间,最近工作中刚到Gauss数据库。作为coder,那么如何通过可视化工具来操作Gauss呢? 本文将记录使用免费、开源的DBeaver来…

Python迭代器与生成器

文章目录 迭代器创建迭代器StopIteration 生成器 迭代器 访问集合元素的一种方式,可以记住遍历的位置的对象 从集合的第一个元素开始,直到所有的元素被访问完结束,迭代器只能往前不会后退 iter(),创建迭代器对象 iter(object, …

matlab滤波器设计-IIR滤波器的设计与仿真

matlab滤波器设计-IIR滤波器的设计与仿真 1 引言 在现代通信系统中,由于信号中经常混有各种复杂成分,所以很多信号的处理和分析都是基于滤波器而进行的。但是,传统的数字滤波器的设计使用繁琐的公式计算,改变参数后需要重新计…

AlienSwap 首期 Launchpad — 粉丝偶像女团 NFT+RWA 的创新探索

NFT 是整个加密市场一致看好,并认为会继续爆发的领域。随着更多的 NFT 平台和 NFT 项目的推出,NFT 市场的格局也在不断变化。从开始的 OpenSea 占据领先地位,到 Blur 的横空出世风头无两,在加密领域,局势更迭总是在不经…

Hive自定义函数

本文章主要分享单行函数UDF(一进一出) 现在前面大体总结,后边文章详细介绍 自定义函数分为临时函数与永久函数 需要创建Java项目,导入hive依赖 创建类继承 GenericUDF(自定义函数的抽象类)(实现…