📜  在Python中实现神经网络训练过程

📅  最后修改于: 2020-04-27 16:14:23             🧑  作者: Mango

人工神经网络(ANN)是一种收到大脑启发的信息处理范例。人工神经网络就像人一样,以身作则。通过学习过程为特定应用(例如模式识别或数据分类)配置了ANN。学习主要涉及对神经元之间存在的突触连接的调节。

大脑由数千亿个称为神经元的细胞组成。这些神经元通过突触连接在一起,这些突触不过是神经元可以向另一神经元发送冲动的连接。当一个神经元向另一个神经元发送一个兴奋性信号时,该信号将被添加到该神经元的所有其他输入中。如果超过给定的阈值,则将导致目标神经元向前发出动作信号-这就是思维过程在内部工作的方式。

在《计算机科学》中,我们通过使用矩阵在计算机上创建“网络”来对此过程进行建模。这些网络可以理解为神经元的抽象,而没有考虑到所有生物学上的复杂性。为了简单起见,我们将对一个简单的NN建模,该模型具有两层能够解决线性分类问题的层。

假设我们有一个问题,我们要在给定一组输入和输出作为训练数据的情况下,需要预测新输出,例如训练示例:

注意,输出与第三列直接相关,即输入3的值就是图3中每个训练示例中输出的值。2.因此对于测试示例,输出值应为1。
培训过程包括以下步骤:

  1. 正向传播:
    将输入乘以权重(仅使用随机数作为权重)
    令Y = W i I  = W 1 I 1 + W 2 I 2 + W 3 I 3
    将结果通过S型公式进行计算神经元的输出。Sigmoid函数用于对0到1之间的结果进行归一化:
    1/1 + e -y
  2. 反向传播
    计算误差,即实际输出与预期输出之间的差。根据误差,通过将误差乘以输入,然后再乘以Sigmoid曲线的斜率来调整权重:
    Weight + = Error输入输出(1-Output),此处输出(1-Output)是S型曲线的导数。

注意:重复整个过程几千次迭代。
让我们用Python编写整个过程。我们将使用Numpy库来帮助我们轻松进行矩阵的所有计算。您需要在系统上安装numpy库,以运行代码
Command来安装numpy: 

sudo apt -get install Python-numpy

实现方式: 

from numpy import *
class NeuralNet(object):
    def __init__(self):
        # 产生随机数
        random.seed(1)
        # 将随机权重分配给3 x 1矩阵,
        self.synaptic_weights = 2 * random.random((3, 1)) - 1
    # Sigmoid函数
    def __sigmoid(self, x):
        return 1 / (1 + exp(-x))
    # Sigmoid函数的导数.
    # 这是S型曲线的梯度.
    def __sigmoid_derivative(self, x):
        return x * (1 - x)
    # 训练神经网络并每次调整权重.
    def train(self, inputs, outputs, training_iterations):
        for iteration in xrange(training_iterations):
            # 通过网络传递训练集.
            output = self.learn(inputs)
            # 计算误差
            error = outputs - output
            # 调整权重
            factor = dot(inputs.T, error * self.__sigmoid_derivative(output))
            self.synaptic_weights += factor
    # 神经网络
    def learn(self, inputs):
        return self.__sigmoid(dot(inputs, self.synaptic_weights))
if __name__ == "__main__":
    # 初始化
    neural_network = NeuralNet()
    # 训练集.
    inputs = array([[0, 1, 1], [1, 0, 0], [1, 0, 1]])
    outputs = array([[1, 0, 1]]).T
    # 训练神经网络
    neural_network.train(inputs, outputs, 10000)
    # 用测试示例测试神经网络.
    print neural_network.learn(array([1, 0, 1])

预期输出:经过10次迭代后,我们的神经网络预测该值为0.65980921。答案应为1,这看起来不好。如果将迭代次数增加到100,则得到0.87680541。我们的网络越来越智能!随后,对于10000次迭代,我们得到0.9897704,这非常接近并且确实是令人满意的输出。