初心者向けにPyTorchの予測モデルの作成方法を解説します。深層学習は、入力層からデータを入力し、隠れ層にデータを持っていきます。入力データ各変数に重みをつけ、定数を加えます(線形関数)。隠れ層では、データを非線形に変換します。ReLU関数では負の場合はゼロ、ゼロ以上の場合はそのままのデータとします。それぞれのデータに重みをつけて定数を加えたものを出力データとします。
予測モデルについてのクラス(設計図)として、まず出力データの数、入力データの数、隠れ層の変数の数、隠れ層で使う活性化関数の種類などを決めます。
次に、入力データを、隠れ層から出力層へと次々と渡していく作業をメソッドの形で記述します。
深層学習に関する基本的なクラスであるnn.Moduleにさまざまな属性、メソッド、クラスがあらかじめ用意してあるので、比較的簡単な記述でモデルを書くことができます。

深層学習とは
深層学習の仕組みを簡単に説明します。左側にあるので入力データ(PyTorchでは多次元配列=テンソルとして扱います)で、隠れ層を通って、出力データになります。
この例では、入力層のデータは、線形関数で変換されて中間データ1に送られます。そのデータは、ReLU関数で変換されて、中間データ2となります。中間データ2から線形変換されて、出力データが出てきます。
データとデータを結ぶ関数のことをレイヤー関数と呼びます。単に関数と呼ぶこともありますが、入力層から出力層へと層状に並んでいるので、レイヤー関数と呼びます。

pyTorchで予測モデルを作る
Netというクラスを作成する
pyTorchでは、この仕組みをクラスとして表現します。クラスとは、設計図のことですが、これができれば、予測モデルが完成することになります。簡単なクラスは以下のように示されます。
#予測モデルのクラス定義 隠れ層1つの場合
class Net(nn.Module):
def __init__(self, n_input, n_output):
super().__init__()
self.hidden1 = nn.Linear(n_input, 10) # 1つ目の隠れ層(入力→10)
self.activation = nn.ReLU() # ReLU活性化関数(共通で使う)
self.output = nn.Linear(10, n_output) # 出力層(10→出力)
def forward(self, x):
x = self.hidden1(x)
x = self.activation(x)
x = self.output(x)
return x
クラスの名前はNetにしています。また、nn.Moduleという親のクラスがあります。属性として指定するのは線形関数の入力数と出力数(nn.Linear(入力数、出力数))、隠れ層でどの活性化関数を使うか(この場合はnn.ReLU)だけです。隠れ層が2つの場合は、線形関数をもう一つ加えることになります。
forwardメソッドについて
メソッドとしては、nn.Moduleのメソッドであるforwardを使います。forward
メソッドはユーザーが定義するもので、model(X)と描けば自動的に計算されます。まず、入力層から隠れ層にxが渡されます。そのxをReLU関数に適用します(self.activation(x))、さらに、隠れ層から出力層へとxが渡されます。それぞれの関数に次々と受け渡すような記述されており、順伝播を表します。
nn.Moduleが重要
クラスの名前はNetですが、親クラスのnn.Moduleの設計図を受け継いでいるので、nn.Moduleの属性やメソッドが使えます。親クラスの属性やメソッドを受け継ぐためのコマンドが、super().__init__()です。
super().__init__()
nn.Moduleは、深層学習を行うためのモデル構造やパラメータを一元管理できる基礎となるクラスです
nn.Moduleの主な属性
以下がnn.Moduleの主要な属性です。実際に使う場面はないですが、さまざまな変数が格納されています。
属性名 | 説明 | 型 |
---|---|---|
_parameters | パラメーターを格納する辞書 |
|
_buffers | 固定値を格納する辞書 | OrderedDict |
_modules | レイヤー関数を格納する辞書 | OrderedDict |
nn.Moduleの主なメソッド
nn.Moduleのメソッド(クラス内の関数)には以下のものがあります。
メソッド名 | 説明 |
---|---|
forward() | 予測値を作成 |
__call__(input) | forward() を呼び出す(model(x) が可能に) |
named_parameters() | 名前付きでパラメータを取得 |
modules() | 全てのサブモジュール(自身含む)を再帰的に取得 |
state_dict() | モデルの状態(パラメータやバッファ)を辞書で取得 |
load_state_dict(state_dict) | state_dict を読み込んでモデルの状態を復元 |
to(device) | 指定したデバイス(CPU/GPU)に移動 |
cuda() | GPU に移動 |
nn.Moduleの主な子クラス
nn.Moduleの下にはさまざまなクラスが定義されています。上のプログラムでは、nn.Linearとnn.ReLUを使っています。
カテゴリ | 主なクラス |
---|---|
線形層(全結合) | nn.Linear, nn.Bilinear |
畳み込み層(CNN系) | nn.Conv1d, nn.Conv2d, nn.Conv3d, nn.ConvTranspose2d |
再帰層(RNN系) | nn.RNN, nn.LSTM, nn.GRU |
正則化層 | nn.Dropout, nn.BatchNorm1d, nn.LayerNorm, nn.GroupNorm |
活性化関数 | nn.ReLU, nn.Sigmoid, nn.Tanh, nn.Softmax, nn.LeakyReLU |
プーリング層 | nn.MaxPool2d, nn.AvgPool2d, nn.AdaptiveAvgPool2d |
損失関数 | nn.MSELoss, nn.CrossEntropyLoss, nn.BCELoss, nn.NLLLoss, nn.L1Loss |
構造補助系 | nn.Sequential, nn.ModuleList, nn.ModuleDict |
