経済統計の使い方
統計初心者向けに、データや分析手法の解説をしています。「まとめページ」をご覧くだされば、全体的な内容がわかると思います。
python

【python】深層学習の計算手順(学習と検証)(Pytorch)

深層学習の計算手順を説明

深層学習のモデルを作成した後、どのようにして係数を作り、予測をしていくかを説明します。

経済統計の使い方では、統計データの入手法から分析法まで解説しています。

【python】pythonのまとめ 経済統計の使い方では、統計データの入手法から分析法まで解説しています。 https://officekaisuiyoku.com...

基本構造

基本的な流れは以下の通りです。

  • モデルによる推定
  • 損失の計算
  • 係数の修正(学習)
  • 学習したモデルによる予測
  • 予測値と実績値の出力

データ

データは以下のものを想定しています。

目標値説明変数損失
学習用outputs_traininputs_trainloss_train
テスト用outputs_testoutputs_testloss_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()は訓練モードを有効にし、モデルにDropoutBatchNormが含まれていれば、それらが訓練時の挙動をするようになります。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()

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA