FPGA開発日記

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

ゼロから作るDeep Learning ③ のPython実装をRubyで作り直してみる(ステップ19/ステップ20)

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

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

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

ゼロから作るDeep Learning ③を買った。DezeroのPython実装をRubyに移植する形で独自に勉強している。次はステップ19とステップ20。

  • ステップ19:変数を使いやすくする

変数に対する変数名オプションの追加、いくつかのサポート関数の追加を行う。ほとんどのNumPy関連のサポート関数についてはRubyには存在しないので省略。いくつか便利そうな関数があったのでサポート関数に追加。

class Variable:
...
  def len
    @data.size
  end

  def to_s
    if @data == nil then
      return 'variable(None)'
    end
    return 'variable(' + @data.to_s + ')'
  end
...

.to_sを再定義した。これでputsが使いやすくなる。

x = Variable.new([1, 2, 3])
puts x

x = Variable.new(nil)
puts x

x = Variable.new([[1, 2, 3], [4, 5, 6]])
puts x
variable([1, 2, 3])
variable(None)
variable([[1, 2, 3], [4, 5, 6]])

もう一つの改造は演算子オーバーロードだ。Pythonでも演算子オーバーロードでき、Rubyでも演算子オーバーロードできる。

class Variable
...
  def *(other)
    return mul(self, other)
  end

  def +(other)
    return add(self, other)
  end
end

上記の実装で以下のような接続が可能になる。

a = Variable.new([3.0])
b = Variable.new([2.0])
c = Variable.new([5.0])
y = a + b * c
puts y
variable([13.0])