分類タスク用の小さなViTネットワークアーキテクチャの構築(Pytorch)

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して16日目です。クリックしてイベントの詳細をご覧ください

序文

  ここでは、原理についてはあまり説明しません。実験の便宜上、最も一般的なMNISTデータセットを選択します。デモの構造には、以前のハンズオンMNIST分類でGPUバージョンを使用します(CPUバージョン+ GPUバージョン)をマスターとして。詳細については、 juejin.cn / post/707783を参照してください…

VisionTransformersの一般的なフレームワーク

  独自のViTモデルを使用してMNIST分類に適用できるようにするために(クラスNet(nn.Module)モジュールを置き換える)、次のフレームワークを構築できます。

class ViTNet(nn.Module)
    def __init__(self):
        super(ViTNet,self).__init__()
    
    def forward
        pass
复制代码

VisionTransformersの詳細なアーキテクチャ

  PyTorchにはAutograd計算を提供するDLアーキテクチャが多数あるため、Vision Transformersモデルのフォワードパスにのみ焦点を当てる必要があります。トレーニングフレームワークでモデルオプティマイザーを定義しているため、PyTorchフレームワークは勾配を逆伝播できます。モデルのパラメーターをトレーニングします。
(MNIST)ネットワーク構造に準拠するために、次の5つの重要なステップを構築します。
最初のステップ:パッチ化と線形マッピング:

  Transformerエンコーダーは、当初NLPなどのシリアル化されたデータに主に使用されていました。CVフィールドで使用する最初のステップは、「シリアル化された」画像を処理することです。ここでの処理方法は、画像を複数のサブ画像に分解することです。各サブイメージをベクトルに変換します。

  MNISTデータセットでは、各(1x28x28)画像を7x7ブロックに分割し、各ブロックサイズは4x4です(ブロックを完全に分割できない場合は、画像のパディングを埋める必要があります)。これにより、単一の画像。元の画像の形状を次のように変更します。

  (N, PxP, HxC/P x WxC/P) = (N, 7x7, 4x4) = (N, 49, 16)请注意,虽然每个子图大小为 1x4x4 ,但我们将其展平为 16 维向量。此外,MNIST只有一个颜色通道。如果有多个颜色通道,它们也会被展平到矢量中。

  我们得到展平后的patches即向量,通过一个线性映射来改变维度,线性映射可以映射到任意向量大小,我们向类构造函数添加一个hidden_d参数,用于“隐藏维度”。这里,使用隐藏维度为8,这样我们将每个 16 维patch映射到一个 8 维patch

第二步:添加分类标记

  在隐含层后,为了完成MNIST分类任务,必不可少的是添加分类的标记,在模型中添加一个参数将我们的Tensor(N,49,8)转变为Tensor(N,50,8);这里大家需要注意的一个地方是分类标记需要放在每个序列的第一个标记位。在完成MLP时,需要对应到相应的位置上。

第三步:添加位置编码

   紧接上一步,我们标记完成后需要进行添加位置编码,然而这块的理论性较强,强烈建议大家观摩transformer模型中的位置表明输出,这里我们就简化了,采用sin和cos替代。这里需要注意的地方是我们在第二部中转换完的Tensor(N,50,8),此时我们应该重复(50,8)的位置编码矩阵N次。

第四步:LN, MSA和残差连接

   这步较为复杂,我们在对tokens做归一化没然后采用多头注意力机制,最后添加一个残差连接输出。
LN:通过LN运行Tensor(N,50,8)后,每个50x8 矩阵的均值是0,标准差位1,维度保持不变。

   多头自注意力:对于每一张图像,都希望它能参与每个patch并在其中更新。在这里我不做过多注释,大家可参考MSA计算过程。

   残余接続:残余接続が追加され、LNおよびMSAの後に取得された(N、50、8)に元のテンソル(N、50、8)が追加されます。MNISTからモデルを介してランダム(3、1、28、28)画像を実行すると、形状(3、50、8)の結果が得られます。

ステップ5:LN、MLP、および残余接続後のMLP分類:

   ここからビルディングブロックが始まります。カテゴリラベルが追加された場所に対応するNシーケンスからカテゴリマーカー(最初のマーカー)のみを抽出し、各マーカーを使用してNカテゴリを取得できます。

   各トークンは8次元のベクトルであると判断し、10個の可能な数値があるため、分類MLPを単純な8x10行列として実装し、SoftMax関数を使用してアクティブ化できます。

おすすめ

転載: juejin.im/post/7087074319268282405