こしあん
2018-11-06

Kerasのバックエンドで「○○以上☓☓以下」を計算する方法

Pocket
LINEで送る
Delicious にシェア

1.6k{icon} {views}



Kerasのバックエンド関数を使ったときに「○○以上☓☓以下」を求めたい場合があります。しかし、KerasではAndのような論理演算をすると少し困ることがあります。その方法を解説します。

10×10の行列

0~99の数字を並べた「10×10」の行列を用意します。TensorFlowのテンソルで定義します。

import numpy as np
import keras.backend as K

X = K.variable(np.arange(100).reshape(10,10))
print(K.eval(X))

このとおり。

[[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]
 [10. 11. 12. 13. 14. 15. 16. 17. 18. 19.]
 [20. 21. 22. 23. 24. 25. 26. 27. 28. 29.]
 [30. 31. 32. 33. 34. 35. 36. 37. 38. 39.]
 [40. 41. 42. 43. 44. 45. 46. 47. 48. 49.]
 [50. 51. 52. 53. 54. 55. 56. 57. 58. 59.]
 [60. 61. 62. 63. 64. 65. 66. 67. 68. 69.]
 [70. 71. 72. 73. 74. 75. 76. 77. 78. 79.]
 [80. 81. 82. 83. 84. 85. 86. 87. 88. 89.]
 [90. 91. 92. 93. 94. 95. 96. 97. 98. 99.]]

「9で割った余りが3以上7以下」なら1、それ以外なら0を出力する

上の行列に対して「9で割った余りが3以上7以下」なら1、それ以外なら0を出力するという操作を適用します。はじめは10で割った余りにしようと思いましたが、それだとインデックスによるスライスで簡単にできてしまいそうなので、9で割った余りにしました。

割り算の余り

まず余りですが、普通のNumpyのように「%」演算子でできます。

print(K.eval(X%9))
[[0. 1. 2. 3. 4. 5. 6. 7. 8. 0.]
 [1. 2. 3. 4. 5. 6. 7. 8. 0. 1.]
 [2. 3. 4. 5. 6. 7. 8. 0. 1. 2.]
 [3. 4. 5. 6. 7. 8. 0. 1. 2. 3.]
 [4. 5. 6. 7. 8. 0. 1. 2. 3. 4.]
 [5. 6. 7. 8. 0. 1. 2. 3. 4. 5.]
 [6. 7. 8. 0. 1. 2. 3. 4. 5. 6.]
 [7. 8. 0. 1. 2. 3. 4. 5. 6. 7.]
 [8. 0. 1. 2. 3. 4. 5. 6. 7. 8.]
 [0. 1. 2. 3. 4. 5. 6. 7. 8. 0.]]

「○○以上」、「○○以下」という判定

次に「○○以上」という判定ですが、これもK.greater_equalという関数を使うとできます。

X = K.variable(np.arange(100).reshape(10,10))
print(K.eval(K.greater_equal(X%9, 3)))
[[False False False  True  True  True  True  True  True False]
 [False False  True  True  True  True  True  True False False]
 [False  True  True  True  True  True  True False False False]
 [ True  True  True  True  True  True False False False  True]
 [ True  True  True  True  True False False False  True  True]
 [ True  True  True  True False False False  True  True  True]
 [ True  True  True False False False  True  True  True  True]
 [ True  True False False False  True  True  True  True  True]
 [ True False False False  True  True  True  True  True  True]
 [False False False  True  True  True  True  True  True False]]

同じく「○○以下」という判定も、K.less_equalという関数を使うとできます。

X = K.variable(np.arange(100).reshape(10,10))
print(K.eval(K.less_equal(X%9, 7)))
[[ True  True  True  True  True  True  True  True False  True]
 [ True  True  True  True  True  True  True False  True  True]
 [ True  True  True  True  True  True False  True  True  True]
 [ True  True  True  True  True False  True  True  True  True]
 [ True  True  True  True False  True  True  True  True  True]
 [ True  True  True False  True  True  True  True  True  True]
 [ True  True False  True  True  True  True  True  True  True]
 [ True False  True  True  True  True  True  True  True  True]
 [False  True  True  True  True  True  True  True  True False]
 [ True  True  True  True  True  True  True  True False  True]]

