神经网络学习5【train()函数编写 + 完整的神经网络代码】

本文详细介绍了神经网络的训练过程,包括如何计算输出、误差以及如何更新权重。训练网络分为两步:一是根据训练样本计算输出,二是通过误差反向传播更新权重。在训练过程中,使用激活函数从输入层前馈到输出层,并计算输出误差。接着,通过权重矩阵的调整优化网络性能。整个神经网络的实现包括初始化、训练和查询功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇文章讲了误差的传递与更新。至此这样一个简单的神经网络的脉络我们已经梳理清楚了。
紧接着,我们再回到已经写好输入和查询的神经网络框架中,去完善它。

train()函数

训练网络。训练任务分为两个部分:①针对给定的训练样本计算输出。②将计算得到的输出与所需输出对比,使用差值来指导网络权重的更新。

①针对给定的训练样本计算输出

我们已经完成了第一部分:

    # train the neural network
    def train(self, inputs_list, targets_list):

     # convert inputs list to 2d array
     inputs = numpy.array(inputs_list, ndmin=2).T
     targets = numpy.array(targets_list, ndmin=2).T

     # calculate signals into hidden layer
     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)
     pass

我们使用完全相同的方式从输入层前馈信号到最终输出层,所以代码与query()函数中的几乎完全一样。
注意:为什么在这里是完全一样的呢?我在第一遍看书与编写代码的过程中曾对这个问题疑惑过,但事实上,这是一个非常简单的问题。
虽然我们把这两个函数放在同一个类里面,但他们承担的工作并不能算是“一条流水线”上的,从这个角度来说,这两个函数完成的工作是毫不相关的。train()函数负责对训练集数据进行训练,找出能输出准确值的权重矩阵,在整个训练的过程中,它都需要针对给定的训练样本计算输出,,而query()是单纯的输出计算结果,更多的运用是在样本训练好之后,直接查询用的。

②网络权重的更新

首先,需要计算误差:

     # error is the (targets-actual)
     output_errors = targets - final_outputs

然后,可以计算出隐含层节点反向传播的误差。
在这里插入图片描述

     # hidden layer error is the output_errors, split by weights, recombined at hidden nodes
     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))

计算结束!

完整的神经网络代码

import numpy
import scipy.special

# neural network class definition


class NeuralNetwork:
    # initialise the neural network
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        # set number of nodes in each inputs,hidden,output layer
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes

        self.lr = learningrate

        # link weight matrices, wih and who
        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))

        self.activation_function = lambda x: scipy.special.expit(x)
        pass

    # train the neural network
    def train(self, inputs_list, targets_list):

        # convert inputs list to 2d array
        inputs = numpy.array(inputs_list, ndmin=2).T
        targets = numpy.array(targets_list, ndmin=2).T

        # calculate signals into hidden layer
        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)

        # error is the (targets-actual)
        output_errors = targets - final_outputs
        # hidden layer error is the output_errors, split by weights, recombined at hidden nodes
        hidden_errors = numpy.dot(self.who.T, output_errors)

        # update the weights for the links between the hidden and output layers
        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

    # query the neural network
    def query(self, inputs_list):
        # convert inputs list to 2d array
        inputs = numpy.array(inputs_list, ndmin=2).T

        # calculate signals into hidden layer
        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

到目前为止,这样就已经建立好了一个三层的神经网络。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值