概要 †numpyを使用した重回帰分析 や scikit-learnを使用した重回帰分析、Chainerで重回帰分析をやってみる で実装した賃貸価格の推論と同じ事を PyTorch を使用してやってみる。 目次 †
環境構築 †mkdir sample_pytorch cd sample_pytorch python3 -m venv venv source venv/bin/activate pip3 install torch torchvision pip3 install sklearn 実装 †元々は Chainer の Fork だったらしく、今回実装した内容だと殆どChainerと変わらなかった。(関連: Chainerで重回帰分析をやってみる) sample_pytorch.py import torch
import torch.nn as nn
import numpy as np
from sklearn.preprocessing import StandardScaler
# パラメータ
input_size = 2 # 説明変数の数
output_size = 1 # 推論値の数
alpha = 0.01 # 学習率
epochs = 1000 # 学習回数
# サンプルデータの読み込み
data = np.loadtxt("data/sample_rent1.csv", delimiter=",", skiprows=1)
x_train = data[:, 1:3].astype("float32") # 広さ, 築年数
y_train = data[:, 3:4].astype("float32") # 家賃
# モデル定義
class LinearRegression(nn.Module):
def __init__(self, input_size, output_size):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(input_size, output_size)
def forward(self, x):
out = self.linear(x)
return out
model = LinearRegression(input_size, output_size)
#model = nn.Linear(input_size, output_size)
# 損失関数
loss = nn.MSELoss()
# 最適化関数
optimizer = torch.optim.SGD(model.parameters(), lr=alpha)
# 標準化用
scaler = StandardScaler()
scaler.fit(x_train)
# モデルの訓練
for epoch in range(epochs):
# 標準化
x_train_scaled = scaler.transform(x_train)
# データをテンソルへ変換
inputs = torch.from_numpy(x_train_scaled)
targets = torch.from_numpy(y_train)
# コストを算出
outputs = model(inputs)
cost = loss(outputs, targets)
# 勾配のリセットと勾配の計算
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 100回ごとに誤差表示
if (epoch + 1) % 100 == 0:
print('Epoch [{}], Loss: {:.4f}'.format(epoch + 1, cost.item()))
# 任意の値を推論してみる
x_sample = np.array([[60.0, 10.0], [50.0, 10.0], [40.0, 10.0]])
x_sample_scaled = scaler.transform(x_sample)
inputs = torch.Tensor(x_sample_scaled)
results = model(inputs)
for i in range(results.size()[0]):
print('広さ:{}��, 築年数:{}, 家賃:{:.2f}'.format(x_sample[i,0], x_sample[i,1], results.data[i,0].item()))
# 訓練済みモデルを保存
#torch.save(model.state_dict(), 'sample.pth')
結果 †結果はほぼ Chainerで重回帰分析をやってみる と同じ。 $ python3 sample_pytorch.py Epoch [100], Loss: 1.2303 Epoch [200], Loss: 0.5337 Epoch [300], Loss: 0.5213 Epoch [400], Loss: 0.5211 Epoch [500], Loss: 0.5211 Epoch [600], Loss: 0.5211 Epoch [700], Loss: 0.5211 Epoch [800], Loss: 0.5211 Epoch [900], Loss: 0.5211 Epoch [1000], Loss: 0.5211 広さ:60.0��, 築年数:10.0, 家賃:8.12 広さ:50.0��, 築年数:10.0, 家賃:7.19 広さ:40.0��, 築年数:10.0, 家賃:6.27 |