itakura-2024-06-28 進捗報告
やったこと
・従来のViTは固定サイズのパッチでトレーニングされており、異なるパッチサイズでの性能は保証されない。パッチサイズを変更するには、再トレーニングが必要
・バッチごとにパッチサイズをランダムに選択
・異なるパッチサイズに適応するために、パッチ埋め込みするための重みをリサイズする。提案したPIリサイズ(擬似逆行列リサイズ)を用いることで元の埋め込みとできるだけ一致するように調整する
・パッチ埋め込みと同様に、位置埋め込みもパッチサイズに応じてリサイズする。これにより、異なるパッチサイズに対応するための適応性が向上する
https://gyazo.com/6fb6c735b098c23894933b6256db5919https://gyazo.com/5cb74ebbdc351ad1e61a07bcc0793695
https://gyazo.com/23e6d15c4519ffc0af9ac431b008fbe2
code:FlexiViT
model = ViT(...)
for batch in data:
logits = model(batch"images", (ps, ps) ) # ... backprop and optimize as usual class ViT(nn.Module):
def __call__(self, image, patchhw ):
# Patchify, flexibly:
w = self.param("w_emb", (32, 32 , 3, d))
b = self.param("b_emb", d)
w = resize(w, (*patchhw, 3, d))
x = conv(image, w, strides=patchhw) + b
# Add flexible position embeddings:
pe = self.param("posemb", (7, 7 , d))
pe = resize(pe, (*x.shape1:3, d)) return TransformerEncoder(...)(x + pe)
今後の予定
方向性を考えて、自分なりに解釈して図に起こす。
どんなデータをとればいいか考える。