Skip to content

Instantly share code, notes, and snippets.

@tasugim
Last active March 1, 2019 13:05
Show Gist options
  • Select an option

  • Save tasugim/cfd415d565d75d01c29e1d75b5e310c9 to your computer and use it in GitHub Desktop.

Select an option

Save tasugim/cfd415d565d75d01c29e1d75b5e310c9 to your computer and use it in GitHub Desktop.
『Software Design 2019 年 3 月号』の第1特集「IT エンジニアのための機械学習と微分積分入門」、第4章「微分でつなぐ、機械学習とニューラルネットワーク」のサンプルコードを写経したスクリプトです。
import torch
from torch import nn, optim
from torch.utils.data import TensorDataset, DataLoader
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_error
# データ読み込み、訓練データ/テストデータの分割
housing = fetch_california_housing()
X_train, X_test, y_train, y_test = train_test_split(
housing.data, housing.target)
# データの正規化
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# データをTensor形式へ変換
X = torch.tensor(X_train, dtype=torch.float32)
y = torch.tensor(y_train, dtype=torch.float32)
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=40, shuffle=True)
# 勾配降下法による学習
w = torch.randn(9, requires_grad=True)
eta = 0.01
for epoch in range(10):
for batch_x, batch_y in loader:
x = torch.cat([torch.ones(batch_x.shape[0], 1), batch_x], dim=1)
w.grad = None
y_pred = torch.matmul(x, w)
loss = torch.mean((y_pred - batch_y) ** 2)
loss.backward()
w.data = w.data - eta * w.grad.data
# テストデータで予測値と実測値とのズレを計算
x = torch.cat([torch.ones(X_test.shape[0], 1),
torch.tensor(X_test, dtype=torch.float32)], dim=1)
y_pred = torch.matmul(x, w).detach().numpy()
print(mean_absolute_error(y_test, y_pred))
import torch
from torch import nn, optim
from torch.utils.data import TensorDataset, DataLoader
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_error
# データ読み込み、訓練データ/テストデータの分割
housing = fetch_california_housing()
X_train, X_test, y_train, y_test = train_test_split(
housing.data, housing.target)
# データの正規化
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# データをTensor形式へ変換
X = torch.tensor(X_train, dtype=torch.float32)
y = torch.tensor(y_train, dtype=torch.float32)
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=40, shuffle=True)
# 勾配降下法による学習
model = nn.Linear(in_features=8, out_features=1)
optimizer = optim.SGD(model.parameters(), lr=0.01)
mse = nn.MSELoss()
for epoch in range(10):
for batch_x, batch_y in loader:
optimizer.zero_grad()
y_pred = model(batch_x)
loss = mse(y_pred.view_as(batch_y), batch_y)
loss.backward()
optimizer.step()
# テストデータで予測値と実測値とのズレを計算
x = torch.tensor(X_test, dtype=torch.float32)
y_pred = model(x).detach().numpy()
print(mean_absolute_error(y_test, y_pred))
import torch
from torch import nn, optim
from torch.utils.data import TensorDataset, DataLoader
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_error
# データ読み込み、訓練データ/テストデータの分割
housing = fetch_california_housing()
X_train, X_test, y_train, y_test = train_test_split(
housing.data, housing.target)
# データの正規化
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# データをTensor形式へ変換
X = torch.tensor(X_train, dtype=torch.float32)
y = torch.tensor(y_train, dtype=torch.float32)
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=40, shuffle=True)
# ニューラルネットワークによる学習
model = nn.Sequential(
nn.Linear(8, 10),
nn.ReLU(),
nn.Linear(10, 1)
)
optimizer = optim.SGD(model.parameters(), lr=0.01)
mse = nn.MSELoss()
for epoch in range(10):
for batch_x, batch_y in loader:
optimizer.zero_grad()
y_pred = model(batch_x)
loss = mse(y_pred.view_as(batch_y), batch_y)
loss.backward()
optimizer.step()
# テストデータで予測値と実測値とのズレを計算
x = torch.tensor(X_test, dtype=torch.float32)
y_pred = model(x).detach().numpy()
print(mean_absolute_error(y_test, y_pred))
import torch
from torch import nn, optim
from torch.utils.data import TensorDataset, DataLoader
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_lfw_people
# データの読み込み400サンプルのみ使用
lfw_people = fetch_lfw_people(resize=1, color=True)
lfw_people = lfw_people.images.astype(np.uint8)[:400]
# 画像を縮小してから、元のサイズに戻すことで、低解像度の画像を生成する
inputs = []
for im in lfw_people:
img = Image.fromarray(im)
small = img.resize(img.size[0] // 3, img.size[1] // 3)
low = small.resize((img.size[0], img.size[1]))
inputs.append(np.asarray(low))
inputs = np.asarray(inputs) / 255
outputs = lfw_people / 255
# はじめの10サンプルはテスト用とする
X = torch.tensor(inputs[10:], dtype=torch.float32).transpose(
1, 2).transpose(1, 3)
Y = torch.tensor(outputs[10:], dtype=torch.float32).transpose(
1, 2).transpose(1, 3)
dataset = TensorDataset(X, Y)
loader = DataLoader(dataset, batch_size=32, shuffle=True)
# SRCNNモデル
model = nn.Sequential(nn.Conv2d(3, 64, 9, padding=4), nn.ReLU(), nn.Conv2d(
64, 32, 1), nn.ReLU(), nn.Conv2d(32, 3, 5, padding=2))
# 最適化アルゴリズムにAdamを利用
optimizer = optim.Adam(model.parameters())
mse = nn.MSELoss()
for epoch in range(10):
for batch_x, batch_y in loader:
optimizer.zero_grad()
y_pred = model(batch_x)
loss = mse(y_pred, batch_y)
loss.backward()
optimizer.step()
print(epoch + 1, '/ 10 Loss', loss.item())
# テスト用画像を適用する
X = torch.tensor(inputs[:10], dtype=torch.float32).transpose(
1, 2).transpose(1, 3)
srimg = model(X).transpose(1, 3).transpose(1, 2)
srimg = srimg.detach().numpy().clip(0, 1)
for idx in range(10):
plt.subplot(131).imshow(inputs[idx])
plt.subplot(132).imshow(outputs[idx])
plt.subplot(133).imshow(srimg[idx])
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment