はじめに
この記事は「ただただアウトプットを癖付けるための Advent Calendar 2024」に投稿した記事です。
最初の記事にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果がNeurIPSに採択されました。
以前の記事で、SIGNATEの初心者向け課題に挑戦した話をしました。
今回はまた別の競技プログラミングサービス、Nishikaに挑戦してみました。
関連記事
前の記事「NeurIPS著者が今更JAXを使ってみた話」
次の記事「【生物物理屋による論文紹介】マルチモーダル言語モデルによるマインクラフト学習 JARVIS-1」
Nishika
Nishikaは、競技プログラミングのコンペティションを提供しているサービスです。
こちらからアクセスできます。
今回は、練習問題のなかから、日本画の顔分類問題に挑戦してみました。
問題概要
日本画の顔分類問題は、日本画の顔画像を分類する問題です。
学習データは、日本画の顔画像とそのラベルが与えられます。このラベルは、画像のファイル名と番号の組み合わせを記したcsvファイルで与えられます。
テストデータは、日本画の顔画像が与えられ、その画像がどのラベルに分類されるかを予測する問題です。
ラベルというのは、性別と階級の組み合わせです。
これらのほかに、提出用のサンプルファイルが与えられます。
このサンプルファイルもまた、画像のファイル名と番号の組み合わせを記したcsvファイルです。
この形式で、提出用のファイルを作成し、提出します。
解法
今回は、画像分類問題を解くために、PyTorchを使いました。
なかでも、torchvisionを使って、画像分類のためのモデルを構築しました。
今回も練習問題ということでさわりだけですが、やったことは以下の通りです。
- 画像データとラベルを読み込むデータローダーを作成 (torchvision.datasets)
- 128x128にリサイズし、正規化するための前処理を定義 (torchvision.transforms)
- データセットを訓練用と検証用に分割 (torch.utils.data.random_split)
- ラベルの個数を数え、クラス数を取得 (dataset.img_labels)
- ResNet18の最終層の次元だけ変えたモデルを定義 (torchvision.models)
- 損失関数と最適化手法を定義 (torch.nn.CrossEntropyLoss, torch.optim.Adam)
- 学習
- 画像データのみを読み込むデータローダーを作成 (torchvision.datasets)
- 検証用データで評価
- テストデータで予測
- 提出用のcsvファイルを作成
最初に作ったデータローダーがラベルを必要とする構成になってしまっていたため、テストデータ用に別途データローダーを作成する必要が生じてしまいました。ここは改善点ですね。
今回はCPUで学習したので、10エポックでも10分ほどかかりました。
これだけでも、検証用データで0.77程度の精度が出ました。
提出後のスコアでも、0.765という評価値が出ていました。
ランキングを見ると0.9以上のスコアが出ている方もいらっしゃいましたが、パッとやったにしてはまずまずの結果だと思います。