深層学習のモデルを作成した後、どのようにして係数を作り、予測をしていくかを説明します。
経済統計の使い方では、統計データの入手法から分析法まで解説しています。
基本構造
基本的な流れは以下の通りです。
- モデルによる推定
- 損失の計算
- 係数の修正(学習)
- 学習したモデルによる予測
- 予測値と実績値の出力
データ
データは以下のものを想定しています。
| 目標値 | 説明変数 | 損失 | |
| 学習用 | outputs_train | inputs_train | loss_train |
| テスト用 | outputs_test | outputs_test | loss_test |
| 繰り返し計算の各回の値 | loss_log |
モデル名などの前提
モデルのクラスはNetで、モデルのクラスを事前に定義しておく必要があります。この設計図をもとに実際にデータを使って動かすモデルはnetになります。
損失関数はnn.MSELoss()で、平均二乗誤差です。
オプティマイザーはSGD(確率的勾配降下法)を使い、学習率は0.001としています。
繰り返し回数は10000回です。
モデルによる推定
# 学習ループ
for epoch in range(num_epochs):
net.train()
optimizer.zero_grad()
outputs_train = net(inputs_train)
loss = criterion(outputs_train, labels_train)
loss.backward()
optimizer.step()
train_loss = loss.item()for文で繰り返すことを宣言しています。繰り返す回数はnum_epochsで与えられ、この変数には10000が代入されています。
net.train()は訓練モードを有効にし、モデルにDropoutやBatchNormが含まれていれば、それらが訓練時の挙動をするようになります。Dropoutは過学習を防ぐ機能で、BatchNormは中間層の出力を正規化します。
optimizer.zero_grad()で、係数の勾配を初期化しています。
outputs_train=net(inputs_train)で、予測値を作っています。
loss = criterion(outputs_train, labels_train):作った予測値と実績値から、損失を計算します。criterion = nn.MSELoss()と事前に定義しています。
loss.backward():逆伝播法で係数を修正することを表します。
optimizer.step():勾配の修正をします。optimizer = optim.SGD(net.parameters(), lr=lr)と事前に定義しています。SGD法で計算することを表します。
train_loss = loss.item():損失を記録します。
評価モード
モデルの学習後に、検証データ(テストデータ)を用いて、予測精度を評価します。
with torch.no_grad():テストでは、モデルの係数を変更する必要がないので、勾配の計算をしないようにします。
# テストフェーズ(評価モード)
net.eval()
with torch.no_grad():
outputs_test = net(inputs_test)
loss_test = criterion(outputs_test, labels_test)
val_loss = loss_test.item()すべてのプログラム
# モデル定義
net = Net(n_input, n_output)
# 損失関数とオプティマイザ
criterion = nn.MSELoss()
lr = 0.001
optimizer = optim.SGD(net.parameters(), lr=lr)
# 学習パラメータ
num_epochs = 10000
# ログ格納用リスト
loss_log = []
# 学習ループ
for epoch in range(num_epochs):
net.train()
optimizer.zero_grad()
outputs_train = net(inputs_train)
loss = criterion(outputs_train, labels_train)
loss.backward()
optimizer.step()
train_loss = loss.item()
# テストフェーズ(評価モード)
net.eval()
with torch.no_grad():
outputs_test = net(inputs_test)
loss_test = criterion(outputs_test, labels_test)
val_loss = loss_test.item()
# ログ保存
item = np.array([epoch, train_loss, val_loss])
loss_log.append(item)
# NumPy配列に変換(オプション)
loss_log = np.array(loss_log)
# 予測結果の取得(あとで可視化に使える)
labels_np = labels_test.detach().cpu().numpy()
outputs_np = outputs_test.detach().cpu().numpy()
