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
結果
出力してみた
LEARN_NUM = 10
LEARN_NUM = 100
LEARN_NUM = 1000
最後に
まだ最適化などdeeplearingに必要なことは実装できていないです。簡単なニューラルネットを使ってみたい人向けです。 これから、少しづつ拡張していく予定です。
コメント