ポイントは要素間のAND

次がポイント。「3以上」と「7以下」の判定をどう結合(論理積)を取ればよいでしょうか。ちなみにここではbool型で返ってきているので、掛け算をしようとすると怒られます。

実はあんまり有名になっていませんが、論理演算子もオーバーロードされているようです。なので、「&:AND」「|:OR」で要素間の論理演算ができてしまいます。

X = K.variable(np.arange(100).reshape(10,10))
flag = K.greater_equal(X%9, 3) & K.less_equal(X%9, 7)
print(K.eval(flag))
[[False False False  True  True  True  True  True False False]
 [False False  True  True  True  True  True False False False]
 [False  True  True  True  True  True False False False False]
 [ True  True  True  True  True False False False False  True]
 [ True  True  True  True False False False False  True  True]
 [ True  True  True False False False False  True  True  True]
 [ True  True False False False False  True  True  True  True]
 [ True False False False False  True  True  True  True  True]
 [False False False False  True  True  True  True  True False]
 [False False False  True  True  True  True  True False False]]

これで一通りOKですね。「9で割って3以上7以下のところだけTrue」になっています。

最後にキャスト

今欲しいのはTrue/Falseではなく、0/1という数字なので(このまま例えば数字のXなどの数字のテンソルと掛け算をすると怒られます)、数字にキャストしてあげる必要があります。K.castを使えばいいです。

X = K.variable(np.arange(100).reshape(10,10))
flag = K.cast(K.greater_equal(X%9, 3) & K.less_equal(X%9, 7), "float32")
print(K.eval(flag))
[[0. 0. 0. 1. 1. 1. 1. 1. 0. 0.]
 [0. 0. 1. 1. 1. 1. 1. 0. 0. 0.]
 [0. 1. 1. 1. 1. 1. 0. 0. 0. 0.]
 [1. 1. 1. 1. 1. 0. 0. 0. 0. 1.]
 [1. 1. 1. 1. 0. 0. 0. 0. 1. 1.]
 [1. 1. 1. 0. 0. 0. 0. 1. 1. 1.]
 [1. 1. 0. 0. 0. 0. 1. 1. 1. 1.]
 [1. 0. 0. 0. 0. 1. 1. 1. 1. 1.]
 [0. 0. 0. 0. 1. 1. 1. 1. 1. 0.]
 [0. 0. 0. 1. 1. 1. 1. 1. 0. 0.]]

これで完成しました。

「9で割って3以下」または「9で割って7以上」なら1を返す場合

今度は逆に論理和のケースです。

import numpy as np
import keras.backend as K

X = K.variable(np.arange(100).reshape(10,10))
flag = K.cast(K.less_equal(X%9, 3) | K.greater_equal(X%9, 7), "float32")
print(K.eval(flag))
[[1. 1. 1. 1. 0. 0. 0. 1. 1. 1.]
 [1. 1. 1. 0. 0. 0. 1. 1. 1. 1.]
 [1. 1. 0. 0. 0. 1. 1. 1. 1. 1.]
 [1. 0. 0. 0. 1. 1. 1. 1. 1. 1.]
 [0. 0. 0. 1. 1. 1. 1. 1. 1. 0.]
 [0. 0. 1. 1. 1. 1. 1. 1. 0. 0.]
 [0. 1. 1. 1. 1. 1. 1. 0. 0. 0.]
 [1. 1. 1. 1. 1. 1. 0. 0. 0. 1.]
 [1. 1. 1. 1. 1. 0. 0. 0. 1. 1.]
 [1. 1. 1. 1. 0. 0. 0. 1. 1. 1.]]

同様にOKですね。

まとめ

Kerasで「○○以上」を取りたいときはK.greater_equal、○○以下を取りたいときはK.less_equalを使う。そして、論理演算子のオーバーロードが用意されているので、&や|でAND,ORといった計算をする

以上です。条件分岐で使うことも多いと思います。



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

【新刊】インフィニティNumPy――配列の初期化から、ゲームの戦闘、静止画や動画作成までの221問

