ryuiso2のブログ

ryuiso2のブログ

自分用のメモです。

pytorch でハマりやすいポイント

f:id:ryuiso2:20200113014149p:plain
title

pytorch (pytorch=1.1.0)

基本的にはレファレンスを参照するが、躓きやすいところを中心にメモを残す。

GPUの使用

  • ソースコード中に明示的にGPU用変数に設定する必要がある。

  • モデル、変数、計算に関わるものすべてを .to(device) しなければならない。

  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()