Python PR

【einops】テンソル演算と画像処理 -NumPy, JAX, PyTorch, TensorFlowに対応した可読性の良いコードを書く-【超入門・超実践】

einopsで画像処理
記事内に商品プロモーションを含む場合があります

こんにちは。

現役エンジニアの”はやぶさ”@Cpp_Learningです。仕事でもプライベートでも機械学習で色々やってます。

今回は可読性の良いテンソル演算を実現できる”einops”を紹介します。

対象読者

本記事で学べる内容は以下の通りです。

本記事で学べること
  • NumPy, JAX, PyTorch, TensorFlowの違いを吸収したTensor演算
  • 可読性の良いTensor演算コードの書き方
  • Tensor演算と画像処理

以下の記事でNumPy, JAX, PyTorch, TensorFlowの違いを吸収できるライブラリ”EagerPy”について紹介しました。

EagerPy
【EagerPy】PyTorch, TensorFlow, JAXの違いを吸収して自動微分するこんにちは。 データサイエンティストの卵 ”ひよこ” です。駆け出しエンジニアの”くるる”です。 ”はやぶさ先生”@...

またTensor演算と画像処理については、以下の記事で説明済みです。

Pytorchで画像処理
Pytorchで画像処理 -Kernel(Sobelフィルタなど)を自作してCNNに組み込む-【超入門・超実践】「Pytorchによる画像処理」の入門から実践まで学べる記事を書きました。具体的にはSobelフィルタ(カーネル)などを自作し、CNNと組み合わせるところまでソースコード付きで解説します。画像処理とディープラーニング両方を学べる記事です。...

本記事は、上記の2記事をミックスしたような内容です。

einopsとは

einopsの魅力はREADMEに埋め込まれた動画と以下の一言に尽きると思います。

Flexible and powerful tensor operations for readable and reliable code. Supports numpy, pytorch, tensorflow, and others.

引用元:einops|GitHub

なので多くを語らず、すぐ実践しましょう。

スポンサーリンク

einopsによるTensor演算 -基礎編-

はじめに einops の基本的な使い方を紹介します。

einopsの基本機能
  • rearrange(再配置)
  • reduce(削除)
  • repeat(繰り返し)

インストール

最初に以下のコマンドで einops をインストールします。

pip install einops

あとはeinopsがサポートしているフレームワークの中から適当なものをインストールします。

本記事のソースコードはGoogle Colabで動作確認しました。複数のフレームワークやライブラリがインストール済みなので、とても便利です。

Import

最初はimportから

toy data

適当なデータ(Tensor)を作成します。

x.shape: (4, 2, 3)

[[[ 1 2 3]
[ 4 5 6]]

[[ 7 8 9]
[10 11 12]]

[[13 14 15]
[16 17 18]]

[[19 20 21]
[22 23 24]]]

このコードでフレームワークが違うだけで、中身が同じTensorを4つ作成できます。

einopsの基本機能 -rearrange(再配置)-

