ユーザ用ツール

サイト用ツール


deep-neural-network

DNN

Google Colab上で実行したサンプルコードです。 多層パーセプトロンで回帰問題を解きます。 データセットは単純な数式に基づくものを、ランダム生成しています。 ここの複雑度をいじることで、DNNの表現力を測ることを目的にしています。

import torch.nn.functional as F
import torch
import random
from torch.utils.data import DataLoader
 
# 独自のデータセットクラス
class MyDataset(torch.utils.data.Dataset):
    def __init__(self, param_a_list, param_b_list, param_c_list, ans_list):
        self._param_a = param_a_list
        self._param_b = param_b_list
        self._param_c = param_c_list
        self._ans = ans_list
 
    def __len__(self):
        return len(self._ans)
 
    def __getitem__(self, idx):
        input_tensor = torch.FloatTensor([self._param_a[idx], self._param_b[idx], self._param_c[idx]])
        ans_tensor = torch.FloatTensor([self._ans[idx]])
        return input_tensor, ans_tensor
 
# DNNモデル(多層パーセプトロン)
class MLPR(torch.nn.Module):
    def __init__(self, n_input, n_hidden, n_output):
        super(MLPR, self).__init__()
        self.l1 = torch.nn.Linear(n_input, n_hidden)
        self.l2 = torch.nn.Linear(n_hidden, n_hidden)
        self.l3 = torch.nn.Linear(n_hidden, n_output)
 
    def forward(self, x):
        h1 = self.l1(x)
        h2 = torch.relu(h1)
        h3 = self.l2(h2)
        h4 = torch.relu(h3)
        h5 = self.l3(h4)
        return h5
 
# 学習データを作る
param_a_list = []
param_b_list = []
param_c_list = []
ans_list = []
 
for i in range(0, 2000):
    prm_a = random.random()
    prm_b = random.random()
    prm_c = random.random()
 
    # ここから学習させたいロジック部分
    ans = prm_a * 5 + prm_b / 4 - prm_c * 2
    if ans > 0.5:
      ans = ans * 2
    # ここまで
 
    param_a_list.append(prm_a)
    param_b_list.append(prm_b)
    param_c_list.append(prm_c)
    ans_list.append(ans)
 
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
print('using device:', device)
 
myds = MyDataset(param_a_list, param_b_list, param_c_list, ans_list)
train_loader = DataLoader(myds, batch_size=100, shuffle=True)
 
# 入力は3、出力は1
model = MLPR(3, 500, 1)
# 回帰問題なのでとりあえずMSELossを損失関数に使う
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
 
model.to(device)
criterion.to(device)
 
# 学習プロセス
# 学習が進みに応じた損失関数の変化を見る。検証プロセスは無し。
from torch.autograd import Variable
loss_history = []
for epoch in range(2000):
    total_loss = 0
    for x_train, y_train in train_loader:
        # Variableは微分機能内包
        x_train = Variable(x_train)
        y_train = Variable(y_train)
        optimizer.zero_grad()
        x_train = x_train.to(device)
        y_train = y_train.to(device)
        y_pred = model(x_train)
        loss = criterion(y_pred, y_train)
        loss.backward()
        optimizer.step()
        total_loss += loss.item()
    loss_history.append(total_loss)
    if (epoch +1) % 100 == 0:
        print(epoch + 1, total_loss)
deep-neural-network.txt · 最終更新: 2025/06/15 09:15 by 116.91.79.112

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki