「つくりながら学ぶ! PyTorchによる発展ディープラーニング」を理解するためのメモ2


pytorch

Pytorch

はじめに

最近、研究室の指導教員の方に「つくりながら学ぶ! PyTorchによる発展ディープラーニング」をすすめられたのでこの本をやってたところ、まったくわからなかったので一つずつ整理してやろうと思いここに整理したことをメモしたと思います。


SSDの特徴

SSDは画像に映っている物体を認識、識別し、画像に四角いボックスで検出した物体の範囲とその信頼度を示す物体検出タスクです。

  • 学習データ
    • 画像
    • BBoxの位置(大きさは位置から算出可能)
    • 物体のラベル
  • 推論出力
    • BBoxの位置
    • 物体ラベル
    • 信頼度

つまり、学習時はBBoxのデータを処理する部分が追加されコードが複雑になります。
また、推論出力はBBoxに加えて信頼度が追加されます。


1. Datasetの作成

基本的な形は1章と同様に以下の入出力値です。

  • 入力値
    データによると思うのでどのような型でも大丈夫です。

  • 出力値
    [[データ, ラベル], [データ, ラベル]・・・]
    ここでSSD特有の点としてラベルがアノテーションとラベルのリスト型になっていることです。

    1
    2
    # イメージ
    [xmin, ymin, xmax, ymax, label]

出力値の全体のイメージは以下となります。

1
2
# イメージ
[[[画像データ], [xmin, ymin, xmax, ymax, label]], ・・・]

また、Datasetは以下のメソッドを実装しないといけないこともポイントです。

  • len
    データ数を返す、今回の場合だと画像数
  • getitem
    データを一つずつ渡すメソッド、今回だと画像データとアノテーションデータ
    今回のこの関数はタプル型で1つ目の配列が画像データ、2つ目の配列が複数のBBoxの配列が配列の中に格納されている状態です。

2. DataLoaderの作成

今回使用しているDataLoaderの引数にcollete_fnを使用している。
これは引数にバッチサイズのリストを受け取り、返り値としてバッチ化されたデータを返します。
バッチサイズのリストの中には、Datasetから取り出した1つ1つのデータが含まれています。


複雑な学習、検証

Dataset, DataLoaderのほかに複雑な部分は「隔週。検証」です。ここはコードが長くなりがちで難しいのでコードで行っていることを整理していきたいと思います。
このコードではループ(for分)内で学習を回しています。
実際のコードはこちらにあります。

1
2
3
4
5
6
7
8
for epoch回数
for ミニバッチの個数
with 学習モード(自動微分)
損失関数の計算
ラベルの予測
if 学習モード
誤差逆伝播(自動微分ONでないと不可能)
勾配を計算

このような形で学習と検証を行っているkとおがわかります。
特に学習時と検証時では、with文内のコードが違うため注意が必要です。特に以下の部分が違っています。

  • 自動微分のON/OFF
  • 誤差逆伝播の実行
  • 勾配の計算

これは検証時は学習が必要ないかつ時間がかかるためこのようになっています。

また、誤差逆伝播するためには自動微分で微分を計算してあげないといけないため、学習モードのみの時に自動微分をONかつ、誤差逆伝播しているところもポイントです。


あとがき

今回まとめた部分は主に1章に対応する内容です。
現時点で2章をやり始めましたが、とても複雑でコードをかいているだけでは何をやっているのかわからなくなります。
第1章は2章以降の基本となる部分であり、この基本を維持したままそれぞれの学習方法に適応していくためのコードが増えていくので整理して学習していきたいと思います。