LoginSignup
18
8

More than 1 year has passed since last update.

Tensor演算に便利なEinopsとPyTorchのeinsum

Posted at

画像認識向けにTensor演算をする機会が増えてくると、以下が便利

  • Einops: 次元ごとに切ったり貼ったりがパッと出来る
  • einsum: 次元方向にかけたり足したりがパっと出来る

実行速度に関しては、いろいろと言われているモノのの、この便利さは後でサクっと読めるのが良い。そんなわけで、忘れないように、便利機能のおさらいと、有難い解説記事をまとめてみる。

Einops

Einopsの便利さに関しては、上に貼ったオフィシャルサイトにある動画が、一番わかりやすいと思う。
【einops】テンソル演算と画像処理 -NumPy, JAX, PyTorch, TensorFlowに対応した可読性の良いコードを書く-【超入門・超実践】
こちらに、日本語の細かい解説記事あり。

お気に入りは軸をくっつけたり、順番変えたりできるrearrange
Normalizeするために、軸をちょっと入れ替えたり、Batchと何かをくっつけてから、元に戻すとかが簡単。しかも、読みやすい!

図1.png

einsum

アインシュタインの縮約記法なんて、かっこいい名前がついているけれど、ようはTensor計算を簡単にする関数。物理屋さんでないと分かりにくい表記なので、コンピューター屋さんは、for loopで書き直すと分かりやすい。

おススメの解説YouTubeビデオ
Einsum Is All You Need: NumPy, PyTorch and TensorFlow
そして、この頃はやりのAttentionやTransformerをeinsumとEinopsを使ってサクっと書く解説記事がこちら。
Understanding einsum for Deep learning: implement a transformer with multi-head self-attention from scratch

基本的には、こんな感じで書く。
図2.png

入力のTensorの数は任意。ルールは

  1. 入力の同じ文字はelementwiseに掛け合わせる
  2. 出力にない文字は全elementを足し合わせる(出力がない場合は全て足される)
  3. 出力の順番は指定できる(1,2なしで、転置などの軸の入れ替えが出来る)  

行列計算
M = AB
をeinsumで書いてみると

これをfor loopで書き下してみる。
図4.png
こんな感じで、考えるとeinsumも怖くない。
これで、この頃、よく使われているバッチ事の演算も簡単に書ける!

18
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
8