FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

ゼロから作るDeep Learning ③ のPython実装をRubyで作り直してみる(Ruby + Numpyを試行)

ゼロから作るDeep Learning ❸ ―フレームワーク編

ゼロから作るDeep Learning ❸ ―フレームワーク編

  • 作者:斎藤 康毅
  • 発売日: 2020/04/20
  • メディア: 単行本(ソフトカバー)

Rubyで作るDeZero、ステップ24まで進んだのだがかなり厳しい。とにかくRuby数値計算用のライブラリが無く、行列の計算がとにかく煩雑になっている。これを解消するためにはもう少し便利なライブラリがあればよいのだが、Rubyには数値計算用のライブラリは提供されておらずこれ以上自力で進めるのは無理な気がしてきた。

ここでは2つの解決方法があるのではないか。

  • 行列の取り扱いのみを気をつければよいのであれば、RubyのArrayに対する演算子をひたすらオーバーロードし、専用のArrayクラスを作成して解決する。
  • そもそもRubyのArrayを使うのをあきらめ、Numpyをインポートして使用する。

一つの解決先としてはPycallを利用してRubyでNumpyを使用できるようにする必要がある。これについて試行してみよう。

Numpyを使用するためにはPycallのインストールが必要だ。以下のようにしてインストールする。

sudo gem install pycall

この状態でpycallが使えるかテストする。

  • pycall_test.rb
#!/usr/bin/ruby

require 'pycall'
sys = PyCall.import_module('sys')
p sys.path
['/home/msyksphinz/.gem/ruby/2.5.0/gems/pycall-1.3.1/lib/pycall/python', '/home/msyksphinz/.pyenv/versions/3.5.3/lib/python35.zip', '/home/msyksphinz/.pyenv/versions/3.5.3/lib/python3.5', '/home/msyksphinz/.pyenv/versions/3.5.3/lib/python3.5/plat-linux', '/home/msyksphinz/.pyenv/versions/3.5.3/lib/python3.5/lib-dynload', '/home/msyksphinz/.pyenv/versions/3.5.3/lib/python3.5/site-packages']

なるほど、デフォルトではPython3.5が使われているので、Python 3.5のNumpyを導入しよう。

pip3.5 install numpy

以下のプログラムで実験する。

require 'numpy'
np = Numpy
x = np.asarray([1,2,3,4,5])
y = np.array([10,20,30,40,50])
z = x * y
p x.sum()
p z
15
array([ 10,  40,  90, 160, 250])

上手く行った。これが使えそうならばNumpyを使った実装に書き換えようかな。