その他
    ホーム技術発信DoRubyRuby×PyCallでTensorflowのMNISTチュートリアル

    Ruby×PyCallでTensorflowのMNISTチュートリアル

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    PyCallを登録RubyからPythonのノを呼べでにできので、TensorflowのOKのチュートリアルであるMNISTデータセットの画像分類を上みました。

    はじめに

    がさまお
    久しいうです、くろすです。新入を名乗せのももてなりなりますが、、今は表3年は新発策でひたすら研究をしてください。


    学生時代座でガリガリ微してMATLABのコードに実してDNN作したのがアホらしくててますます。。ししくちゃ今更感ありますが、RubyからPyCallをててて。

    ルビーでデータサイエンス

    あり前はかかでありでかかかでありがれいたのですがルビーはそれでありをする
    ははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははは
    はを何とかする」
    劣目は「Ruby望のデッキをする」

    巨人の肩の上でるる」並べ方法でルビーから機械学習をやりたいと思います。

    環境

    $ルビー-v
    ruby 2.5.0p0(2017-12-25リビジョン61468)[x86_64-darwin16]
    $宝石リスト| grep pycall
    pycall(1.0.3)
    
    $ python3 -V
    Python 3.6.4
    $ pip3フリーズ| grep tensorflow
    tensorflow == 1.6.0
    

    ルビーのコード

    今回やったチュートリアルはtensorflowのバージョンR1.2のチュートリアルのうちMNISTを使ったやつです。
    https://www.tensorflow.org/versions/r1.2/get_started/mnist/beginners

    tensorflowの失格1.6.0でもちゃんと勢なり。

    必要「pycall 」
    必要「pycall /インポートを」
    
    モジュール Pythonは
      延びPyCall ::インポート
      クラス<<自己
        DEF から(パス、インポート:ゼロ)
          pyfrom path、import:import
           self .send import
         end
    
        def  method_missing(method_name)
          pyimport method_name
          self .send method_name
         end 
      end 
    end
    
    require_relative 'のpython '
    #Pythonのライブラリのインポート
    Pythonの.from(' tensorflow.examples.tutorials.mnist '、輸入::INPUT_DATA)
    tf = Python .tensorflow
    input_data = Python .input_data
    
    
    #MMISTデータセットをダウンロードmnist = input_data.read_data_sets(' MNIST_data / '、one_hot:true)
    
    #入力、重み、バイアス
    x = tf.placeholder(tf.float32、[ nil、784 ])
    W = tf.Variable.new(tf.zeros([ 784、10 ]))
    b = tf.Variable.new(tf.zeros([ 10 ]))
    
    #出力
    y = tf.nn.softmax(tf.matmul(x、w)+ b)
    y_ = tf.placeholder(tf.float32、[ nil、10 ])
    
    #エラー関数
    cross_entropy = tf.reduce_mean(-1 * tf.reduce_sum(y_ * tf.log(y)、reduction_indices:[ 1 ]))
    
    #鉄道模型
    train_step = tf.train.GradientDescentOptimizer.new(0.5).minimize(cross_entropy)
    
    sess = tf.InteractiveSession.new
    tf.global_variables_initializer.run
    
    #電車は開始
    1000年.times行う
      バッチ= mnist.train.next_batch(100)
      batch_xs、batch_ys = batch [ 0 ]、batch [ 1 ]
      sess.run(train_step、feed_dict:{x ​​=> batch_xs、y_ => batch_ys})
     end
    
    #正規化
    correct_prediction = tf.equal(tf.argmax(y、1)、tf.argmax(y_、1))
    
    #結果
    精度= tf.reduce_mean(tf.cast(correct_prediction、tf.float32))
    puts sess.run(accuracy、feed_dict:{x ​​=> mnist.test.images、y_ => mnist.test.labels})
    

    わざわざPythonザル呼切り改善のはmath.rbとかれてて目してた名残になる、たはtensorflow_tutorial.rbにベタ書きする問題なしです。

    結果

    $ ruby​​ tensorflow_tutorial.rb
    0.9185
    

    これは約92%になるはずです。

    戦略に正回答率92%これになりました。

    浄化所

    pycallが富士に行くpythonが/ usr / bin / python

    環境変数PYTHONを使いたいpythonにすどいい

    $ export PYTHON = path / to / python3
    

    データセットダウンロード連結SSL評価でエラー

    $ / Applications / Python \ 3.6 / Install \ Certificates.command
    

    で解決
    参照(https://github.com/tensorflow/tensorflow/issues/10779

    tf.matmul(x、w)でなんかエラーでた

    例外:PyCall :: PyError:<class'TypeError '>:_ as_graph_element()に1つの必須の位置引数がありません:' self '
    ファイル「/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py」、2004行、matmul
      名前としてops.name_scope(name、 "MatMul"、[a、b])を使用:
    ファイル "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py"、行5616、__ enter__
      g = _get_graph_from_inputs(self._values)
    ファイル "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py"、5277行目、_get_graph_from_inputs
      graph_element = _as_graph_element(op_input)
    _as_graph_elementのファイル「/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py」、118行目
      conv_fn()を返します
    

    まだの部分をルビーコードにません

    pythonの元コード:tf.Variable(tf.zeros([10]))
    間麻えたるちコード:tf.Varialbe(tf.zeros([10]))
    改善ルビーコード:tf.Variable。(tf.zeros([10]))
    

    よくPyCall使ってルビーで…ってる記事にはtf.Variable.(tf.zeros([10]))のように書いてるあのりますが、これはtf.Variableクラスの()メソッドを呼んでいる、つまりコンストラクタの呼び出しなのでルビー的に書くならイニシャライザを呼び出してあげれば良いん
    消。じゃあおりHDLです。

    正解のルビーコード:tf.Variable.new(tf.zeros([10]))
    

    連想配列の説明手間戦略た

    元のPythonコード:sess.run(train_step、feed_dict = {x:batch_xs、y_:batch_ys})
    Rubyデッキコード:sess.run(train_step、feed_dict:{x:batch_xs、y_:batch_ys})
    Ruby正解コード:sess.run(train_step、feed_dict:{x => batch_xs、y_ => batch_ys})
    

    終わりに

    PyCallをててRubyからtensorflowを押してMNISTのチュートリートたたて記事がぱっと見たたたたので書たたたたので書たみました。
    今回はわざわざPyCallを使ってルビーからtensorflowを触りましたが、実はtensorflow.rbというRubyAPIがあったりするので、次はそっち使って遊んでみます。