FPGA開発日記

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

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

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

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

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

Rubyで作るDeZero、ステップ24まで進んだのだがかなり厳しい。Numpyを使う方法にだいぶ慣れてきたので、いっそのこと実装をすべてRubyとNumpyのコンビネーションに移すことにした。そのために最初から再実装をはじめ、おおよそ2時間でステップ24まで進んだ。ステップ24のサンプル関数をすべて実装して、問題なく動作することを確認した。

begin
  def sphere(x, y)
    z = x ** 2.0 + y ** 2.0
    return z
  end

  x = Variable.new(np.array(1.0))
  y = Variable.new(np.array(1.0))
  z = sphere(x, y)
  z.backward()
  puts [x.grad, y.grad].to_s
end


begin
  def matyas(x, y)
    z = ((x ** 2.0 + y ** 2.0) * 0.26) - (x * y * 0.48)
    return z
  end
  x = Variable.new(np.array(1.0))
  y = Variable.new(np.array(1.0))
  z = matyas(x, y)
  z.backward()
  puts [x.grad, y.grad].to_s
end


begin
  def goldstein(x, y)
    z = (((x + y + 1)**2) * (x*(-14) + (x**2)*3 - y*14.0 + x*y*6.0 + (y**2)*3 + 19) + 1) *
        (((x*2 - y*3)**2) * (x*(-32.0) + (x**2)*12 + y*48.0 - x*y*36.0 + (y**2)*27 + 18) + 30)
    return z
  end
  x = Variable.new(np.array(1.0))
  y = Variable.new(np.array(1.0))
  z = goldstein(x, y)
  z.backward()
  puts [x.grad, y.grad].to_s
end
[2.0, 2.0]
[0.040000000000000036, 0.040000000000000036]
[-5376.0, 8064.0]

問題無く動作した。以降はこのRuby+Numpyのコンビネーションで実装を進めていく。