You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras中Vision Transformer实现疑问:Patch形状与Embedding层

关于Keras中Vision Transformer(ViT)实现的问题解答

问题1:Patches层reshape后维度显示为(none,none,108)而非(none,144,108)

你看到的none是Keras静态图中的动态维度占位符,并非实际运行时的真实维度:

  • reshape前(none,12,12,108)里的第一个none代表可变批次大小(batch_size),后两个12是固定的patch网格数量;
  • 执行tf.reshape(patches, [batch_size, -1, patch_dims])时,-1会自动计算为12*12=144,但在模型构建阶段(比如调用model.summary()),Keras无法提前锁定batch_size和推导出来的patch数量的具体数值,所以用none占位;
  • 实际运行模型(传入真实输入数据)时,tensor形状会变成(实际batch_size,144,108),你可以在Patches层后添加tf.print()语句打印实际形状验证。

问题2:PatchEncoder层是否会导致所有patch的Embedding向量相同?

不会,你的理解存在偏差:

  • PatchEncoder中的Dense层是对每个patch单独执行线性映射,Dense层默认作用于输入的最后一维(这里是108维的patch特征);
  • 输入(bs,144,108)经过Dense(64)后,会输出(bs,144,64)——每个108维的patch都会通过共享的Dense权重(共64×108个参数)转化为64维向量,由于每个patch的原始特征不同,输出的Embedding向量自然存在差异;
  • 权重共享是Transformer类模型的常规设计,既能减少参数总量,也能保证所有patch遵循统一的特征映射规则。

问题3:(none,none,108)形状在ViT中的合理性

这个形状是Keras动态图机制的正常表现:

  • 第一个none:代表可变batch_size,允许模型适配不同批次大小的输入,这是深度学习框架的通用设计;
  • 第二个none:如果你的代码没有强制绑定固定的输入图片尺寸,Keras无法提前确定patch的数量(比如输入图片尺寸变化时,patch数量也会随之改变);
  • 若你使用的是官方固定输入尺寸的ViT实现,只需在模型输入层显式指定input_shape(比如对应12×12 patch网格的输入尺寸),模型summary中的第二个none就会变成固定的144。

内容的提问来源于stack exchange,提问作者Matteo Silla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:27:28