神经网络使用的两个数据集:一个是训练集(60000条),一个是测试测试集(10000条),下载后直接放在程序目录下就可以了
mnist手写字体训练集6000条,mnist_train.csv
mnist手写字体测试集10000条,mnist_test.csv
神经网络文件(nn3l.py)
"""
@文件:nn3l.py
@功能:这是一个3层的神经网络
@作者:Kwina
@日期:2020年7月14日
@说明:传入数据和输出数据都为列表形式
"""
import numpy as np
import scipy.special
class NeuralNetwork:
"""
神经网络
"""
def __init__(self, inputs, hiddens, outputs, learn_rate):
self.inodes = inputs # 输入层节点数
self.hnodes = hiddens # 隐藏层节点数
self.onodes = outputs # 输出层节点数
self.lr = learn_rate # 学习效率
self.epoch = 0 # 迭代次数
self.file_prefix = None # 上次保存的权重文件的前缀
self.wih = None # 输入层至隐藏层的权重矩阵
self.who = None # 隐藏层至输出层的权重矩阵
def set_weight(self):
"""
设置权重
"""
# 初始权重矩阵
if self.epoch == 0:
self.wih = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))
self.who = np.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))
else:
self.wih = NeuralNetwork.txt2array2d(self.file_prefix + '_wih.txt')
self.who = NeuralNetwork.txt2array2d(self.file_prefix + '_who.txt')
def train(self, inputs_list, targets_list):
"""
训练网络
:param inputs_list:训练源数据列表
:param 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 = NeuralNetwork.sigmoid(hidden_inputs)
# 输出层计算
final_inputs = np.dot(self.who, hidden_outputs)
final_outputs = NeuralNetwork.sigmoid(final_inputs)
# 误差计算
output_errors = targets - final_outputs
hidden_errors = np.dot(self.who.T, output_errors)
# 反向传播更新权值
self.wih += self.lr * np.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), inputs.T)
self.who += self.lr * np.dot((output_errors * final_outputs * (1.0 - final_outputs)), hidden_outputs.T)
def query(self, inputs_list):
"""
识别未知数据
:param inputs_list: 数据应该和训练源数据长度一样
:param epoch: 使用迭代多少代的数据
:return: 数据列表,数字最大就是识别结果
"""
# 输入
inputs = np.array(inputs_list, ndmin=2).T
# 隐藏层计算
hidden_inputs = np.dot(self.wih, inputs)
hidden_outputs = NeuralNetwork.sigmoid(hidden_inp