神经网络的训练和测试 python

承接上一节,神经网络需要训练,那么训练集来自哪?测试的数据又来自哪?

  《python神经网络编程》一书给出了训练集,识别图片中的数字。测试集的链接如下:

  https://raw.githubusercontent.com/makeyourownneuralnetwork/makeyourownneuralnetwork/master/mnist_dataset/mnist_test_10.csv

为了方便,这只是一个小的测试集,才10个。

  训练集链接:https://raw.githubusercontent.com/makeyourownneuralnetwork/makeyourownneuralnetwork/master/mnist_dataset/mnist_train_100.csv

这是包含100个数据的训练集。

  训练集和测试集的每段的第一个字母是期望的数字,每段剩余的文本是表示这个数字的像素集合,为784个数据。为了计算,我们要把文本转化为数字进行存放。把第一个数据当作期望数据,剩余的784个数据当作输入。因此输入节点设为784个。输出节点设为10个,因为要识别的是10个数据0到9。隐藏层节点选为100个,并没有进行科学的计算。

import numpy
import scipy.special
import matplotlib.pyplot as plt
import pylab
# 神经网络类定义
class NeuralNetwork():
    # 初始化神经网络
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        # 设置输入层节点,隐藏层节点和输出层节点的数量
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        # 学习率设置
        self.lr = learningrate
        # 权重矩阵设置 正态分布
        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))
        # 激活函数设置,sigmod()函数
        self.activation_function = lambda x: scipy.special.expit(x)
        pass

    # 训练神经网络
    def train(self,input_list,target_list):
        # 转换输入输出列表到二维数组
        inputs = numpy.array(input_list, ndmin=2).T
        targets = numpy.array(target_list,ndmin= 2).T
        # 计算到隐藏层的信号
        hidden_inputs = numpy.dot(self.wih, inputs)
        # 计算隐藏层输出的信号
        hidden_outputs = self.activation_function(hidden_inputs)
        # 计算到输出层的信号
        final_inputs = numpy.dot(self.who, hidden_outputs)
        final_outputs = self.activation_function(final_inputs)

        output_errors = targets - final_outputs
        hidden_errors = numpy.dot(self.who.T,output_errors)

        #隐藏层和输出层权重更新
        self.who += self.lr * numpy.dot((output_errors*final_outputs*(1.0-final_outputs)),
                                        numpy.transpose(hidden_outputs))
        #输入层和隐藏层权重更新
        self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
                                        numpy.transpose(inputs))
        pass
    # 查询神经网络
    def query(self, input_list):
        # 转换输入列表到二维数组
        inputs = numpy.array(input_list, ndmin=2).T
        # 计算到隐藏层的信号
        hidden_inputs = numpy.dot(self.wih, inputs)
        # 计算隐藏层输出的信号
        hidden_outputs = self.activation_function(hidden_inputs)
        # 计算到输出层的信号
        final_inputs = numpy.dot(self.who, hidden_outputs)
        final_outputs = self.activation_function(final_inputs)

        return final_outputs

# 设置每层节点个数
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
# 设置学习率为0.3
learning_rate = 0.3
# 创建神经网络
n = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

#读取训练数据集 转化为列表
training_data_file = open("D:/mnist_train_100.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
    #创建用零填充的数组,数组的长度为output_nodes,加0.01解决了0输入造成的问题
    targets = numpy.zeros(output_nodes) + 0.01
    #使用目标标签,将正确元素设置为0.99
    targets[int(all_values[0])] = 0.99
    n.train(inputs,targets)
    pass

#读取测试文件
test_data_file = open("D:/mnist_test_10.csv",'r')
test_data_list = test_data_file.readlines()
test_data_file.close()

all_values = test_data_list[0].split(',')
print(all_values[0])  #输出目标值

image_array = numpy.asfarray(all_values[1:]).reshape((28,28))
print(n.query((numpy.asfarray(all_values[1:])/255.0*0.99)+0.01))#输出标签值
plt.imshow(image_array,cmap='Greys',interpolation='None')#显示原图像
pylab.show()

从结果可以看出,我们输入的目标值为7,结果中第7个标签所对应的值最大,表明了正确识别了目标值。和图片中的值一样。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值