簡易的なニューラルネットのライブラリをrubyで作ってみた

rubyでkeras風に簡単にニューラルネットを構築できるようなものを作ってみました。

インストール方法

gem install t_nn

2値分類

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0

サンプルコード

require "t_nn"

model = TNN::FNN.new(learning_rate=0.1)

model.add_layer(node_num=2) # 入力層
model.add_layer(node_num=3) # 中間層
model.add_layer(node_num=1) # 出力層

x_train = [[0.0, 0.0],[0.0, 1.0], [1.0, 0.0], [1.0, 1.0]]
y_train = [[ 0.0 ], [ 1.0 ],[ 1.0 ],[ 0.0 ]]

model.fit(x_train, y_train, learning_num=20000) # 学習

x_test = x_train
y_test = y_train

err_rate = model.evaluate(x_test, y_test)
puts "err rate: #{err_rate}%"

# 各テストに対しての結果出力
x_test.zip(y_test).each do |x, y|
    output = model.propagation(x)
    puts "x#{x},  y#{y},  output#{output}"
end

結果

err rate: 4.178057783239726%
x [0.0, 0.0], y [0.0] , output [0.05228744153982793]
x [0.0, 1.0], y [1.0] , output [0.9559390081562715]
x [1.0, 0.0], y [1.0] , output [0.9560109121906053]
x [1.0, 1.0], y [0.0] , output [0.02678479013663796]

簡単な関数近似

問題設定

以下のような二次関数

{

の関数近似をおこなってみる。

サンプルコード

require "t_nn"

LEARN_NUM = 10000
def test_fun(x)
  return x*x
end

model = TNN::FNN.new(learning_rate=0.1)
model.add_layer(node_num=1)
model.add_layer(node_num=5)
model.add_layer(node_num=1)

x_train = []
100.times do |num|
  x_train.push([( num.to_f/100.0 )])
end

y_train = []
x_train.each do |x|
  y_train.push([test_fun(x[0])])
end

model.fit(x_train, y_train, LEARN_NUM)

x_test = x_train
y_test = y_train

err_rate = model.evaluate(x_test, y_test)
puts "err rate: #{err_rate}%"

# 各テストに対しての結果出力
# x_test.zip(y_test).each do |x, y|
#     output = model.propagation(x) #
#     puts "x#{x},  y#{y},  output#{output}"
# end

結果

出力してみた

f:id:ttt242242:20170108103134p:plain

LEARN_NUM = 10

f:id:ttt242242:20170108103201p:plain

LEARN_NUM = 100

f:id:ttt242242:20170108103206p:plain

LEARN_NUM = 1000

最後に

まだ最適化などdeeplearingに必要なことは実装できていないです。簡単なニューラルネットを使ってみたい人向けです。 これから、少しづつ拡張していく予定です。

コメント

タイトルとURLをコピーしました