结合《python神经网络编程》这本书实现代码,个人认为最近几年出的实战系列书,给出的代码和思路更加贴切现在的技术,吴恩达课程讲解很棒但是很多资料和代码或者思想比较老化,不便于吸收理解。
一:主函数
#一个三层的简单神经网络实现
import numpy as np
import scipy.special
import mnist_train as mtr
import mnist_test as mte
class neuarlNetwork:
#初始化函数--设定输入层节点,隐藏层节点和输出层节点的数量
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
#设定输入层节点,隐藏层节点,输出层节点的数量
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
#学习效率
self.lr = learningrate
#权重矩阵(-0.5,是希望权重的范围可以在-0.5-0.5之间)
self.wih = (np.random.rand(self.hnodes, self.inodes) - 0.5)
self.who = (np.random.rand(self.onodes, self.hnodes) - 0.5)
#定义S函数
self.activation_function = lambda x:scipy.special.expit(x)
pass
#训练--学习给定训练集样本后,优化权重
def train(self,inputs_list,targets_list):
#将输入列表转换为二维矩阵
inputs = np.array(inputs_list,ndmin=2).T#初始输入值
targets = np.array(targets_list,ndmin=2).T#目标值
hidden_inputs = np.dot(self.wih,inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = np.dot(self.who,hidden_outputs)
final_outputs = self.activation_function(final_inputs)
#误差
output_errors = targets - final_outputs
#隐含层节点反向传播的误差
hidden_errors = np.dot(self.who.T,output_errors)
#更新隐藏层和最终层之间的权重
self.who += self.lr * np.dot((output_errors * final_outputs * (1.0 - final_outputs)),np.transpose(hidden_outputs))
#更新输入层和隐藏层之间的权重
self.wih += self.lr * np.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),np.transpose(inputs))
pass
#查询--给定输入,从输出节点给出答案
def query(self,inputs_list):
#输入层的初始输入值,需要转置为一个列向量即n行1列的矩阵
inputs = np.array(inputs_list,ndmin=2).T #ndmin生成一个二维数组
hidden_inputs = np.dot(self.wih,inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = np.dot(self.who,hidden_outputs)
final_outputs = self.activation_function(final_inputs)
return final_outputs
pass
pass
input_nodes = 784
hidden_nodes = 100
output_nodes = 20
learning_rate = 0.3
#创建神经网络的实例
n = neuarlNetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)
#浏览训练数据集中的所有记录
for record in mtr.train_data_list:
all_values = record.split(',')
inputs = (np.asfarray(all_values[1:])/255.0 * 0.99) + 0.01
targets = np.zeros(output_nodes) + 0.01
targets[int(all_values[0])] = 0.99
n.train(inputs,targets)
pass
#测试集测试
#记录网络执行的情况最初为空
scorecard = []
for record in mte.test_data_list:
all_values = record.split(',')
correct_label = int(all_values[0]) #目标值(正确答案)
inputs = (np.asfarray(all_values[1:])/255.0 * 0.99) + 0.01
outputs = n.query(inputs)
label = np.argmax(outputs) #返回沿轴最大值的索引
if(label == correct_label):
scorecard.append(1)
else:
scorecard.append(0)
pass
pass
#将测试成绩作为分数打印出来
scorecard_array = np.asarray(scorecard)
print("performance = ",scorecard_array.sum() / scorecard_array.size)
#print(mnist.mnist_a)
二:mnist_train.py(训练集)
import numpy as np
import matplotlib.pyplot as plt
train_data_file = open(r"D:\project\python神经网络编程\数据集\mnist_train.csv", 'r')
train_data_list = train_data_file.readlines()
train_data_file.close()
三:mnist_test.py(测试集)
import numpy as np
import matplotlib.pyplot as plt
test_data_file = open(r"D:\project\python神经网络编程\数据集\mnist_test.csv", 'r')
test_data_list = test_data_file.readlines()
test_data_file.close()
all_values = test_data_list[0].split(',')