pytorch でハマりやすいポイント
pytorch (pytorch=1.1.0)
基本的にはレファレンスを参照するが、躓きやすいところを中心にメモを残す。
GPUの使用
device = 'cuda' CNN().to(device) # 以下のように書くと便利 import torch device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
- 正しくGPUが使用できているかの確認は
nvidia-smi -l
でGPUの使用率を確認する。
Parameter の作成
Parameter とは、学習によって調整する学習パラメータのことである。
括弧 () の順番が大切で[dim1, dim2] のサイズのパラメータを作成する際は、以下のように書く。
import torch.nn as nn nn.Parameter(torch.Tensor(dim1, dim2).to(device))
tensor shape の確認
- tensorの型を確認、取り出すには .size()を用いる
print(torch_tensor.size()) # タプル型を表示
cross-entropy loss (classification)
- cross-entropy loss を用いる際、教師信号で与えるラベルは微分可能でかつ、long型でなければならない
from torch.autograd import Variable y = Variavble(y).long().to(device) # Variavble()で微分可能に、long()でキャスト
DataLoader
DataLoader とは、pytorch で学習する際にデータをミニバッチサイズに応じて取り出すイテレーターである。
一度TensorDataset を作成する必要がある。
from torch.utils.data import TensorDataset, DataLoader ## 学習前の準備 ds = TensorDataset(x, y) # TensorDataset の作成 loader = DataLoader(ds, batch_size=BATCH_SIZE, shuffle=True) # DataLoaderの作成 ## 学習時 for itr, (x, y) in enumerate(loader): # x, yを使って学習させる。
モデルの評価 (GPUメモリの節約)
pytorchでは計算履歴を変数が保存するので、すぐにGPUメモリを枯渇させてしまう。
計算履歴を保存する必要のない評価時には、保存しない設定で計算すべき。
with torch.no_grad(): の中で実行すればよい。
with torch.no_grad(): model_forward() # ここに必要な処理を書く。
torch 変数の取り出し
- そのままでも値を取り出すことはできるが、計算履歴を含まない値を取り出すにはitem() を使う
torch_tensor_value = torch_tensor.item()
- また、GPU変数をnumpyに取り出す際には、.cpu().detach().numpy()として取り出す。
numpy_array = gpu_tensor.cpu().detach().numpy()