LoginSignup
2
5

More than 5 years have passed since last update.

Python vs Ruby 『ゼロから作るDeep Learning』 3章 3層ニューラルネットワークの実装

Last updated at Posted at 2017-06-08

概要

書籍『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』3章のコードを参考に Python と Ruby で3層ニューラルネットワークを実装する。

計算処理では外部ライブラリを利用する。Python では NumPy を、Ruby では Numo::NArray を使用する。

環境構築が必要な場合はこちらを参照。
→ Python vs Ruby 『ゼロから作るDeep Learning』 1章 sin関数とcos関数のグラフ http://qiita.com/niwasawa/items/6d9aba43f3cdba5ca725

3層ニューラルネットワークの実装 (ソースコード)

Python

import numpy as np

# 重みとバイアスの初期化
def init_network():
  network = {}
  network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
  network['b1'] = np.array([0.1, 0.2, 0.3])
  network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
  network['b2'] = np.array([0.1, 0.2])
  network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
  network['b3'] = np.array([0.1, 0.2])
  return network

# 入力信号を出力へと変換
def forword(network, x):
  W1, W2, W3 = network['W1'], network['W2'], network['W3']
  b1, b2, b3 = network['b1'], network['b2'], network['b3']
  a1 = np.dot(x, W1) + b1
  z1 = sigmoid(a1)
  a2 = np.dot(z1, W2) + b2
  z2 = sigmoid(a2)
  a3 = np.dot(z2, W3) + b3
  y = identity_function(a3)
  return y

# 恒等関数
def identity_function(x):
  return x

# シグモイド関数
def sigmoid(x):
  return 1 / (1 + np.exp(-x))

# 実行
network = init_network()
x = np.array([1.0, 0.5]) # 入力層
y = forword(network, x)
print(y)

Ruby

require 'numo/narray'

# 重みとバイアスの初期化
def init_network()
  network = {}
  network['W1'] = Numo::DFloat[[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]
  network['b1'] = Numo::DFloat[0.1, 0.2, 0.3]
  network['W2'] = Numo::DFloat[[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]
  network['b2'] = Numo::DFloat[0.1, 0.2]
  network['W3'] = Numo::DFloat[[0.1, 0.3], [0.2, 0.4]]
  network['b3'] = Numo::DFloat[0.1, 0.2]
  network
end

# 入力信号を出力へと変換
def forword(network, x)
  w1 = network['W1']; w2 = network['W2']; w3 = network['W3']
  b1 = network['b1']; b2 = network['b2']; b3 = network['b3']
  a1 = x.dot(w1) + b1
  z1 = sigmoid(a1)
  a2 = z1.dot(w2) + b2
  z2 = sigmoid(a2)
  a3 = z2.dot(w3) + b3
  identity_function(a3)
end

# 恒等関数
def identity_function(x)
  x
end

# シグモイド関数
def sigmoid(x)
  1 / (1 + Numo::NMath.exp(-x)) # Numo::DFloat を返す
end

# 実行
network = init_network()
x = Numo::DFloat[1.0, 0.5] # 入力層
y = forword(network, x)
puts y.to_a.join(' ')

実行結果

Python

[ 0.31682708  0.69627909]

Ruby

0.3168270764110298 0.6962790898619668

参考資料

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5