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.                                       Upcoming SlideShare
Loading in …5
×

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

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

• Full Name
Comment goes here.

Are you sure you want to Yes No
Your message goes here • Login to see the comments

### 【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 １．統計・ML＋データ変換・並行分散＝…
4. 4. 3 １．数値演算・ML＋データ変換・並行分散＝… ご存知とは思いますが、Pythonは、豊富なライブラリによる数値 演算、自動処理、理工学、統計・解析に強みがある言語です 最近は、TensorFlowやKeras、Chainerといった、機械学習 のベースプラットフォームとして、一躍有名になりました 一方、Elixirは、様々なデータのパターンマッチ (バイナリデータも 含む) が強力、かつ並行分散処理が得意で、データ加工・変換 をマルチプロセスで同時に実行する部分に強みをもった言語です この2つを組み合わせることで、ビッグデータの分析や機械学習を 並行分散処理する、といった構築が可能となります なお両言語は、スリムで凝縮された言語仕様により、「可読性」 と「高信頼性」、「高機能」を実現するといった共通点もあります
5. 5. 4 ２．Pythonを使えるようにする
6. 6. 5 ２．Pythonを使えるようにする GUI環境 (Windows／Mac／Linux) がある場合、Python 環境の構築に「Anaconda」を使うと、Pythonパッケージのイン ストールが簡単にでき、複数Python環境の使い分けもできます
7. 7. 6 ２．Pythonを使えるようにする ターミナルを起動します
8. 8. 7 ２．Pythonを使えるようにする PythonコマンドでREPLが起動することを確認します exit()と打てば、Pythonを抜けて、ターミナルに戻ります もしエラーが出たときは、前ページをやり直してください LinuxやMacであれば、以下のように、pip単体をapt／yum ／BrewでインストールしてからPythonを入れることも可能です # python >>> >>> exit() # # apt-get install pip # pip install python
9. 9. 8 ２．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 ２．Pythonを使えるようにする こんな感じのグラフが表示されるのを確認します
11. 11. 10 ３．Elixirを使えるようにする
12. 12. 11 ３．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 ４．ElixirからPythonを呼び出す
14. 14. 13 ４．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 ４．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 ４．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 ４．ElixirからPythonを呼び出す ElixirからのPython呼出でもグラフが表示できるのを確認します
18. 18. 17 ４．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 ４．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 ４．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 ５．Kerasを使えるようにする
22. 22. 21 ５．Kerasを使えるようにする Kerasは、TensorFlowをコアとして動作するラッパーライブラリで、 本来、数学を用いて、ニューラルネットワークやディープラーニング を構築する必要があるところの大部分を代行してくれます Kerasを使わず、TensorFlowそのままでコーディングした場合、 「学習」部分を数式に相当するコードで書くこととなります※が、 Kerasを使った場合は、数式を一切使わずとも、「学習」部分が コーディングできるのが、最大の特徴です https://keras.io/ja/
23. 23. 22 ５．Kerasを使えるようにする Anacondaから起動したターミナルで、Kerasをpipによりインス トールします PythonコマンドでREPLが起動し、Kerasがエラー無くimport できれば、インストールは成功です もしエラーが出たときは、前ページをやり直してください # python >>> import keras Using TensorFlow backend. >>> # pip install keras
24. 24. 23 ５．Kerasを使えるようにする RNN (Recurrent Neural Network) という、時系列に特化 した学習モデルで「未来のデータ並びの予測」ができます たとえば、単語の並びから、発言した人の感情が、どんな状態に なっているかを推測する、といったような先読み分析に向いてます
25. 25. 24 ５．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 ５．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 ５．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 ５．Kerasを使えるようにする 予測した未来データは、緑のグラフで、元データ (青) のsin波を 再現しています なお、学習時データ (赤) を見ると、元データと比べ、若干振幅 が縮んで学習しているため、未来データも徐々に縮んでいます (ノイズがランダムに出ている影響)
29. 29. 28 ６．ElixirからKerasを呼び出す
30. 30. 29 ６．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 ６．ElixirからKerasを呼び出す Python単独と同様、sin波の予測が行われます
32. 32. 31 ７．Elixir分散データ処理→Keras ML
33. 33. 32 ７．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 ご清聴ありがとうございます