成品源码网站网站代码查看
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:31
当前位置: 首页 > news >正文
成品源码网站,网站代码查看,网站建设主要用什么软件,深圳有哪些知名企业对于输入#xff08;1#xff0c;3#xff0c;32#xff0c;32#xff09;和使用 patch size 为 8 的设置#xff0c;维度变化的步骤可以总结为以下过程#xff1a; 图像块的提取#xff1a; 使用 patch size 为 (8, 8) 将输入图像划分为图像块。#xff08;32//8133232和使用 patch size 为 8 的设置维度变化的步骤可以总结为以下过程 图像块的提取 使用 patch size 为 (8, 8) 将输入图像划分为图像块。32//8*32//816个图像块对应image_sequence_length维度变为116388。 展平成向量 将每个图像块展平为长度为 8 * 8 * 3 的向量。维度变为116192。 加入 Class Token 和 位置嵌入 添加 Class Token将维度变为117192。添加位置嵌入(相加最终维度仍为117192。 线性投影 使用线性投影将维度投影到 input_dim1024可变。对应input_dim维度变为1171024。transformer 多头自注意力机制Multi-Head Self-Attention 如果默认的头数是 h通常为 12并且头维度head dim是 d_h通常为 64则每个头产生的输出维度为11764。embed_dim对应d_h*h线性变换得到 Q, K, V 对输入进行三个线性变换得到Q,K,V每个变换的权重矩阵维度为 (d_model,d_h*h)即(1024-12x64768)。h为头的个数Q 的维度为 (1,17,d_h*h)K 的维度为 (1,17,d_h*h)V 的维度为 (1,17,d_h*h)。这可以用矩阵相乘的方式实现QX⋅Wq,KX⋅Wk,VX⋅Wv其中 X 是输入张量。 拆分为多头 将得到的 Q,K,V 分别拆分为 h 个头每个头的维度为 (1,17,d_h)。这里的拆分是在最后一维上进行的。 注意力计算 对每个头进行注意力计算得到注意力分数。注意力计算包括对 Q 和 K 进行点积然后进行缩放操作最后应用 softmax 函数。将注意力分数乘以 V得到每个头的注意力输出(1,17,d_h)。 合并多头输出 将每个头的注意力输出按最后一维度进行连接concatenate得到多头注意力的输出。多头注意力的输出的维度为 (1,17,768)。这里768h*d_h映射为1171024加残差维度不变1171024LayerNormalization 和 Feedforward 对于每个位置进行 LayerNormalization 维度不变1171024。Feedforward 网络 如果默认的 Feedforward 网络的中间维度为 2048 输入维度1171024变化为1172048输出维度1171024加残差维度不变11710241171024全局池化或者只取cls token11024mlp输出1000类-11000 图 更新补充代码实现 分组件实现 分别对应上图右边模块 Norm class PreNorm(nn.Module):def init(self,dim,fn):#fn指norm之后的函数 如上图可以接mha或者mlpsuper().init()self.norm nn.LayerNorm(dim)self.fn fndef forward(self,x):return self.fn(self.norm(x)) Multi-Head Attention 相对于别人用einsum的写法我的更加直白适合新手阅读 class MultiheadAttention(nn.Module):def init(self,input_dim,embed_dim,num_heads8):#embed_dim写的是多头的总dim即head_dim*num_heads#你也可以修改成输入为num_heads和head_dimsuper().init()#self.mha nn.MultiheadAttention(hid_dim,num_heads)self.embed_dim embed_dimself.num_heads num_headsself.head_dim embed_dim//num_headsself.W_q nn.Linear(input_dim, embed_dim)self.W_k nn.Linear(input_dim, embed_dim)self.W_v nn.Linear(input_dim, embed_dim)self.to_out nn.Linear(embed_dim, input_dim)def forward(self, x):# (batch_size, seq_length, embed_dim)# 例如32*32的图 取patchsize为8则image_sequence_length为32//832//8 16# image_sequence_length也就是块的个数batch_size, image_sequence_length, _ x.shape# 应用线性变换生成Q, K, VQ self.W_q(x).view(batch_size, image_sequence_length, self.num_heads, self.head_dim).transpose(1, 2)#实际为(batch_size, self.num_heads, image_sequence_length, self.head_dim)K self.W_k(x).view(batch_size, image_sequence_length, self.num_heads, self.head_dim).transpose(1, 2)V self.W_v(x).view(batch_size, image_sequence_length, self.num_heads, self.head_dim).transpose(1, 2)#得到(b,num_heads,image_sequence_length,image_sequence_length)attn_scores torch.matmul(Q, K.transpose(-2, -1)) / (self.head_dim ** 0.5)# 应用Softmax获取注意力权重# 计算块与块之间的注意力attn_weights torch.softmax(attn_scores, dim-1)# 使用注意力权重加权Vattn_output torch.matmul(attn_weights, V)attn_output attn_output.view(batch_size, image_sequence_length, self.embed_dim)return self.to_out(attn_output) MLP #ffn也就是mlp class FeedForward(nn.Module):def init(self,dim,hidden_dim,drop_out0.3):super().init()self.net nn.Sequential(nn.Linear(dim,hidden_dim),nn.GELU(),nn.Dropout(drop_out),nn.Linear(hidden_dim,dim),nn.Dropout())def forward(self,x):return self.net(x) 整合transformer block class Transformer(nn.Module):def init(self,input_dim,depth,embed_dim,mlp_dim,num_heads) - None:super().init()self.layers nn.ModuleList()for _ in range(depth):self.layers.append(nn.ModuleList([PreNorm(input_dim,MultiheadAttention(input_dim,embed_dim,num_heads)),PreNorm(input_dim,FeedForward(input_dim,mlp_dim))]))def forward(self,x):for attn,ff in self.layers:#norm-mha-残差-norm-mlp-加残差x attn(x)xx ff(x)xreturn x 整合VIT class VIT(nn.Module):def init(self,image_size,patch_size,num_classes,input_dim,depth,embed_dim,mlp_dim,heads,channels3,poolcls) - None:super().init()assert image_size%patch_size0num_patches (image_size//patch_size)(image_size//patch_size)patch_dim channels*patch_size*patch_sizeself.to_patch_embedding nn.Sequential(Rearrange(b c (h p1) (w p2) - b (h w) (p1 p2 c), p1patch_size, p2patch_size),nn.Linear(patch_dim,input_dim))self.pos_embedding nn.Parameter(torch.randn(1, num_patches1, input_dim))self.cls_token nn.Parameter(torch.randn(1,1,input_dim))self.transformer Transformer(input_dim,depth,embed_dim,mlp_dim,heads)self.pool poolself.to_latent nn.Identity()self.mlp_head nn.Sequential(nn.LayerNorm(input_dim),nn.Linear(input_dim,num_classes))def forward(self,img):x self.to_patchembedding(img) # b c (h p1) (w p2) - b (h w) (p1 p2 c) - b (h w) dimb,n, x.shape #(b,16,dim)cls_tokens repeat(self.cls_token,() n d - b n d,bb) x torch.cat((cls_tokens,x),dim1) # 将cls_token拼接到patch token中去(b,17,dim)x self.pos_embedding[:,:(n1)]#利用广播机制直接相加(b, 17, dim)x self.transformer(x)#(b, 17, dim)x x.mean(dim1) if self.pool mean else x[:,0]# (b, dim)#可以看到如果指定池化方式为mean的话则会对全部token做平均池化然后全部进行送到mlp中但是我们可以看到默认的self.poolcls也就是说默认不会进行平均池化而是按照ViT的设计只使用cls_token即x[:, 0]只取第一个tokencls_token。x self.to_latent(x) # Identity (b, dim)#print(x.shape)return self.mlp_head(x) 测试 model_vit VIT(image_size 32,patch_size 8,num_classes 1000,input_dim 1024,embed_dim 768,depth 6,heads 12,mlp_dim 2048,)img torch.randn(1, 3, 32, 32)preds model_vit(img) print(preds.shape) # (1, 1000)
相关文章
-
成品小说网站源码WordPress去掉由开发
成品小说网站源码WordPress去掉由开发
- 技术栈
- 2026年03月21日
-
成品网站建设流程php可以自己做网站吗
成品网站建设流程php可以自己做网站吗
- 技术栈
- 2026年03月21日
-
成品网站货源入口眼科医院网站优化服务商
成品网站货源入口眼科医院网站优化服务商
- 技术栈
- 2026年03月21日
-
成为网站建设人员措施wordpress模板 charset
成为网站建设人员措施wordpress模板 charset
- 技术栈
- 2026年03月21日
-
成为网站建设人员措施公共数据开放网站建设
成为网站建设人员措施公共数据开放网站建设
- 技术栈
- 2026年03月21日
-
诚信宁津建设网站免费网站制作在线
诚信宁津建设网站免费网站制作在线
- 技术栈
- 2026年03月21日






