1. 環境は、Window 10 Home (64bit) 上で行った。
2. Anaconda3 (64bit) – Spyder上で、動作確認を行った。
3. python の バージョンは、python 3.6.5 である。
4. pytorch の バージョンは、pytorch 0.4.1 である。
5. GPU は, NVIDIA社 の GeForce GTX 1050 である。
6. CPU は, Intel社 の Core(TM) i7-7700HQ である。
今回確認した内容は、現場で使える! PyTorch開発入門 深層学習モデルの作成とアプリケーションへの実装 (AI & TECHNOLOGY) の 3.3.1 Dropoutによる正則化(P.052 – P.055) である。
Dropoutによる正則化について書かれていたので, 少し動作確認を行った.
※プログラムの詳細は、書籍を参考(P.052 – P.055)にして下さい。
■Dropout無し.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# -*- coding: utf-8 -*- # 1. library import. from __future__ import print_function import torch from torch import nn, optim import matplotlib.pyplot as plt from sklearn.datasets import load_digits from torch.utils.data import TensorDataset, DataLoader from sklearn.model_selection import train_test_split import time # 2. build a network. start = time.time() l = 100 net = nn.Sequential( nn.Linear(64, l), nn.ReLU(), nn.Linear(l, l), nn.ReLU(), nn.Linear(l, l), nn.ReLU(), nn.Linear(l, l), nn.ReLU(), nn.Linear(l, 10) ) ~(略)~ # 9. display graph. plt.title('not Regularization') plt.plot(train_losses, label='train') plt.plot(test_losses, label='test') plt.legend(loc='upper right') # 10. classify digits data. end = time.time() print('--------------------------------------------------') print('Elapsed Time: ' + str(end - start) + "[sec]") |
■実行結果(Dropout無し).
■Dropout有り.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# -*- coding: utf-8 -*- # 1. library import. from __future__ import print_function import torch from torch import nn, optim import matplotlib.pyplot as plt from sklearn.datasets import load_digits from torch.utils.data import TensorDataset, DataLoader from sklearn.model_selection import train_test_split import time # 2. build a network. start = time.time() l = 100 r = 0.5 net = nn.Sequential( nn.Linear(64, l), nn.ReLU(), nn.Dropout(r), nn.Linear(l, l), nn.ReLU(), nn.Dropout(r), nn.Linear(l, l), nn.ReLU(), nn.Dropout(r), nn.Linear(l, l), nn.ReLU(), nn.Dropout(r), nn.Linear(l, 10) ) ~(略)~ # 9. display graph. t = 'Regularization (r=' + str(r) + ')' plt.title(t) plt.plot(train_losses, label='train') plt.plot(test_losses, label='test') plt.legend(loc='upper right') # 10. classify digits data. end = time.time() print('--------------------------------------------------') print('Elapsed Time: ' + str(end - start) + "[sec]") |
■実行結果①(Dropout有り, r = 0.3).
■実行結果②(Dropout有り, r = 0.5 ※書籍と同じ).
■実行結果③(Dropout有り, r = 0.7).
■以上の実行結果から, 以下のことが分かった.
① Dropout を 設定しないと, 過学習が発生していることが分かった.
② Dropout を 設定すると, 過学習を抑制できる分かった.
③ Dropout に 設定する r の値を変えると, 表示されるグラフも大きく変わってくることが分かった.
■参考書籍
現場で使える! PyTorch開発入門 深層学習モデルの作成とアプリケーションへの実装 (AI & TECHNOLOGY)