2020年1月 技術メモ
PyTorchの便利な学習済みモデルたち。https://t.co/GJ442pEvG7
— Teppei Kurita (@kuritateppei) 2020年1月31日
pip install pretrainedmodels#Qiitaに書くまでもないメモ
書きました。
— Teppei Kurita (@kuritateppei) 2020年1月27日
PyTorch1.4での新機能 Schedulerのchainingを試す https://t.co/5B57RZcDS1 #Qiita
あれ、PyTorch1.4でSchedulerのStepLRにバグないこれ?あるEpoch数になると急に値が下がるのだけど
— Teppei Kurita (@kuritateppei) 2020年1月27日
違った。schedulerの学習率をget_lrで取得していたからだった。1.4からはget_last_lr()で取得しなければならないとリリースノートに書いてありました…。
— Teppei Kurita (@kuritateppei) 2020年1月27日
PyTorchのtorch.max()って、max値と同時にindiceも返されるんですね…。indice欲しいときは毎回律義にtorch.argmax()も呼んでいたよ。numpyと違うところはちゃんと覚えとこう…。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月25日
PyTorchのReLuとかのinplaceオプションはTrueにすると追加の出力を割り当てず入力を書き換えるので、わずかにメモリを節約できる#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月24日
PyTorchってオペレータの使い方として、オブジェクト指向型と関数型のどちらも用意されているんですけど、それに関する解説があまりない気がするので時間ができたら書こうと思います。
— Teppei Kurita (@kuritateppei) 2020年1月23日
ていうかPyTorchのRelease Note読んでたらスケジューラのチェーン(異なるスケジューラをepoch毎に次々に実行して、学習率を調整できる)というおもしろ機能が!さっそく試そうhttps://t.co/agdAvSGoFr
— Teppei Kurita (@kuritateppei) 2020年1月22日
New Features→torch.optim
良さげな解説が眠っていた
— Teppei Kurita (@kuritateppei) 2020年1月22日
ProxylessNASをざっくりざっくり理解する https://t.co/qQGz695N5m #Qiita
Pythonで不揃いのリスト入れ子を展開するときは、そのままやるとunpackエラーになるのでその範囲だけ指定する
— Teppei Kurita (@kuritateppei) 2020年1月21日
mlist = ['c', ['a', 1, 2], ['b', 5, 22]]
for a,b,c in mlist[1:]:
print(a,b,c)
# a 1 2
# b 5 22#Qiitaに書くまでもないメモ
PyTorchのtensor周りの初歩的なこと
— Teppei Kurita (@kuritateppei) 2020年1月21日
x = torch.Tensor([2, 3])
print(x)
# tensor([2., 3.])
print(x,data)
# tensor([2., 3.])https://t.co/SqjfnWOSpeもxも一緒#Qiitaに書くまでもないメモ
x = torch.Tensor([2, 3])
— Teppei Kurita (@kuritateppei) 2020年1月21日
print(x[1].item())
# 3.0
item()でスカラーを取り出す
torch.Sizeとか他のやつはそのままスカラー値を取り出せることもある、Tensorは1枚守られてるイメージ
— Teppei Kurita (@kuritateppei) 2020年1月21日
Pythonのdictとlambdaの組み合わせが何かと便利
— Teppei Kurita (@kuritateppei) 2020年1月21日
mdict = {'key': lambda a, b: a+b}
print(mdict['key'](10, 2))
# 12#Qiitaに書くまでもないメモ
PyTorchでtensorをgpu上にのせる時、https://t.co/X5moeO3iqf()か、tensor.cuda()の2つの選択肢があるけど、基本どっちでもよい。好きな方を使う。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月21日
ちなみにhttps://t.co/X5moeO3iqf()はdevice間の移動だけじゃなく、dtypeの変換にも使える記述。…なのでデバイス移動の際はtensor.cuda()使った方が明確なのかもしれない。
— Teppei Kurita (@kuritateppei) 2020年1月21日
PyTorchでlayerをリストで管理したいときはnn.Modulelist(layer)に入れる。普通にlist []に入れると、パラメータの更新が行われない。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月21日
Pythonの関数default引数は最後じゃないとダメ#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月20日
Pythonのモジュール有無はファイル名の接尾.pyの存在有無で判定#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月20日
PyTorchのscheduler.step()をoptimizer.step()の前に行うと、schedulerでの最初の学習率がスキップされてしまう。なので、ちゃんとoptimizerの更新→schedulerの更新は守らないといけない
— Teppei Kurita (@kuritateppei) 2020年1月19日
ちな破ると1.1.0から警告がでるので気づけるはず#Qiitaに書くまでもないメモ
学習率の決め方 -LR range testとCyclical Learning Rate- https://t.co/f7a9fX0Ntz #Qiita
— Teppei Kurita (@kuritateppei) 2020年1月19日
PyTorchのnn.MSELoss等で要素ごとのLossを計算するのにはreduce=Falseにすると前書いたけど、今はこれは非推奨オプションになってて使うと警告がでる。代わりにreduction='none'を使う。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月19日
Jupyter labでpyファイル等のテキストをCtrl+Fで検索できるんですけど、1回検索すると検索バーが消えてしまう。
— Teppei Kurita (@kuritateppei) 2020年1月18日
でもCtrl+Gで次の候補を検索できる。あーーーすっきりした。https://t.co/pHw6pUXOVo#Qiitaに書くまでもないメモ
正規表現も/re/で簡単に検索できるから最強になった
— Teppei Kurita (@kuritateppei) 2020年1月18日
基本思想大分被ってるのでChainerからPyTorchへの移行は結構簡単ですよね
— Teppei Kurita (@kuritateppei) 2020年1月18日
Chainer ⇒ PyTorch移行を試してみた https://t.co/RVBcspx0M2 #Qiita
TensorFlowとPyTorchの比較記事
— Teppei Kurita (@kuritateppei) 2020年1月17日
今のところ本当に一長一短。正直決定要因がない。
逆に言えば何かをきっかけに一気に傾く可能性があるので、常にウォッチしなければ…。
パフォーマンス T>P
使いやすさ P>>T
並列処理 P>T
分散学習 Tのみ
可視化 T>>P
PyTorch vs TensorFlowhttps://t.co/iDhV8oUoMe
数が多い中国とアメリカをPyTorchが抑えているのに対して、Kerasは幅広い国で支持されている。まあライブラリの出自からしてもそうなりますよね。
— Teppei Kurita (@kuritateppei) 2020年1月17日
1か月ごとにNNライブラリの状況をウォッチ。KerasとPyTorchのデットヒートぶりが相変わらず凄い。ちなみにアメリカと中国ではPyTorch有利。欧州はKeras有利な情勢。https://t.co/RjN1kDtGUi pic.twitter.com/wX2oEc6efO
— Teppei Kurita (@kuritateppei) 2020年1月17日
Pythonで画像のdiff取りたいとき、uint8で読み込むと差分を取る際に定義域で死ぬので、ちゃんとnp.float64とかにキャストする。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月12日
PyTorchでロス関数を自分で実装するときは返り値はスカラーじゃないとダメ、絶対#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月12日
Jupyter notebook起動後に、token確認するには下記コマンドで現状のrunning serverの状態が確認できる
— Teppei Kurita (@kuritateppei) 2020年1月11日
jupyter notebook list#Qiitaに書くまでもないメモ
今度試す。
— Teppei Kurita (@kuritateppei) 2020年1月9日
LibTorch(C++版PyTorch)の使用方法 https://t.co/F2V5iLAzIj
とてもわかりやすい。すごい
— Teppei Kurita (@kuritateppei) 2020年1月8日
PyTorchで学ぶGraph Convolutional Networks https://t.co/68jAVehvO3 #Qiita
等方性BRDF座標系光線。論文用に白黒バージョンを追加。入射・出射ベクトルの記号を一般的な表記に変更。ご自由にお使いください。#作成した図 pic.twitter.com/CI24MQq5Xp
— Teppei Kurita (@kuritateppei) 2020年1月7日
英語論文の図のフォントはArialが推奨なのですね
— Teppei Kurita (@kuritateppei) 2020年1月7日
執筆途中とかでlatexのハイパーリンクが煩わしいのでオフにしたいときは、hyperrefパッケージを使って\hypersetup{draft}にすればOK#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月7日
PyTorchである特定のdevice(cuda:2とする)で学習したモデルを読み込むときに、違うCPUやGPU(cuda:0とする)で読み込むと怒られる。
— Teppei Kurita (@kuritateppei) 2020年1月7日
結論としては、torch.load(PATH, map_location=cuda:0))と、モデル読み込み時にマッピングを行えばOK。#Qiitaに書くまでもないメモ
正確には、GPUがその数だけあれば、想定とは違うGPU使って読み込むだけなので、怒られない。deviceがその分なければtorch.cuda.device_count()でそんなにないよって怒られる。訂正します。
— Teppei Kurita (@kuritateppei) 2020年1月7日
とりあえずnumpyが絶対神ってことですね。
— Teppei Kurita (@kuritateppei) 2020年1月6日
delはなるべく使いたくないなあ、ガベコレ回収コードは可読性そんなに悪くないと思っています。 https://t.co/ciPpVXIFz7
Win10からWin+Shift+sで任意の矩形領域のスクリーンショットが取れる#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月6日
PyTorchのcudaの非同期転送オプションは基本On(non_blocking=True)にしておいて良い。特に副作用はないはず。あまり速度向上を実感できたことはないですが…
— Teppei Kurita (@kuritateppei) 2020年1月4日
ちなみに入力のテンソルを非同期にしても、どうせ最初に一律に転送するので意味はない、と思う。#Qiitaに書くまでもないメモ
PyTorchでmodel().to(device)でモデルごとGPU上に飛ばせるが、このとき「nn.Moduleの子メンバだけ」が同じようにGPU上に乗る。なのでNetworkで自分で定義したTensorはdefaultだとCPU上にのったままなので不一致エラーが出る。自分で.to(device)等でGPU上に置く必要あり。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月4日
ちなみに
— Teppei Kurita (@kuritateppei) 2020年1月4日
torch.set_default_tensor_type(torch.cuda.FloatTensor)
のように、tensorのdefalutをGPUにしてしまう方法もあるが、環境が変わると死ぬのであまりお勧めされていない
torch.cudaに今いるModelのデバイスを返すAPIがなかったので、私はinitにdeviceを渡してしまっていますが、他に方法がある方は教えて頂けれれば幸いです。※torch.cuda.current_device()は現在のメインGPU IDを返すのみ
— Teppei Kurita (@kuritateppei) 2020年1月4日
PyTorchで再現性確保のため乱数シードを固定するときはとりあえず以下をやってtorch, numpy, sysの初期化しておけばOK。
— Teppei Kurita (@kuritateppei) 2020年1月4日
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
np.random.seed(seed)
random.seed(seed)#Qiitaに書くまでもないメモ
ただ公式だとGPUとCPUをそれぞれ初期化するのはあんまおすすめしていないらしい
— Teppei Kurita (@kuritateppei) 2020年1月4日
torch.manual_seed(seed)
これでCPU,GPUともに乱数シードが固定されるのだけど以下のオプションが必要
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
正直この長いオプション書くんだったら
— Teppei Kurita (@kuritateppei) 2020年1月4日
torch.cuda.manual_seed(seed)
の方がすっきりするんだけど…
公式の言うことなので従っておきます
PyTorchでモデル全体を保存するときはhttps://t.co/I64FrTQtGr(model,PATH)、パラメータだけを保存したいときはhttps://t.co/I64FrTQtGr(model.state_dict(), PATH)。前者はパラメータ含むクラス全体、後者は組み込み
— Teppei Kurita (@kuritateppei) 2020年1月4日
Layerおよび自身で宣言したParameterのみ保存される。#Qiitaに書くまでもないメモ
誤差伝搬中に三角関数の定義域を超越してnanる#PyTorchあるある
— Teppei Kurita (@kuritateppei) 2020年1月3日
PyTorchで勾配を計算するパラメータが一つもないときにbackwardをすると、普通に怒られる#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2020年1月3日
誤差逆伝搬でハマったらとりあえず勾配を計算するパラメータ数を限りなく絞って、一つ一つの演算で伝搬を追ってる、というかそれ以外に方法がない
— Teppei Kurita (@kuritateppei) 2020年1月2日
PyTorch catalystどんなもんかいじろ。ちゃっと当たり付けで試すには良さげ。
— Teppei Kurita (@kuritateppei) 2020年1月2日
PyTorch 三国志(Ignite・Catalyst・Lightning) https://t.co/DXNvdjFa2a
今までL1とL2Lossの違い、L1の方が何となく収束安定するなくらいしか実感してなかったけど、特異値がたまにあるデータ扱ったときにそれを無視したいときはL1、それを考慮に入れたいときはL2が良いことを身をもって体験しました(当たり前なんですが)。下手なアドホック処理書くよりロスで対処します。
— Teppei Kurita (@kuritateppei) 2020年1月2日