Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」

2,284 views

Published on

データのパターンマッチと並行分散処理が強いElixirと、Python/Kerasによる機械学習を組み合わせると、ビッグデータ分析の強力なフレームを作れる、という内容です

Published in: Engineering

【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」

  1. 1. Elixir入門 第7回 Python/KerasをElixirから 繋いでアレコレする ~ 数値演算・ML+データ変換・並行分散=… ~ 2017/10/25 ver0.5作成
  2. 2. 1 1. 数値演算・ML+データ変換・並行分散=… 2. Pythonを使えるようにする 3. Elixirを使えるようにする 4. ElixirからPythonを呼び出す 5. Kerasを使えるようにする 6. ElixirからKerasを呼び出す 7. Elixir分散データ処理→Keras ML 目次
  3. 3. 2 1.統計・ML+データ変換・並行分散=…
  4. 4. 3 1.数値演算・ML+データ変換・並行分散=… ご存知とは思いますが、Pythonは、豊富なライブラリによる数値 演算、自動処理、理工学、統計・解析に強みがある言語です 最近は、TensorFlowやKeras、Chainerといった、機械学習 のベースプラットフォームとして、一躍有名になりました 一方、Elixirは、様々なデータのパターンマッチ (バイナリデータも 含む) が強力、かつ並行分散処理が得意で、データ加工・変換 をマルチプロセスで同時に実行する部分に強みをもった言語です この2つを組み合わせることで、ビッグデータの分析や機械学習を 並行分散処理する、といった構築が可能となります なお両言語は、スリムで凝縮された言語仕様により、「可読性」 と「高信頼性」、「高機能」を実現するといった共通点もあります
  5. 5. 4 2.Pythonを使えるようにする
  6. 6. 5 2.Pythonを使えるようにする GUI環境 (Windows/Mac/Linux) がある場合、Python 環境の構築に「Anaconda」を使うと、Pythonパッケージのイン ストールが簡単にでき、複数Python環境の使い分けもできます
  7. 7. 6 2.Pythonを使えるようにする ターミナルを起動します
  8. 8. 7 2.Pythonを使えるようにする PythonコマンドでREPLが起動することを確認します exit()と打てば、Pythonを抜けて、ターミナルに戻ります もしエラーが出たときは、前ページをやり直してください LinuxやMacであれば、以下のように、pip単体をapt/yum /BrewでインストールしてからPythonを入れることも可能です # python >>> >>> exit() # # apt-get install pip # pip install python
  9. 9. 8 2.Pythonを使えるようにする Pythonのサンプルとして、ノイズ入りsin波のグラフ表示をします 以下で起動します import numpy as np def sin( x, T = 100 ): return np.sin( 2.0 * np.pi * x / T ) def noisy_sin( T = 100, ampl = 0.05 ): x = np.arange( 0, 2 * T + 1 ) noise = ampl * np.random.uniform( low = - 1.0, high = 1.0, size = len( x ) ) return sin( x ) + noise def plot(): f = noisy_sin() plt.figure() plt.plot( range( 0, len( f ) ), f, color = "b", label = "sin" ) plt.legend() plt.show() py_sample.py # pip install matplotlib # python predict_sin.py
  10. 10. 9 2.Pythonを使えるようにする こんな感じのグラフが表示されるのを確認します
  11. 11. 10 3.Elixirを使えるようにする
  12. 12. 11 3.Elixirを使えるようにする インストーラ (Macの場合はBrew) でインストールした後、iexと いうElixirのREPLを起動します Ctrl+cを2回入力すると、iexを抜けて、ターミナルに戻ります # iex Interactive Elixir (1.5.2) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> iex(1)> BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution #
  13. 13. 12 4.ElixirからPythonを呼び出す
  14. 14. 13 4.ElixirからPythonを呼び出す Anacondaから起動したターミナルで、Elixir PJを作成します ※紫字の部分は、作成するプロジェクト名 (全部、小文字で打つこと) 以下のようなフォルダ/ファイルが作られます プログラミングするソースコードは、libフォルダ配下に作ります # mix new pyex # cd pyex # pwd; find . | sort | sed '1d;s/^.//;s//([^/]*)$/|--1/;s//[^/|]*/| /g' /code/pyex |--_build |--config |--deps |--lib |--mix.exs |--README.md |--test mixはビルドツール ※Railsのbundler+rake的なもの
  15. 15. 14 4.ElixirからPythonを呼び出す Elixir/Erlangから、Pythonを呼び出すためのライブラリである 「ErlPort」をインストールするため、mix.exsに下記追加します 以下コマンドで、Elixirモジュールを取得します (要ネット接続) 以下コマンドで、Pythonモジュールをインストールします defmodule Pyex.Mixfile do … defp deps do [ { :erlport, "~> 0.9.8" }, ] end end # mix deps.get # pip install erlport mix.exs
  16. 16. 15 4.ElixirからPythonを呼び出す lib/pyex.exを、お好きなエディタで以下の通り、書き換えます ファイル保存したら、以下コマンドでビルドします defmodule Pyex do def plot_sin_noisy() do { :ok, py_exec } = :python.start( [ python_path: 'lib' ] ) :python.call( py_exec, :py_sample, :plot, [] ) end end # iex –S mix iex> Pyex.plot_sin_noisy lib/pyex.ex Pythonファイル名を指定 Python関数名を指定
  17. 17. 16 4.ElixirからPythonを呼び出す ElixirからのPython呼出でもグラフが表示できるのを確認します
  18. 18. 17 4.ElixirからPythonを呼び出す 単純に起動するだけで無く、値の受け渡しもできます Elixirから渡した値を、Python側で計算し、Elixirに戻せます lib/pyex.ex # recompile # iex –S mix iex> Pyex.value_send_receive Pyex.value_send_receive( 3 ) received from python: 30 defmodule Pyex do … def value_receive( value ) do { :ok, py_exec } = :python.start( [ python_path: 'lib' ] ) result = :python.call( py_exec, :py_sample, :value_receive, [ value ] ) IO.puts "received from python: #{result}" end end … def value_receive( value ): return value * 10 py_sample.py
  19. 19. 18 4.ElixirからPythonを呼び出す クラスを呼び出すこともできます lib/pyex.ex defmodule Pyex do … def value_receive( value ) do { :ok, py_exec } = :python.start( [ python_path: 'lib' ] ) result = :python.call( py_exec, :py_sample, :Sample, [] ) result = :python.call( py_exec, :py_sample, :"Sample.arrange", [ object, value ] ) IO.puts "received from python: #{result}" end end … def class Sample( object ): def __init__( self ): print( " on python: __init__()" ) self.message = "Hello " def arrange( self, name ): print( " on python: arrange()" ) return self.message + name.decode( "utf-8" ) py_sample.py Elixirから渡した文字列は、 Pythonだと、bytes型で解釈 されるので、str型に変換する クラスのインスタンスを生成 メソッド名をクラス名と共に指定 インスタンスを 第1引数に指定 引数を第2引数 以降に指定
  20. 20. 19 4.ElixirからPythonを呼び出す Elixirから渡した値を、Python側で計算し、Elixirに戻せます # recompile # iex –S mix iex> Pyex.value_send_receive Pyex.value_send_receive( 3 ) received from python: 30
  21. 21. 20 5.Kerasを使えるようにする
  22. 22. 21 5.Kerasを使えるようにする Kerasは、TensorFlowをコアとして動作するラッパーライブラリで、 本来、数学を用いて、ニューラルネットワークやディープラーニング を構築する必要があるところの大部分を代行してくれます Kerasを使わず、TensorFlowそのままでコーディングした場合、 「学習」部分を数式に相当するコードで書くこととなります※が、 Kerasを使った場合は、数式を一切使わずとも、「学習」部分が コーディングできるのが、最大の特徴です https://keras.io/ja/
  23. 23. 22 5.Kerasを使えるようにする Anacondaから起動したターミナルで、Kerasをpipによりインス トールします PythonコマンドでREPLが起動し、Kerasがエラー無くimport できれば、インストールは成功です もしエラーが出たときは、前ページをやり直してください # python >>> import keras Using TensorFlow backend. >>> # pip install keras
  24. 24. 23 5.Kerasを使えるようにする RNN (Recurrent Neural Network) という、時系列に特化 した学習モデルで「未来のデータ並びの予測」ができます たとえば、単語の並びから、発言した人の感情が、どんな状態に なっているかを推測する、といったような先読み分析に向いてます
  25. 25. 24 5.Kerasを使えるようにする ノイズ入りサイン波を予測するKerasコードをPythonで組みます predict_sin.py import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation from keras.layers.recurrent import LSTM from keras.optimizers import Adam from keras.callbacks import EarlyStopping def sin( x, T = 100 ): return np.sin( 2.0 * np.pi * x / T ) def noisy_sin( T = 100, ampl = 0.05 ): x = np.arange( 0, 2 * T + 1 ) noise = ampl * np.random.uniform( low = - 1.0, high = 1.0, size = len( x ) ) return sin( x ) + noise def make_dataset( datas, n_prev = 100 ): data = [] target = [] maxlen = 25 for i in range( len( datas ) - maxlen ): data.append( datas[ i: i + maxlen ] ) target.append( datas[ i + maxlen ] ) re_data = np.array( data ).reshape( len( data ), maxlen, 1 ) re_target = np.array( target ).reshape( len( data ), 1 ) return re_data, re_target …
  26. 26. 25 5.Kerasを使えるようにする (続き) 学習モデルを構築し、学習させます … def predict(): f = noisy_sin() g, h = make_dataset( f ) length_of_sequence = x.shape[ 1 ] in_out_neurons = 1 n_hidden = 300 model = Sequential() model.add( LSTM( n_hidden, batch_input_shape = ( None, length_of_sequence, in_out_neurons ), return_sequences = False ) ) model.add( Dense( in_out_neurons ) ) model.add( Activation( "linear" ) ) optimizer = Adam( lr = 0.001 ) model.compile( loss = "mean_squared_error", optimizer = optimizer ) early_stopping = EarlyStopping( monitor = "val_loss", mode = "min", patience = 20 ) model.fit( x, y, batch_size = 300, epochs = 100, validation_split = 0.1, callbacks = [ early_stopping ] ) future_test = g[ 175 ].T time_length = future_test.shape[ 1 ] future_result = np.empty( ( 0 ) ) … predict_sin.py
  27. 27. 26 5.Kerasを使えるようにする (続き) 学習モデルで未来データを予測し、グラフ表示します … for step2 in range( 400 ): test_data = np.reshape( future_test, ( 1, time_length, 1 ) ) batch_predict = model.predict( test_data ) future_test = np.delete( future_test, 0 ) future_test = np.append( future_test, batch_predict ) future_result = np.append( future_result, batch_predict ) predicted = model.predict( x ) plt.figure() plt.plot( range( 0, len( f ) ), f, color = "b", label = "sin" ) plt.plot( range( 25, len( predicted ) + 25 ), predicted, color = "r", label = "predict" ) plt.plot( range( len( f ), len( future_result ) + len( f ) ), future_result, color = "g", label = "future" ) plt.legend() plt.show() predict() predict_sin.py
  28. 28. 27 5.Kerasを使えるようにする 予測した未来データは、緑のグラフで、元データ (青) のsin波を 再現しています なお、学習時データ (赤) を見ると、元データと比べ、若干振幅 が縮んで学習しているため、未来データも徐々に縮んでいます (ノイズがランダムに出ている影響)
  29. 29. 28 6.ElixirからKerasを呼び出す
  30. 30. 29 6.ElixirからKerasを呼び出す Kerasを使うPythonも当然呼び出せます ファイル保存したら、以下コマンドでビルドします defmodule Pyex do def predict() do { :ok, py_exec } = :python.start( [ python_path: 'lib' ] ) :python.call( py_exec, :predict_sin, :predict, [] ) end end # iex –S mix iex> Pyex.predict lib/pyex.ex
  31. 31. 30 6.ElixirからKerasを呼び出す Python単独と同様、sin波の予測が行われます
  32. 32. 31 7.Elixir分散データ処理→Keras ML
  33. 33. 32 7.Elixir分散データ処理→Keras ML ここまでを組み合わせることで、Elixirから分析元データを渡し、 Kerasで機械学習による予測ができることがお分かりと思います ただし、元データは、常にキレイとは限りません そこで、Elixirのパターンマッチをフル活用し、データ加工・変換を 施した (≒前処理) 上で、クリーン化されたデータでKerasに渡し、 機械学習を行い、それをElixirに戻して、予測結果を更に加工・ 変換し (≒後処理)、アプリケーションで利用する、という枠組み を考えます 弊社は、国内人口の1/5のデータを持っており、その他の業務 データも多く蓄積しているため、こうしたフレームでのビッグデータ 分析の構築が欠かせません
  34. 34. 33 LT版はここまで(^^)
  35. 35. 34 続きは、12月末開催の fukuoka.ex #4にて
  36. 36. 35 fukuoka.ex #4の開催は、 下記クリックでお知らせきます
  37. 37. 36 fukuoka.exでググってください
  38. 38. 37 株式会社TechJIN CTO when デジタルマーケッター 。 森 正和 = 。 { XPer: 17, KernelHacker: 7 } [ Elixir, ElixirScript, Elm, Keras ] |> 福岡信仰 |> 東京侵攻w my favotite technology & implements. Twitter @piacere_ex Qiita @piacere 私をフォローいただいても 開催タイミング分かります
  39. 39. 38 ご清聴ありがとうございます

×