# encoding: utf-8
#数据处理头文件
import numpy
import csv
#s型激活函数头文件
import scipy.special
# 神经网络类
class neuralNetwork:
#初始化三层神经网络(输入层的节点数,隐藏层的节点数,输出层的节点数,学习率?)
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
# 学习率
self.lr = learningrate
#numpy.random.normal(正态分布的中心,标准偏差,矩阵的大小)生成正态分布的随机数(节点数越多,每个权重会相应减小,这符合常规)
#输入层到隐藏层权重,wij表示节点i到节点j
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))
#定义s型激活函数
self.activation_function = lambda x: scipy.special.expit(x)
pass
#神经网络训练函数targets_list范围在 0 - 1(无限接近0和1)
def train(self, inputs_list , targets_list):
# 将输入列表转换为二维数组?
inputs = numpy.array(inputs_list , ndmin=2).T
targets = numpy.array(targets_list , ndmin=2).T
# 用矩阵计算隐藏层输入
hidden_inputs = numpy.dot(self.wih, inputs)
# 调用S型激活函数计算隐藏层输出
hidden_outputs = self.activation_function(hidden_inputs)
# 用矩阵计算输出层输入
final_inputs = numpy.dot(self.who, hidden_outputs)
# 调用S型激活函数计算输出层输出
final_outputs = self.activation_function(final_inputs)
# 计算实际与实例的误差(用于调整隐藏层到输出层权重)
output_errors = targets - final_outputs
# 隐藏层误差即输出误差 ,
# 分裂重组在隐藏节点的权重(用于调整输入层到隐藏层权重)
hidden_errors = numpy.dot(self.who.T, output_errors)
# 更新隐藏层和输出层的权重,公式:∆W jk = α · E k ∗ sigmoid(O k ) ∗ (1 − sigmoid(O k )) · O T
self.who+=self.lr*numpy.dot((output_errors*final_outputs*(1.0-final_outputs)),\
numpy.transpose(hidden_outputs))
# 更新输入层和隐藏层的权重,公式:∆W jk = α · E k ∗ sigmoid(O k ) ∗ (1 − sigmoid(O k )) · O T
self.wih+=self.lr*numpy.dot((hidden_errors*hidden_outputs*(1.0-hidden_outputs)),\
numpy.transpose(inputs))
#神经网络工作函数,inputs为输入矩阵
def query(self,inputs_list):
# 将输入列表转换为二维数组?
inputs = numpy.array(inputs_list , ndmin=2).T
# 用矩阵计算隐藏层输入
hidden_inputs = numpy.dot(self.wih, inputs)
# 调用S型激活函数计算隐藏层输出
hidden_outputs = self.activation_function(hidden_inputs)
# 用矩阵计算输出层输入
final_inputs = numpy.dot(self.who, hidden_outputs)
# 调用S型激活函数计算输出层输出
final_outputs = self.activation_function(final_inputs)
return final_outputs
# 输入,隐藏和输出的节点数
input_nodes = 4
hidden_nodes = 4
output_nodes = 9
# 0.3的学习率
learning_rate = 0.3
epochs=4
#创建一个神经网络实例n
n = neuralNetwork(input_nodes ,hidden_nodes ,output_nodes , learning_rate)
training_data_file = open("train.csv", 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()
gp_max=0
gp_min=99999
for data in training_data_list:
all_values = data.split(',')
if(float(all_values[2])>gp_max):
gp_max=float(all_values[2])
if(float(all_values[3])<gp_min):
gp_min=float(all_values[3])
# 训练神经网络
# 开始循环训练
for e in range(epochs):
for record in training_data_list:
all_values = record.split(',')
# 把输入的值控制在0-1之间,增大训练效率
inputs = (numpy.asfarray(all_values[1:]) / (gp_max-gp_min) * 0.99) + 0.01
# 调整目标值在0-1之间
# 吧所有0值调整成0.01
targets = numpy.zeros(output_nodes) + 0.01
# 把对应的目标值调整成0.99
targets[int(all_values[0])] = 0.99
n.train(inputs , targets)
#print(training_data_list)
#测试准确率:
test_data_file = open("test.csv", 'r')
test_data_list = test_data_file.readlines()
training_data_file.close()
scorecard = []
# go through all the records in the test data set
for record in test_data_list:
all_values = record.split(',')
# 把第一个识别出的值作为正确识别
correct_label = int(all_values[0])
# 把输入的值控制在0-1之间,增大训练效率
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
#开始测试
outputs = n.query(inputs)
# 找出数组中最大元素的位置,即识别结果
label = numpy.argmax(outputs)
# 结果存储
if (label == correct_label):
#与第一个比较,如果相同则存1,不同则存0
scorecard.append(1)
else:
scorecard.append(0)
pass
pass
scorecard_array = numpy.asarray(scorecard)
#打印识别准确率
print (U"准确率为 = ")
print ( (scorecard_array.sum()*1.0) / scorecard_array.size)
评论1