2019年12月 技術メモ
微分対象のパラメータをnn.Parameterで宣言するのを忘れて、見事にモデルに保存されていない#PyTorchあるある
— Teppei Kurita (@kuritateppei) 2020年1月1日
たまにJupyter Notebookが、ずっとRunしているように見せて、実は何も受け付けてないゾンビ状態になることがある。各notebookのせいではなくjupyter側に原因がありそうという所まではわかったけど、現状解決方法はPCの再起動のみ。
— Teppei Kurita (@kuritateppei) 2019年12月31日
c++でeval欲しいな。。あった…、けど中身w
— Teppei Kurita (@kuritateppei) 2019年12月31日
C++ で eval() - 偏見プログラマの語り! https://t.co/m3iiwel41q
PyTorch標準のLoss(nn.MSELoss等)はデフォルトではminibatch全体の平均か総和を返すよう実装されている。もし各batchの要素のlossを取り出したいならoptionのreduceをFalseにする#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月31日
PyTorchのDataloderでのShuffle=Trueの挙動は各EpochでLoader中のデータセットを全シャッフルして、batchsizeの幅で取り出す#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月30日
PyTorchでGPUにある微分対象のbatch Aをまとめてtensorからlistに変換する際は、まずcpuに持ってきて勾配情報ひきはがしてnumpyに変換してflattenで1次元化してリストに変換するので
— Teppei Kurita (@kuritateppei) 2019年12月30日
A.cpu().detach().numpy().flatten().tolist()
となる#Qiitaに書くまでもないメモ
累積和って今までaccumとか名前つけてたけどcumsumなんかかわいくてよいですね。今度からこうしよう
— Teppei Kurita (@kuritateppei) 2019年12月30日
累積和はnp.cumsum()、かんたん!#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月30日
どっちもよく使うのに今まで全く気にならなかった。相変わらずの思考停止。
— Teppei Kurita (@kuritateppei) 2019年12月29日
linspaceは仕様がきっちりしているのでグラフ書くとき用、arrangeはrangeのnumpy版みたいになんとなく覚えとこう。
numpy arange と linspaceの違い https://t.co/Q6sQUxcMU1
ありがたや。
— Teppei Kurita (@kuritateppei) 2019年12月29日
Jupyter Notebookを動的に使ってみる https://t.co/A9frvoIueC #Qiita
挨拶とばかりに何事にもtorch.をつけ忘れる#PyTorchあるある
— Teppei Kurita (@kuritateppei) 2019年12月29日
PyTorchでforward中にパラメータをいじると怒られる、当たり前か…#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月28日
一周回ってPhongやBlinnPhongの素直な挙動に愛着が湧いてくる#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月28日
PyTorchのforwardで累乗演算x**aをするとき(2回目)、aの絶対値がある程度大きくなると結果が大きくなりすぎてその後の処理(backward等)で下手るので、aの値をある程度制限する必要がある(aがパラメータの場合)#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月27日
PyTorchでランダムにtrain/testを分離するときはhttps://t.co/crpmGC1ix0.random_splitが楽
— Teppei Kurita (@kuritateppei) 2019年12月27日
train_dataset, val_dataset = https://t.co/crpmGC1ix0.random_split(trainval_dataset, [train_size, val_size])#Qiitaに書くまでもないメモ
torch.repeatとnumpy.repeatは挙動が違うので注意です。numpy.repeatのような動作をしたい場合はtorch.repeat_interleaveってのがあって大体等価です。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月27日
正反射ベクトルRがいらない子になりがち#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月27日
(1977年のBlinn-Phongの時点ですでに)
PyTorchで別ファイルとかでtensor作るときcudaいないよって怒られる…そんなときはtorch.zeros_like()が便利。何かしらgpu情報持ってるtensorがあればそれをもとに新しいtensor加工して作ったほうがすっきり書ける場合がある。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月27日
次元数合わないよって場合(ほとんどそうかも)はrepeatとかで増やすと良いです
— Teppei Kurita (@kuritateppei) 2019年12月27日
tensorの初期化方法の1つnn.init。結構使い勝手は良いけど忘れがちなのでメモ。
— Teppei Kurita (@kuritateppei) 2019年12月26日
w = torch.empty(3, 5)
nn.init.constant_(w, 0.3)#Qiitaに書くまでもないメモ
角度をつけて物を見た時にはじめてフレネル項Fくんの実力に気づく。全然いらない子じゃなかったんや!#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
Wikipediaのページのやる気のなさがすごいhttps://t.co/JxjNdyGwye#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
BRDFの親にあたるBSSRDFの日本語表記のラスボス感がすごいhttps://t.co/kOPmRwclTe#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
これ微分いけるかな?あーやっぱ無理でした!微分可能か否かを雰囲気で感じる時代。#誤差逆伝搬
— Teppei Kurita (@kuritateppei) 2019年12月26日
リスト内包でtensor内の処理をしようとして怒られる#PyTorchあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
ハーフベクトル正規化忘れがち#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
スペキュラアルベド、お前もうグレーでいいよ#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
ランバート反射が1760年に考案されたことにビビる#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
放射強度、放射輝度、放射束、入射する放射輝度、出射する放射輝度…
— Teppei Kurita (@kuritateppei) 2019年12月26日
キーーーーーーー!#BRDFあるある
Phongをポング、BlinnPhongをブリンポングって呼んじゃう#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
GGXのポテンシャルの高さ#BRDFあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
心折れてbatchsize=1前提に処理を書こうとする#PyTorchあるある
— Teppei Kurita (@kuritateppei) 2019年12月26日
torch.tensor(n,m)
— Teppei Kurita (@kuritateppei) 2019年12月26日
無事0で初期化されてると思い込む#PyTorchあるある
x = tensor.zeros(1)
— Teppei Kurita (@kuritateppei) 2019年12月25日
NameError: name 'tensor' is not defined
100回くらいやってる#PyTorchあるある
torch.repeatとexpandの違い。repeatは新しいメモリに割り当てていて、expandは元のメモリを参照している。
— Teppei Kurita (@kuritateppei) 2019年12月24日
生成したtensorを操作するならrepeat、以降constならメモリ節約できるexpand推奨と。
バグ埋め込みやすそうな所なのでそれぞれのtensor達の生きざまを意識しよう。https://t.co/deBfO4G7XY
リスト内包のflatten、初見殺しすぎないですか?
— Teppei Kurita (@kuritateppei) 2019年12月24日
init=[[1,2,3],[4,5],[6,7]]
[inner for outer in init for inner in outer]
# [1, 2, 3, 4, 5, 6, 7]#Qiitaに書くまでもないメモ
半分くらい読んでたけど2年くらいPython初心者です。多分永遠に初心者です。はやくPythonプロになりたい。
— Teppei Kurita (@kuritateppei) 2019年12月24日
Pythonを学ぶときに読むべき本2020年版 - 初心者からプロになるために https://t.co/ZhGDMcJ0Qj
パラメータなのにbatchsize入れてtensor作っちゃう#PyTorchあるある
— Teppei Kurita (@kuritateppei) 2019年12月24日
PyTorchわからないことググって調べたことが結局公式ドキュメントに書いてあったってことに3回連続遭遇して超反省。100回読みます…https://t.co/04LZn8K9Zy
— Teppei Kurita (@kuritateppei) 2019年12月23日
PyTorchのforwardで累乗演算x**aをするとき、xが0の場合nanが返りその後の処理(backward等)で下手る。xを0にならないよう保証しておくか、あまりやりたくないけどclamp(x, min=0.001)**a等のアドホックな対応もある。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月22日
ネットワークに対するインプットの種類がいくつかあるとき、
— Teppei Kurita (@kuritateppei) 2019年12月22日
(最初のころ)
データの段階でスクリーニング
↓
(PyTorch理解した)
DataLoaderでちゃんと前処理
↓
(今)
全部突っ込んでNetworkに取捨選択演算含め全部任せる
色々やったけど結果怠惰になりました。
Jyputerの数式記述の際に、下記のように数式間に行をあけると、
— Teppei Kurita (@kuritateppei) 2019年12月21日
$数式1$
(1行以上)
$数式2$
github上では謎仕様で数式2しか表示されなくなる(Jupyter上ではOK)。なので、Githubに上げる場合は行をあけないか、適当な文字(2byte空白等)を入れると良い。#Qiitaに書くまでもないメモ
でもtorch.nn.DataParallel(net)で並列化すると重みを取りに行くときに怒られるんだよな。引数でデバイスID指定しても同じ、なんなら1つか指定しなくてっも。うーむ。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月21日
Tensor同士の内積をとるとき、dotでそのままやるとbatch分が下手るので、(N*H).sum(0)とすると良い。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月20日
BRDFの補間ですが、基本バイリニア(線形補間)で十分です。
— Teppei Kurita (@kuritateppei) 2019年12月20日
画像処理ではバイキュービック等の三次式を使いサンプル点を多くして補間(推測)精度を上げるのがデファクトとなっていますが、BRDFの補間ではやらなくてもさほど問題はありません。理由はいくつかあるのですが。。[つづく]
BRDF補間が基本バイリニアで良い理由
— Teppei Kurita (@kuritateppei) 2019年12月20日
1) DataドリブンのBRDFを使う場合データの素性を見たいことが多く、3次式だといらない推測値が入る
2) そういう推論はパラメトリックなBRDFモデルの役目
3) 非ユークリッドなので、補間に正当性が無くなる
4) 計算量とメモリの増加
とかです(訂正ご指摘ください)
PyTorchのDatasetクラスではlen(Dataset)がデータ数を返すように実装されてて、それを継承して各自で__len__で定義するようになっているため、__len__の返り値をint型以外にしてはいけない。リストとかダメ。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月20日
機械学習の説明可能性(解釈性)という迷宮 - 渋谷駅前で働くデータサイエンティストのブログ https://t.co/oKW7KRDyoc
— Teppei Kurita (@kuritateppei) 2019年12月20日
例えばこの図はサンプル数が4x4x4という等方BRDFとしては非常に疎なデータからレンダリングしたものですが、補間をすることでそれなりの材質に見えることがわかります、BRDFの補間は大切です。ちなみに赤っぽい金属です。#基本だけどあまり公知化されていないことをドヤる活動 pic.twitter.com/hwjU1aCzbB
— Teppei Kurita (@kuritateppei) 2019年12月20日
テーブル型の非等方BRDFをサンプリングする際は4次元の補間(例えばバイリニア)が必要になります。実装は簡単ですが、図にするのが難しいです。
— Teppei Kurita (@kuritateppei) 2019年12月19日
VSCodeでGLSLの自分定義の拡張子(たとえば.mybrdf)をSyntax Highlightさせたいときはsettings.jsonで関連付けさせれば良い。
— Teppei Kurita (@kuritateppei) 2019年12月16日
"files.associations": {"*.mybrdf": "glsl"}#Qiitaに書くまでもないメモ
PyTorchのTensorをtorch.tensor(val)で初期化するときはvalはfloatでなければならない。intだとそのval分のサイズのfloat tensorが作られてしまう(とてもやりがち)。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月14日
listの中にarrayで3chの色情報持ってた時、色に合わせてプロットする。
— Teppei Kurita (@kuritateppei) 2019年12月13日
cidx = ['r', 'g', 'b']
for c in range(3):
plt.plot([s[c] for s in list], color = cidx[c])
ダサいな…。#Qiitaに書くまでもないメモ
空の2次元配列を作る
— Teppei Kurita (@kuritateppei) 2019年12月13日
[[] for _ in range(n)]#Qiitaに書くまでもないメモ
PyTorchでtensor型はtensor.numpy()で取得できるが、勾配情報を持っている場合はそれを引きはがす必要があるtensor.detach().numpy()でOK。GPUにある場合は更にその前に.cpu()する。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月13日
PyTorchで値制限等パラメータに制約をつけたい時はmodel.state_dict()で取得した後にtorch.clamp等で値を変更し、model.load_state_dict(state_dict)で書き込む。これを重み更新毎に行えば、パラメータをある一定値内で制限できる。壁が出来てそれ以上進まないイメージ。#Qiitaに書くまでもないメモ
— Teppei Kurita (@kuritateppei) 2019年12月12日
BRDFのFresnel項のSchlick近似ってVと何の内積だっけ?法線?ハーフベクトル?と自分の資料みても疑心暗鬼になっていろいろ論文とか調べたら、結局Qiitaで素晴らしい記事を見つけた。ああ…モデルによって変わるのですね。。https://t.co/44L8V7iTzw
— Teppei Kurita (@kuritateppei) 2019年12月12日
Open3Dって0.8になってAPI構成がドラスティックに変わって下位互換をぶったぎったんですが、
— Teppei Kurita (@kuritateppei) 2019年12月11日
バージョニングについて改めて調べてみた。https://t.co/eNaC3GV3k1
なるほど、メジャーバージョン0だと仕様もなにもないから何しても良いのか。Mitsuba rendererとかも永遠に0のままMitsuba2出ますね。
Variable Inspectorとても便利。
— Teppei Kurita (@kuritateppei) 2019年12月10日
Sourcetrail改めてちゃんと使ってますが、クラスや関数の依存関係の矢印クリックすると関連する該当コードが全部表示されるの滅茶苦茶便利ですね、VSコードとの連携もパーフェクト。これが無料とは凄い時代…まさに民主化。
— Teppei Kurita (@kuritateppei) 2019年12月10日
話題のSourcetrail便利ですね。Jupyter Notebookもいけるかと思ったがインポート拡張子にipynb追加しても静的解析なされず残念。https://t.co/t7VabCi47O
— Teppei Kurita (@kuritateppei) 2019年12月10日
これでpyに変換すればOK。
「PyTorchによる発展ディープラーニング」が良書だったので、PyTorchでわからないものに当たったらとりあえず著者のgithubのレポジトリ検索してる。本に解説ない場合はコアなところなんだなと分類できて、ググるか公式見る。ありがたいです。https://t.co/9izqNtsbOy
— Teppei Kurita (@kuritateppei) 2019年12月9日
graphviz使うにはpipの他にバイナリ落としとかないとダメなんですね。
— Teppei Kurita (@kuritateppei) 2019年12月8日
楽しそう。さっそくチュートリアルやったらpipでエラー出ました。Googleなので基本TensorFlowですか。 https://t.co/aUR35rhVse
— Teppei Kurita (@kuritateppei) 2019年12月7日
数年前からipynbで技術ノート作っているのですが、諸々の事情でパワポ等を使うことが多く、数式のエクスポートに苦労しています。
— Teppei Kurita (@kuritateppei) 2019年12月7日
スクショ人力でやる以外にJupyter notebookの数式を簡単に画像で保存できる方法ないかなあ。。 pic.twitter.com/H58df6WR4H
かっこよくするというよりも、複数のサーバでJupyter立てて作業しているので、自分が今作業しているのはどのサーバかを一目で感覚的に区別するために使っている。便利。
— Teppei Kurita (@kuritateppei) 2019年12月6日
「Jupyter Notebookの背景色やフォントをかっこよく変更する」https://t.co/qhPj0szb6e
anacondaとpipが競合して破壊されるのを数回繰り返してconda系恐怖症になった人は多そう。GCPで一時的な検証用のVM作った時にサクッと環境構築するのに使うのは便利なんですが。
— Teppei Kurita (@kuritateppei) 2019年12月6日
Windows PowerShell、標準だから一時的に使うこと多いんだけど、悪魔的配色すぎるのでスタイルを変更する方法を見つけた(非公式かい!)
— Teppei Kurita (@kuritateppei) 2019年12月6日
https://t.co/g4zY32RxEE
Python3.8系でJupyter notebookの不具合問題放置されてるから仕方なくアドホックな下記の対応をした(pre3.9でもダメでした)https://t.co/ehPpc2rkXF
— Teppei Kurita (@kuritateppei) 2019年12月5日
おぢさんなのでapt-get思考停止して使っていました。。
— Teppei Kurita (@kuritateppei) 2019年12月5日
apt-getは、もう古い。aptを使いなさい。 - 4ensiX https://t.co/UuJAMakTbo
Google Compute Engine 上のファイルを Visual Studio Code で編集する方法 - https://t.co/uFVRrU6UZV
— Teppei Kurita (@kuritateppei) 2019年12月5日
ありがたや。。
— Teppei Kurita (@kuritateppei) 2019年12月5日
Running Jupyter Notebook on Google Cloud Platform in 15 min https://t.co/wxpmHdaPeG
SSHのターミナル用にAndale Monoっていうフォント良さげ
— Teppei Kurita (@kuritateppei) 2019年12月5日