PyTorchチュートリアルメモ(未整理)


人生色々ありますが,数あるライフ・イベントの一つに「PyTorchのチュートリアルをこなすこと」がある人もいると思います.

強く生きましょう…

PyTorchを学ぶにあたって

普段は参考書に頼るのですが,公式のドキュメントに触れた経験が少ないので今回はこれをやろうと思います.60分で終わる人凄い
あと完全にメモとして書く予定なので,ごちゃごちゃしております.
後で再度整理する予定です.

Getting Started

乱数生成
ゼロ行列
onesの行列(名前が分からない)
以下のように和の演算の出力先をoutにて指定することもできる.

result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)

インデックスの引き方はNumpyと同じ

print(x[:, 1])

reshapeは以下の通り

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())

NUMPY BRIDGEについてはスルー

AutoGrad

なんと勾配計算できるらしいです.すごい.
requires_grad=True
とすると計算を追跡可能に.デフォルトはFalseとのこと.
a.requires_grad_(True)
.requires_grad_(~~)にてフラグを変更できる.
out.backward()
の計算でしばし詰む羽目に.よく見たらmeanされていたという…
ヤコビアンを計算してくれます.

Now in this case y is no longer a scalar.

なる文があるが,お前がスカラーだったのいつだよと思っていたところtorch.autogradという関数だとComplete Jacobianを計算できないらしい.backward()を使用せよとのこと.
Complete Jacobianとは一体…?正則とかそういう…?

with torch.no_grad():

を使うと勾配の計算の追跡を切れるらしい.

Neural Networks

autograd使ってnn覚えようぜっていうパートです.

スタンダードなネットワークを考えるので,やりたいこととしては
・ネットワーク定義
・インプットのデータセットの反復
・インプットをネットワークに送る
・ロスの計算
・誤差逆伝播
・重みの更新
です.

初心者すぎてfcってなんやねんと調べていたのですが,全結合のことでした…実装のお勉強になっております…

        self.conv1 = nn.Conv2d(1, 6, 5)

と書いたとき,インプットのイメージチャンネル数が1,アウトプットのイメージチャンネル数が6,5×5のコンボリューションを行うということです.

self.fc1 = nn.Linear(16 * 5 * 5, 120)
と書いたとき,入力数が16*5*5で出力数が120の全結合を行うということです.
autogradなるものを使うと
net.zero_grad()
は勾配の初期化を行うとのこと.

損失関数はMSEloss

最適化手法はtorch.optimから呼び出すとのこと.

Training a classifier

torchvisionというパッケージのお試し
ここでは以下の5ステップを行う
・torchvisionを用いたCIFAR10のデータセットのロード及び正規化
・ネットワークの定義.今回はCNN
・損失関数の定義
・ネットワークの訓練
・テスト

num_wokersとはなんぞやと調べていたところ分かりやすいサイトを見つけました.感謝…
ここも大変参考になりました.得た知識はこの記事には反映されてません

後は前のチュートリアルで説明してある箇所を纏めているだけなのでぼーっと眺める感じです.
CNNの定義損失関数と最適化手法の定義
は大体そのまんまです.
ネットワークの訓練
ではデータのロード(trainloderとは…?となる),勾配を0に初期化,forward,backward,パラメータの最適化を行っている.
まあそうですよね,という感想

後はテストしておしまい.
インプット→net()に放り込む→各ラベルの確率が出てくるのでtorch.maxにて最大となるものを予測結果として採用→正解率を計算
という具合です.
ちなみに正解率は60%前後.リアル…
今回GPU周りはスルーします.