スポンサードリンク



こんにちは。sinyです。

最近Pytorchを学習し始めましたが、四苦八苦しております・・・

基本知識をまとめて効率よく学習するためにpytorchでよく使う基本知識のまとめ記事を作成しました。

継続してアップデートしていきます。

 

Linear 層

■nn.Linear 線形結合を計算するクラス

  • nn.Linear(入力サイズ,出力サイズ)
    例nn.Linear(64, 32)

    net = nn.Linear(in_features=3, out_features=1, bias=False)

損失関数

■nn.MSELoss 損失関数を計算するクラス
■optimizer = optim.SGD(net.parameters(), lr=0.1)

torch.nn.Module

すべてのニューラルネットワークモジュールの基本クラス。
モデルもこのクラスをサブクラス化する必要がある。

モジュールには他のモジュールを含めることもできる。
これにより、モジュールをツリー構造にネストできる。
サブモジュールを通常の属性として割り当てることもできる。

サンプルコード

 

add_module(name, module)

nn.Moduleクラスのメソッドで、現在のモジュールに子モジュールを追加するメソッド。
モジュールは、指定された名前を使用して属性としてアクセスできる。

class Module(object)内にadd_moduleメソッドが定義されている。

パラメータは以下の2つ。

  • name(string)
    子モジュールの名前。 子モジュールは、指定された名前を使用してこのモジュールからアクセスできる。
  • module(Module)
    モジュールに追加される子モジュール。

学習モードと推論モード

pytorchには学習モードと推論モードがある。

  • 学習モード:まず学習時にはmodel.train()を実行て学習モードにする(デフォルト)
  • 推論時にはmodel.eval()を実行して、推論モードに切り替える。
    ※DropoutレイヤとBNレイヤをevaluationモードにするために必要。

Conv2D層

 

torch.nn.Conv2d(インプット,アウトプット,カーネルサイズ,ストライド,パディング)
  ※設定例:COnv2d(256, 512, kernel_size=2, stride=2, padding=1)
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

画像処理の注意点

PytorchとPillowでは画像要素の順番が異なる。

  • pytorch:(チャネル、高さ、幅)の順
  • pillow:(高さ、幅、チャネル)の順

pytorchで生成されたテンソルをpillowで扱うには順番を変える必要がある。
→numpy().transpose((軸の順番を指定))
 例:numpy().transpose((1, 2, 0))
      ※チャネル、高さ、幅 →高さ、幅、チャンネルに入れ替える。

np.clip() は,区間の最大値大きい入力はその最大値に,逆に最小値より小さい入力はその最小値にする関数。

 ちなみにOpenCVで画像を読み込んだ場合は[高さ][幅][色BGR]の順番でデータが読み込まれるので注意。

Pytorchのネットワークに画像を入力する際の注意点

データをミニバッチの形にする必要があるので、unsqueeze_(0)を使って入力データにミニバッチの次元を追加する必要がある。

torch.Size([3, 224, 224])  → torch.Size([1, 3, 224, 224])

DatasetとDataLoader

Pytorchには特徴量XとラベルYをまとめたコンテナがあり、TensorDatasetという。
これは、Datasetを承継したクラス。

TensorDatasetにはTensorの見渡すことができる。
TensorDatasetをDataLoaderに渡すと、ループ処理で一部のデータだけを受け取ることができる。

 

前処理系

torchvision

 

Transforms:画像でよく使われる前処理は用意してくれています。

— Compose:復数のTransformのリスト化
— Scale:大きさ変更
— CenterCrop:真ん中でクロッピング
— RandomCrop:ランダムにクロッピング
— RandomHorizontalFlip:ある確率でFlip
— Normalize:正規化
— ToTensor:PIL.ImageやnumpyをTensor化

Dropout

ドロップアウトの適用。

  • nn.Dropout(0.5)

BatchNormalization

バッチ正規化の適用。

  • nn.BatchNorm1d(k)

    BatchNorm2d(num_featureseps=1e-05momentum=0.1affine=Truetrack_running_stats=True)

  • num_features:
    input  size (N, C, H, W)のから予測されるCの値
  • momentum: 
    running_meanおよびrunning_varの計算に使用される値。 累積移動平均(つまり、単純平均)の場合、なしに設定できます。 デフォルト:0.1

torch.nn.Sequential(*args)

モジュールは、コンストラクターに渡された順序で追加されます。
あるいは、モジュールの順序付き辞書も渡すことができます。

サンプルコード

ちなみに、nn.Sequentialを承継すると、自動的にforwardメソッドが実装されるので改めてforwardを定義する必要がない。
(順伝搬を自動的に時やってくれる)

nn.Embedding

テキストデータのトークン化。

Embeddingの第1引数は、トークンの種類、第2引数がトークン化後の次元数を指定。
以下の例では、1万種類の単語で、10次元にベクトル化している例。

 

※padding_idxを指定することで、そのIDはすべて0のベクトルになる。

 

max関数

torchのMax関数の利用。
tensorデータ中のMAX値を返してくれる。

 

 

ImageFolder

 

訓練、テストデータのフォルダ構成例

 

ImageFolderを使うと、自動でクラス分けとラベル付けがされる。

フォルダ名をクラス名、各クラスにINDEXを割り当ててくれる。

 

save_imageメソッド

 

save_image(tensorfilenamenrow=8padding=2normalize=Falserange=Nonescale_each=Falsepad_value=0)

パラメータ
  • tensor・・・4次元のミニバッチTensor:形状 (B x C x H x W) 
                       ※複数指定できるがすべて同一の形状でないとだめ。
          ※例:torch.Size([4, 3, 128, 128])
  • filename・・・保存するファイル名
  • nrow・・・グリッドの各行に表示される画像の数
          ※最終グリッドサイズは(B / nrow、nrow)
          ※デフォルトは8
  • padding ・・・パディング数(デフォルトは2)

y1,y2,y3の形状がすべてtorch.Size([4, 3, 128, 128])とすると、以下のコードで4x4の画像ファイル(sample.jpg)が生成される。

 

 

おすすめの記事