import numpy as np
import scipy.special as sps
# 定义神经网络的类
class neuralnetwork:
#初始化函数
def __init__(self,input_nodes, hidden_nodes, output_nodes, learning_rate):
self.inodes = input_nodes
self.hnodes = hidden_nodes
self.onodes = output_nodes
self.lr = learing_rate
# 初始化权重
self.wih = np.random.normal(0.0, pow(hidden_nodes,-0.5),(hidden_nodes, input_nodes))
#使用正态分布函数把权重初始化为均值为0,标准差为后一层个数的-0.5次方
self.who = np.random.normal(0.0, pow(output_nodes,-0.5),(output_nodes, hidden_nodes))
# 初始化激活函数
self.act_function = lambda x: sps.explit(x)
pass
# 训练函数
def train(self, input_list, target_list):
inputs = np.array(input_list, ndmin=2).T
targets = np.array(target_list, ndmin=2).T
## 前向传播 ##
hidden_inputs = np.dot(self.wih, inputs)
hidden_outputs = self.act_function(hidden_inputs)
final_inputs = np.dot(self.who, hidden_outputs)
final_outputs = self.act_function(final_inputs)
## 误差反向传播 ##
# 输出层误差
error_outlayer = targets - final_outputs
# 隐藏层误差
error_hiddenlayer = np.dot(self.who.T, error_outlayer)
# 更新权重
self.who += self.lr*np.dot((error_finallayer*final_outputs*(1-final_outputs)),hidden_outputs)
self.wih += self.lr*np.dot((error_hiddenlayer*hidden_outputs*(1-hidden_outputs)),inputs)
pass
# 定义输出函数
def query(self, input_list):
inputs = np.array(input_list, ndmin=2).T
hidden_inputs = np.dot(self.wih, inputs)
hidden_outputs = self.act_function(hidden_inputs)
final_inputs = np.dot(self.who, hidden_outputs)
final_outputs = self.act_function(final_inputs)
return final_outputs
pass
########### 主函数 #########
input_nodes = 784
hidden_nodes = 200
output_nodes = 10
lr = 0.1
n = neuralnetwork(input_nodes,hidden_nodes,output_nodes,lr)
## 训练数据
# 载入dataset文件下名称为mnist.csv的文本
train_file = open('dataset/mnist_train.csv', 'r')
train_list = train_file.readlines()
train_file.close() # 读取完文件要记得关闭文件哦,不然会占内存,也可能会出现数据错乱
for record in train_list:
all_value = record.split(',')# 每读取一个数据用逗号分隔
# 把输入数据范围缩到0.01--1,便于处理
inputs = np.asfarry(all_value[1:])/255.0*0.99+0.01
# 生成训练标签(正确值)
targets = np.zeros(output_nodes) + 0.01
n.train(inputs, targets)
pass
## 测试数据
scores = []
test_file = open('dataset/mnist_test.csv', 'r')
test_list = test_file.readlines()
test_file.close()
for record in test_list:
all_value = record.split(',')# 每读取一个数据用逗号分隔
# 把文本格式转换为整数,这一步很重要哦!
correct_label = int(all_value[0])
# 把输入数据范围缩到0.01--1,便于处理
inputs = np.asfarry(all_value[1:])/255.0*0.99+0.01
# 输出结果
result = n.query(inputs)
pre_label = np.argmax(resul) # pre_label为result数组最大的标签0-9中间一个
if (pre == correct_label):
scores.append(1)
else:
scores.append(0)
pass
## 计算得分
score = np.asarray(scores)
print('The neuralnetwork prediction scor is: {}'.format(score.sum()/score.size))
直接copy上面代码去执行可能有些缩进到问题,自己动手微调一下或者自己码一下,问题不大。
要数据集的留言留下邮箱。