rearrange(再配置)を使えば、「Tensorの軸a, b, cのうち、c, bを入れ替える」などの操作が「’a b c -> a c b`」で実現できます。

つまり、以下のような可読性の良いコードで、rearrangeを実現でき、かつフレームワークの違いも吸収してくれます。

y.shape: (4, 3, 2)

[[[ 1 4]
[ 2 5]
[ 3 6]]

[[ 7 10]
[ 8 11]
[ 9 12]]

[[13 16]
[14 17]
[15 18]]

[[19 22]
[20 23]
[21 24]]]

x.shape: (4, 2, 3) -> y.shape: (4, 3, 2)になっています。

軸の数を操作

以下のように書けば、軸の数も操作できます。

y.shape: (4, 6)
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]]

y.shape: (24,)
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]

einopsの基本機能 -reduce(削除)-

reduce(削除)を使うことで、パラメータの抽出や演算ができます。

[[19 20 21]
[22 23 24]]
[[1 2 3]
[4 5 6]]

rearrangeとreduceを組み合わせたシーケンス処理

以下のようなシーケンス処理もできます。

input -> x1 -> x2 -> output = 21

einopsの基本機能 -repeat(繰り返し)-

repeat(繰り返し)を使えば、コピーしたパラメータを増やした軸に再配置できます。

[[[1 4]
[2 5]
[3 6]]

[[1 4]
[2 5]
[3 6]]

[[1 4]
[2 5]
[3 6]]]

以上までの内容が基本編です。

einopsによるTensor演算と画像処理 -応用編-

以降からは応用編になります。学べる内容は以下の通りです。

einops応用編
  • Tensor演算と画像処理(PyTorchベース)
  • einopsで深層学習

Import

基本編でimportしたモジュールに加え、応用編では以下のモジュールを追加します。

画像読込み

まずは以下のコードで画像を読み込みます。

einopsで画像処理

本サイトのサンプル画像といえば、フクロウの”くるる”ちゃん”@kururu_owl です。

くるる
くるる
今回もYOLO(よろ~)

描画関数

Pytorchで画像処理の記事でも紹介した「画像(tensor)を描画する関数」を作成します。

rearrangeで軸の入れ替え

Pytorchで画像処理の記事では、torchvision.transforms で軸の入れ替えをしましたが、今回は einops を使います。

transformsによる画像処理(前処理)はとても簡単ですが…

くるる
くるる
簡単過ぎて何やってるか分からない…

と感じているフクロウがいるかも(?)einopsを使えば、どんな操作(h w c -> c h w で軸の入れ変え)をしたのかが、とても分かり易いです。

縦と横を入れ替え

画像の縦と横を入れ替えるコードは以下の通りです(c h w -> c w h)。

einopsで画像処理

グレースケール化

RGBの3chを1chにすれば、グレースケール化ができます。3ch -> 1ch の方法は色々ありますが、例えば各成分の平均をとる場合は、以下のコードで実現できます。

einopsで画像処理

‘mean’の部分を’max’や’min’に変えるだけで、色んなのグレースケール化を実現できます。

einopsで画像処理

einopsで画像処理

‘max’だと暗い、’min’だと明るいなら、これらの平均をとるのが良さそうですね。

einopsで画像処理

max-pooling

深層学習でよく使う処理も einops で書くことができます。例えば max-pooling は以下のコードで実現できます。

einopsで画像処理

flattening(全結合)

c, h, wの3次元データを1次元に変換する処理も書けます。

※CNN -> NN に全結合するための処理

チャンネル数や画像サイズが分かっていれば、可逆処理(元に戻すこと)もできます。

以上までの内容が『Tensor演算と画像処理 -応用編-』です。

einopsによるTensor演算と深層学習 -応用編-

最後に『Tensor演算と深層学習 -応用編-』を説明しますが、既に材料は揃っています。

einops には各深層学習フレームワーク用のAPIが存在します(下記コード参照)。

これらを活用すれば、どの深層学習フレームワークを使っても、ほとんど同じコードでニューラルネットワークを設計できます。

CNN設計

今回は einops × PyTorch で、簡単なCNNを組んでみます。

上記のコードをちょこっと修正。

ResNet

最後にResNetを紹介しておきます。

他にも色んな例があるので、einopsの公式サイトをチェックして下さいね。

まとめ

長文読解お疲れさまでした。少しマニアックな内容でしたが…楽しかったですか?参考になりましたか?

本記事がTensor・画像処理・深層学習の理解に少しでも役立ったなら、とても嬉しく思います。

はやぶさ
はやぶさ
現役エンジニアの”はやぶさ”@Cpp_Learningは頑張っている人を応援します。

最後に”おまけ”も書いたので、読んで頂けると嬉しいです。

スポンサーリンク

おまけ -本ブログのサポートについて-

もし本記事が参考になり、ブログ『はやぶさの技術ノート』をサポートしたいという人がいれば、以下の方法でサポートして頂けると嬉しいです!

本ブログのサポート方法
  • 本ブログの記事をSNS(Twitterやfacebookなど)でシェア
  • ブログをやっている人ならリンクを張ってシェア
  • 本ブログで紹介した本などを購入
  •  LINEスタンプ 購入
  • 【くるるの野望ショップ】でフクロウグッズ購入

私のプロフィールにも書いていますが、学生さんや勉強したい人の”学び”を支援したいと考えています。

ブログ『はやぶさの技術ノート』では本記事も含め、多くのチュートリアル記事を無料で公開しています。自由に活用して良いので、SNSなどで友達にも教えてあげてほしいです!

また応援メッセージなどを頂けると、次も良い記事書きたいな!というモチベーションに繋がります。Twitterなどで気軽にコメントして頂けると嬉しいです。

くるる
くるる
よろしくお願いします。
はやぶさ
はやぶさ
よろしくお願いします。

PICK UP BOOKS

  • 数理モデル入門
    数理モデル
  • Jetoson Nano 超入門
    Jetoson Nano
  • 図解速習DEEP LEARNING
    DEEP LEARNING
  • Pythonによる因果分析
    Python