お疲れ様です。
前回の記事でDeiTについて調べたので実際にコード実装し動作できるようにしました。
ソースコード
実装したコードはこちらに置いています。
過去に作成したコードを改良したものになります
モデルアーキテクチャと事前学習モデルはtimmから利用しています。
(ついでにuv対応や学習データセットの仕様変更も対応しました。)
データセットの実装を変更すれば自分で用意したデータを使用することもできると思います。
実行
実際に実行した内容をこちらにも残しておきます。
学習に使用したデータは以下になります。 人の行動を表す写真を15クラスでまとめたデータセットです。
クラスリスト: ['calling', 'clapping', 'cycling', 'dancing', 'drinking', 'eating', 'fighting', 'hugging', 'laughing', 'listening_to_music', 'running', 'sitting', 'sleeping', 'texting', 'using_laptop']
trainデータ12600枚を訓練:検証=8:2(10080:2520)に分割しています。
huggingface.co
学習の結果は以下のようになりました。
学習曲線

混同行列

ベストモデル(かなり学習序盤ですが)を使用して推論した結果が以下。
使用したデータセットのtestデータを使用しています。
いくつかのクラスの10枚のみを示します。
ざっと見た感じ大体あっていそうです。
calling(電話する人の写真)

sleeping(寝ている人の写真)

fighting(喧嘩している人?)

他モデルとの比較として、同じ学習条件で実行した結果も載せておきます。
データセットや学習条件の調整によって変化はあると思いますので参考程度に。
比較対象のモデルは、DeiTのもとになったVisionTransformerとCNNベースで現在もよく使われるEfficientNetV2としました。
学習が進むにつれてLossが上がりAccuracyが下がるという感じで全体的に同じような傾向ですが、VisionTransformerがその傾向がより強いようでした。
DeiTはその辺が改良によって軽減されているということでしょうか…🤔