「本当の実装力を身につける」ための221本ノック――
機械学習(ML)で避けて通れない数値計算ライブラリ・NumPyを、自在に活用できるようになろう。「できる」ための体系的な理解を目指します。基礎から丁寧に解説し、ディープラーニング(DL)の難しいモデルで遭遇する、NumPyの黒魔術もカバー。初心者から経験者・上級者まで楽しめる一冊です。問題を解き終わったとき、MLやDLなどの発展分野にスムーズに入っていけるでしょう。

本書の大きな特徴として、Pythonの本でありがちな「NumPyとML・DLの結合を外した」点があります。NumPyを理解するのに、MLまで理解するのは負担が大きいです。本書ではあえてこれらの内容を書いていません。行列やテンソルの理解に役立つ「従来の画像処理」をNumPyベースで深く解説・実装していきます。

しかし、問題の多くは、DLの実装で頻出の関数・処理を重点的に取り上げています。経験者なら思わず「あー」となるでしょう。関数丸暗記では自分で実装できません。「覚える関数は最小限、できる内容は無限大」の世界をぜひ体験してみてください。画像編集ソフトの処理をNumPyベースで実装する楽しさがわかるでしょう。※紙の本は電子版の特典つき

モザイク除去から学ぶ 最先端のディープラーニング

「誰もが夢見るモザイク除去」を起点として、機械学習・ディープラーニングの基本をはじめ、GAN(敵対的生成ネットワーク)の基本や発展型、ICCV, CVPR, ECCVといった国際学会の最新論文をカバーしていく本です。
ディープラーニングの研究は発展が目覚ましく、特にGANの発展型は市販の本でほとんどカバーされていない内容です。英語の原著論文を著者がコードに落とし込み、実装を踏まえながら丁寧に解説していきます。
また、本コードは全てTensorFlow2.0(Keras)に対応し、Googleの開発した新しい機械学習向け計算デバイス・TPU(Tensor Processing Unit)をフル活用しています。Google Colaboratoryを用いた環境構築不要の演習問題もあるため、読者自ら手を動かしながら理解を深めていくことができます。

AI、機械学習、ディープラーニングの最新事情、奥深いGANの世界を知りたい方にとってぜひ手にとっていただきたい一冊となっています。持ち運びに便利な電子書籍のDLコードが付属しています。

「おもしろ同人誌バザールオンライン」で紹介されました!(14:03~) https://youtu.be/gaXkTj7T79Y?t=843

まとめURL:https://github.com/koshian2/MosaicDeeplearningBook
A4 全195ページ、カラー12ページ / 2020年3月発行

Shikoan's ML Blog -Vol.1/2-

累計100万PV超の人気ブログが待望の電子化! このブログが電子書籍になって読みやすくなりました!

・1章完結のオムニバス形式
・機械学習の基本からマニアックなネタまで
・どこから読んでもOK
・何巻から読んでもOK

・短いものは2ページ、長いものは20ページ超のものも…
・通勤・通学の短い時間でもすぐ読める!
・読むのに便利な「しおり」機能つき

・全巻はA5サイズでたっぷりの「200ページオーバー」
・1冊にたっぷり30本収録。1本あたり18.3円の圧倒的コストパフォーマンス!
・文庫本感覚でお楽しみください

北海道の駅巡りコーナー

日高本線 車なし全駅巡り

ローカル線や秘境駅、マニアックな駅に興味のある方におすすめ! 2021年に大半区間が廃線になる、北海道の日高本線の全区間・全29駅(苫小牧~様似)を記録した本です。マイカーを使わずに、公共交通機関(バス)と徒歩のみで全駅訪問を行いました。日高本線が延伸する計画のあった、襟裳岬まで様似から足を伸ばしています。代行バスと路線バスの織り成す極限の時刻表ゲームと、絶海の太平洋と馬に囲まれた日高路、日高の隠れたグルメを是非たっぷり堪能してください。A4・フルカラー・192ページのたっぷりのボリュームで、あなたも旅行気分を漫喫できること待ったなし!

見どころ:日高本線被災区間(大狩部、慶能舞川橋梁、清畠~豊郷) / 牧場に囲まれた絵笛駅 / 窓口のあっただるま駅・荻伏駅 / 汐見の戦争遺跡のトーチカ / 新冠温泉、三石温泉 / 襟裳岬

A4 全192ページフルカラー / 2020年11月発行


Pocket
LINEで送る
Delicious にシェア

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です