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に必要なことは実装できていないです。簡単なニューラルネットを使ってみたい人向けです。 これから、少しづつ拡張していく予定です。

コメント