上次说了梯度下降用于简单的线性回归问题,这次将梯度下降用于较复杂一点的神经网络结构。
class neuralNetwork :
# initialise the neural network
def __init__(self, inputnodes, hiddennodes, outputnodes,learningrate) :
# set number of nodes in each input, hidden, output layer
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
# 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.hnodes,-0.5), (self.hnodes, self.inodes))
self.who = numpy.random.normal(0.0, pow(self.onodes,-0.5), (self.onodes, self.hnodes))
# learning rate
self.lr = learningrate
# activation function is the sigmoid function
self.activation_function = lambda x: scipy.special.expit(x)
# train the neural network
def train(self, inputs_list, targets_list, num_iter) :
# convert inputs list to 2d array
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T
for i in range(0, num_iter):
# 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_errors = targets - final_outputs
hidden_errors = numpy.dot(self.who.T, output_errors)
self.who += self.lr * numpy.dot(output_errors * final_outputs * (1 - final_outputs), hidden_outputs.T)
self.wih += self.lr * numpy.dot(hidden_errors * hidden_outputs * (1 - hidden_outputs), inputs.T)
if i % 1000 == 0:
print("%d st iteratiton"%i)
print(final_outputs)
#print(self.wih)
#print(self.who)
print("final_outputs:")
print(final_outputs)
# query the neural network
def query(self, inputs_list) :
# convert inputs list to 2d array
inputs = numpy.array(inputs_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)
return final_outputs
这里的输入和输出只给一组数据作为训练样本,主要来说明神经网络训练的效果,注意输入输出的值都不要给的过大,0~1之间最佳,但切忌取0
n = neuralNetwork(3, 3, 3, 0.02)
n.train([1.0, 0.5, 0.8],[0.2, 0.9, 0.5], 4000)
每1000次打印输出,可以看到网络的输出渐渐接近于我们给定的目标输出值[0.2, 0.9, 0.5],达到训练的效果
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。