Last active
March 1, 2019 13:05
-
-
Save tasugim/cfd415d565d75d01c29e1d75b5e310c9 to your computer and use it in GitHub Desktop.
『Software Design 2019 年 3 月号』の第1特集「IT エンジニアのための機械学習と微分積分入門」、第4章「微分でつなぐ、機械学習とニューラルネットワーク」のサンプルコードを写経したスクリプトです。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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