手写三层神经网络完成手写体识别任务

时间:2021-10-11
本文章向大家介绍手写三层神经网络完成手写体识别任务,主要包括手写三层神经网络完成手写体识别任务使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
import numpy as np
import numpy.random
import scipy.special


class NeuralNetwork:

    # initialise the neural network
    def __init__(self, input_nodes_num, hidden_nodes_num, output_nodes_num, lr):
        # 初始化神经元个数,可以直接修改
        self.input_nodes = input_nodes_num
        self.hidden_nodes = hidden_nodes_num
        self.output_nodes = output_nodes_num
        self.learning_rate = lr

        # 初始化权重值,利用正态分布函数进行随机初始化,均值为0,方差为神经元个数开方
        self.w_input_hidden = numpy.random.normal(0.0, pow(self.hidden_nodes, -0.5),
                                                  (self.hidden_nodes, self.input_nodes))
        self.w_hidden_output = numpy.random.normal(0.0, pow(self.output_nodes, -0.5),
                                                   (self.output_nodes, self.hidden_nodes))
        # 初始化激活函数,激活函数选用Sigmoid函数,更加平滑,接近自然界的神经元行为模式
        # lambda定义了一个匿名函数
        self.activation_function = lambda x: scipy.special.expit(x)
        pass

    # train the neural network
    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.w_input_hidden, inputs)
        hidden_outputs = self.activation_function(hidden_inputs)
        # 输出层的输入为隐藏层的输出,输出为最终结果
        final_inputs = np.dot(self.w_hidden_output, hidden_outputs)
        final_outputs = self.activation_function(final_inputs)
        # 损失函数
        output_errors = targets - final_outputs
        # 隐藏层的误差为权值矩阵的转置与输出误差的点乘
        hidden_errors = np.dot(self.w_hidden_output.T, output_errors)
        # 对权值进行更新
        self.w_hidden_output += self.learning_rate * np.dot((output_errors *
                                                             final_outputs * (1.0 - final_outputs)),
                                                            np.transpose(hidden_outputs))

        self.w_input_hidden += self.learning_rate * np.dot((hidden_errors *
                                                            hidden_outputs * (1.0 - hidden_outputs)),
                                                           np.transpose(inputs))

        pass

    # query the neural network
    def query(self, inputs_list):
        # 转置将行向量转成列向量,将每组数据更好的分隔开来,方便后续矩阵点乘操作
        inputs = np.array(inputs_list, ndmin=2).T
        # 加权求和后经过sigmoid函数得到隐藏层输出
        hidden_inputs = np.dot(self.w_input_hidden, inputs)
        hidden_outputs = self.activation_function(hidden_inputs)
        # 加权求和后经过sigmoid函数得到最终输出
        final_inputs = np.dot(self.w_hidden_output, hidden_outputs)
        final_outputs = self.activation_function(final_inputs)
        # 得到输出数据列
        return final_outputs


# 初始化各层神经元个数,期中输入神经元个数取决于读入的因变量,而输出神经元个数取决于分类的可能性个数
input_nodes = 784
hidden_nodes = 500
output_nodes = 10
# 学习率,每次调整步幅大小
learning_rate = 0.2

n = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
# 获取训练集信息
training_data_file = open('data/mnist_train.csv', 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()

for record in training_data_list:
    all_values = record.split(',')

    inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01

    targets = numpy.zeros(output_nodes) + 0.01
    targets[int(all_values[0])] = 0.99
    n.train(inputs, targets)
    pass
print('train successful!')
test_file = open('data/mnist_test.csv', 'r')
test_list = test_file.readlines()
test_file.close()
m = np.size(test_list)
j = 0.0
for record in test_list:
    test_values = record.split(',')
    np.asfarray(test_values)
    results = n.query(np.asfarray(test_values[1:]))
    if results[int(test_values[0])] == max(results):
        j += 1
    pass

print("正确率为;" + str(j/m))

原文地址:https://www.cnblogs.com/sevent/p/15394345.html