Neural Network with Python @2017.11.26

コードの骨組み
ーーーーーーーーーーーーーーーーーーー
初期化>学習>照会
ーーーーーーーーーーーーーーーーーーー
class neuralNetwork:

def __init__():
pass

def train():
pass

def query():
pass
ーーーーーーーーーーーーーーーーーーー
初期化:入力層>隠れ層>出力層のノード数の設定+学習率の設定
ーーーーーーーーーーーーーーーーーーー
class neuralNetwork:

def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes

self.lr = learningrate
pass

def train():
pass

def query():
pass
ーーーーーーーーーーーーーーーーーーー
input_nodes = 3
hidden_nodes = 3
output_nodes = 3

learning_rate = 0.3

n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
ーーーーーーーーーーーーーーーーーーー
リンクの重みの作成

入力層と隠れ層の間のリンクの重み Winput_hidden
隠れ層と出力層の間のリンクの重み Whidden_output

重みを初期化するコード:
# link weight matrices, wih and who
# weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
# w11 w21
# w12 w22 etc
self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
ーーーーーーーーーーーーーーーーーーー
ネットワークへの照会
ーーーーーーーーーーーーーーーーーーー
Xhidden = Winput_hidden・I

hidden_inputs = numpy.dot(self.wih, inputs)

出力信号を得るために、シグモイド関数を適応
Ohidden = sigmoid(Xhidden)

import scipy.special
self.activation_function = lambda x: scipy.special.expit(x)

隠れ層から出てくる出力信号
hidden_outputs = self.activation_function(hidden_outputs)

出力層からの出力信号
# calculate signals into final output layer
final_inputs = numpy.dot(self.who, hidden_outputs)
# calculate the signals emerging from final output layer
final_outputs = self.activation_function(final_inputs)
ーーーーーーーーーーーーーーーーーーー
ネットワークの学習
ーーーーーーーーーーーーーーーーーーー
# train the neural network
def train(self, inputs_list, targets_list):
# convert inputs list to 2d array
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T

# calculate signals into hidden layer
hidden_inputs = numpy.dot(self.wih, inputs)
# calculate the signals emerging from hidden layer
hidden_outputs = self.activation_function(hidden_inputs)

# calculate signals into final output layer
final_inputs = numpy.dot(self.who, hidden_outputs)
# calculate the signals emerging from final output layer
final_outputs = self.activation_function(final_inputs)

# output layer error is the (target – actual)
output_errors = targets – final_outputs
# hidden layer error is the output_errors, split by weights, recombined at hidden nodes
hidden_errors = numpy.dot(self.who.T, output_errors)

errorshidden = weights hidden_output・errorsoutput

隠れ誤差をリンクの重みの割合で再配分
# hidden layer error is the output_errors, split by weights, recombined at hidden nodes
hidden_errors = numpy.dot(self.who.T, output_errors)

隠れ層ー出力層間の重みを更新する式:
# update the weights for the links between the hidden and output layers
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 – final_outputs)), numpy.transpose(hidden_outputs))

入力層ー隠れ層間の重みを更新する式:
# update the weights for the links between the input and hidden layers
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 – hidden_outputs)), numpy.transpose(inputs))

ーーーーーーーーーーーーーーーーーーー