0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pytorchを使った線形回帰をGoogle Colaboratoryで実装してみる

Posted at

初心者向けです!ディープラーニングの基礎的な知識があることを前提としています。
機械学習ライブラリのPytorchを用いて線形回帰を実装してみます。
簡単なので機械学習の入門として最適です。
##Pytorchとは?
Facebookの人工知能研究グループにより初期開発された 、Python向けのオープンソース機械学習ライブラリです。読み方はパイトーチです。

Deep Learningライブラリの中でも近年人気が出てきています。非常に簡単に記述できるのでおすすめです。
##Google Colaboratoryとは?
Googleが提供している、無料で使用できるpython実行環境です。

GPUも使用でき機械学習に必要なライブラリもあらかじめインストールされています。ローカルで機械学習の環境を構築するのは大変なので、今回はGoogle Colaboratoryを使用していこうと思います。

使い方は下記参照。1分程で使えるようになります。
https://qiita.com/shoji9x9/items/0ff0f6f603df18d631ab
##線形回帰を実装してみる
必要なライブラリをインストールします。

import torch
from torch import nn
import matplotlib.pyplot as plt
import numpy as np

ランダムな分布モデルを作成してプロットしてみましょう。
この図に対して線形回帰します。

x = torch.randn(100, 1) * 10
y = x + torch.randn(100, 1) * 3
plt.plot(x.numpy(), y.numpy(), "o")
plt.ylabel("y")
plt.xlabel("x")

実行してみたら下記の図が出力されたと思います。
pytorch-liniear-regression01.png

線形回帰のモデルを定義します。nn.Moduleを継承し、__init__内でインプットとアプトプットのサイズを指定したモデルを定義しています。

class LR(nn.Module):
  def __init__(self, input_size, output_size):
    super().__init__()
    self.linear = nn.Linear(input_size, output_size)
  def forward(self, x):
    pred = self.linear(x)
    return pred

乱数のseedを固定します。線形回帰のモデルのインスタンスを作成します。

torch.manual_seed(1)
model = LR(1, 1)

モデルのパラメーターを取り出す関数を定義。

[w, b] = model.parameters()
def get_params():
  return (w[0][0].item(), b[0].item())

プロットする関数を定義。モデルからパラメータを取り出してy1を定義しています。

def plot_fit(title):
  plt_title = title
  w1, b1 = get_params()
  x1 = np.array([-30, 30])
  y1 = w1*x1 + b1
  plt.plot(x1, y1, "r")
  plt.scatter(x, y)
  plt.show()

学習前の図をプロットしてみましょう。学習前なので赤い線がずれているのがわかります。

plot_fit("initial Model")

pytorch-liniear-regression02.png

それでは学習する前準備です。
損失関数は二乗平均誤差、学習方法は確率的勾配降下法に定義します。learning rateは0.01にしてます。

criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)

それでは学習してみましょう!エポックは100にしてます。lossを記録しておきます。

epochs = 100
losses = []
for i in range(epochs):
  y_pred = model.forward(x)
  loss = criterion(y_pred, y)
  print("epoch:", i, "loss:", loss.item())
  
  losses.append(loss)
  optimizer.zero_grad()
  loss.backward()
  optimizer.step()

学習経過を見てみましょう。

plt.plot(range(epochs), losses)
plt.ylabel("Loss")
plt.xlabel("epoch")

pytorch-liniear-regression03.png

学習できているのがわかると思います。
学習後の図をプロットしてみましょう。

plot_fit("Trained Model")

pytorch-liniear-regression04.png

ちゃんと学習できているのがわかると思います。

以上です。お疲れ様でした!

pytorchを使用して線形回帰を学習してみました。Pytorchと Google Colaboratory を使えばかなり簡単に機械学習を体験できるので、ぜひみなさんも試してみてください!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?