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


pytorch

Pytorch

はじめに

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


Pytorchの学習の流れに対する入力の形と出力の形

Pytorchでのディープラーニング実装の流れは以下となっています。

  1. Datasetの作成
  2. DataLoaderの作成
  3. ネットワークモデルの作成
  4. 順伝播関数の実装
  5. 損失関数の実装
  6. 学習と検証
  7. 推論

ここで1, 2の部分について、どのような入力でどのような出力にすべきかがわからないとどのようなコードを書いているのかがわからなかったのでここにまとめます。

  1. Datasetの作成
  2. DataLoaderの作成

1. Datasetの作成

  • 入力値
    入力値はデータによると思うのでどのような型でも大丈夫です。
  • 出力値
    [[データ, ラベル], [データ, ラベル]・・・]

2. DataLoaderの作成

  • 入力値
    [[データ, ラベル], [データ, ラベル]・・・]
  • 出力値
    辞書型
    1
    2
    3
    4
    {
    "train": torch.utils.data.DataLoaderで作成したDataLoader,
    "val": torch.utils.data.DataLoaderで作成したDataLoader,
    }

複雑な学習、検証

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章以降の基本となる部分であり、この基本を維持したままそれぞれの学習方法に適応していくためのコードが増えていくので整理して学習していきたいと思います。