2020/12/06
torch.nn.init.normal_(tensor, mean=0.0, std=1.0)
- tensor: n次元のTensor型
- mean: 正規分布の平均値
- std: 正規分布の標準偏差
Gans生成の重みの初期化で出てきた。
例
w = torch.empty(2, 5)
nn.init.normal_(w, 0.0, 0.02)
-->
tensor([[-0.0038, -0.0077, -0.0248, 0.0167, -0.0318],
[-0.0232, -0.0192, -0.0027, -0.0211, 0.0047]])
2020/12/07
torch.nn.Sequential(*args: Any)
- *args: 複数の引数をタプルとして受け取る
使うメリットはMaxpooling, Conv等をまとめることができるので、コード量が減る。
例を書くと長いので他のサイトに任せます。
公式: torch.nn.Sequential
torch.nn.ConvTranspose2d
CNNを復習してきたので処理の引数の意味も理解できました
日本語では転置畳み込みで別の言い方でDeconvolutionと言ったりします。
これは元の特徴マップを拡大してから畳み込むようです。
あまりぱっとイメージしにくいかもしれませんので、こちらにわかりやすく画像とアニメーションがついてるので確認してみてください。
- in_channels:入力画像のチャンネル数
- out_channels:畳み込みによって生成されるチャンネル数
- kernel_size:畳み込みのカーネルのサイズ
- stride:畳み込みのストライド(畳み込みの適用間隔のこと)デフォルトは1
- padding:zero_paddingが各次元の両サイドに追加される。デフォルトは0
- output_padding:出力にサイズを追加する(内容がいまいちわからないので調べたら更新します。
多分英語でしか説明されてない気がする...誰か日本語サイト知ってたら教えてください) - groups:入力のチャンネルから出力のチャンネルへのブロックの数
(自分の頭では理解が追いつかないので調べてみたところ、
例えば、入力チャンネルが16で出力も16として、仮にgroups=2と設定すると0~8,8~16の2つに分割して並列畳み込みのように
なるらしい。こちら)[英語] - bias:学習可能なバイアスを出力に追加。デフォルトはTrue
- dilation:カーネル要素同士の間隔。デフォルトは1
12/17
torch.randn(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
- *size: アウトプットのtensorのサイズを決める。リストやタプルでも指定できる
-
- : これはなんだ?w
- out=None:アウトプットのtensor (ここはあまり詳しく調べてません)
- dtype=None:返り値のデータのタイプを指定
- layout=torch.strided:解説できるだけの理解力がなかったのでスルー
- requires_grad=False:自動微分の指定
解説
平均0分散1の正規分布からランダムな値で満たしたTensorを返してくれます
様々なモジュールを試したり、ランダムな値を生成するときにお世話になるので、
各引数について頭に叩き込みます。
一応数式
$out_i \sim N(0,1)$
Nが正規分布のちょっと曲がった感じにならなくて...
z = torch.randn(2)
z
# tensor([-1.0899, -0.8052])
#------------------------
z = torch.randn(2,3) # 2 x 3
z
#tensor([[ 1.5442, 0.6762, 1.5586],
# [-0.1483, 1.0889, -2.7871]])
#-----------------------------------
#4次元にした場合(出力は長いので書きません)
#例:torch.randn(nsamples, nchannels, Height, Width)
z = torch.randn(100,1,28,28) #1チャンネルの28x28の画像を100枚
z
torch.no_grad()
画像認識を勉強中に出てきた。
※このコードは訓練後のモデルの精度を測っている
correct = 0
total = 0
with torch.no_grad(): #<-----ここ
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (
100 * correct / total))
まずはwithこれは開始と終了を必要とする処理の先頭に書くコード
torch.no_grad()はすべてのrequire_gradフラグを一時的にfalseに設定する
このrequire_gradを一時的にFalseにする理由はなんなんでしょうか
まずrequire_gradはなんのフラグなのか。
これは自動微分をTrueとするかFalseとするかのフラグです。
この設定にどんな意味があるのか
Trueにすれば自動で微分をしてくれる当然のメリット
ではFalseにする理由は。
それはメモリ使用量が削除され、計算が高速になる
そもそも、自動微分をする理由(微分をする理由)はモデルが予測値と正解値との誤差を最小化するため
なら、テストデータで性能を見るだけなら、微分の設定は不要
なので、torch.no_grad()を使って無駄なメモリ使用量を削除し、計算を高速化させた。って感じですね。
随時更新
ここから一口メモ集
- Tensor型を微分するにはVariable型にする必要がある
I should’ve mentioned that you can create the transform as transforms.Resize((224, 224)). If you pass a tuple all images will have the same height and width.
随時更新