欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

适合新手入门且最简单的ANN人工神经网络模型(Python)

程序员文章站 2022-06-14 11:21:57
...

ANN的全拼是Artificial Neural Network即人工神经网络,简称神经网络,是一种基于模仿大脑神经网络结构和功能而建立的信息处理系统。

既然是模仿,那我们就必须了解生物学上的神经元到底是什么?
适合新手入门且最简单的ANN人工神经网络模型(Python)

树突是是神经元的输入通道,接受来自其他神经元的信息。轴突即神经纤维,是神经元的输出通道。轴突末端称为神经末梢,它是神经元信息的输出端,用于输出神经元的动作脉冲。

由此我们可以得知,生物学上的神经元能起到接收信息,并传递信息的功能,换句话说,就是输入和输出。

那么应用在数学上,可以理解为:给你一个线性函数,神经元的功能就是把这个线性函数的解代入反曲函数,这是个连续可导函数。

但这是上世纪五十年代的研究水平,这么简单的神经元网络能解决的问题可以很复杂。

用贾通艺教授的话总结,就是:“本来无一物,何处惹尘埃”,就算再复杂的东西都可以找到方法来简化

最简单的神经网络其实可以理解为只有一个神经元的神经网络:
适合新手入门且最简单的ANN人工神经网络模型(Python)

以上是只有一个权重(w)的最小神经网络。输入一个值(x),乘以权重,结果就是网络的输出值。

这里要注意,权重可以随着网络的训练进行更新,从而找到最佳的值,这样网络就能尝试匹配输出值与目标值。

讲到这里,相信大家对神经网络有一定了解了,下面开始上代码:

import numpy as np

class NeuralNetwork():
    def __init__(self):
        # 将权重转化为一个1x1的矩阵,其值分布为-1~1,并且均值为0
        self.synaptic_weights = 2 * np.random.random((1, 1)) - 1

权重的初始方法有两种:

  • 把权重初始化为0
  • 对权重随机初始化

首先讲讲为什么把权重设置为一个随机数,而不设置为零。先说一下我们的目标:输入一个数,输出它的相反数,在这个过程中,我们能想到,权重肯定越趋近于-1越好,因此,如果把权重初始化为0,那么每一层的神经元学到的东西都是一样的即输出都为零。

另外,这里使用数组的原因是,在研究目标检测时,必须要用到这方面的知识,因此,我举了相对简单的例子:如果输入1,则网络应输出-1;如果输入-1,则网络应输出1。仅此而已,非常简单,大家可以在这个的基础上提高难度。

接下来,我讲讲我使用的**函数tanh:
适合新手入门且最简单的ANN人工神经网络模型(Python)
用数学公式可以表示为:
适合新手入门且最简单的ANN人工神经网络模型(Python)
用python代码实现:

def tanh(self, x):
        s1 = np.exp(x) - np.exp(-x)
        s2 = np.exp(x) + np.exp(-x)
        return s1 / s2

tanh函数的导数:

def tanh_derivative(self, x):
        s1 = np.exp(x) - np.exp(-x)
        s2 = np.exp(x) + np.exp(-x)
        tanh = s1 / s2
        return 1 - tanh * tanh

所谓**函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。常用的**函数有Sigmoid函数、Tanh函数和ReLU函数。

接下来,就开始训练了:

def train(self, training_inputs, training_outputs, training_iterations):
        # 训练模型
        for iteration in range(training_iterations):
            # 得到输出
            output = self.think(training_inputs)
            print(iteration,"output:",output)
            # 计算误差
            error = training_outputs - output
            print(iteration,"error:",error)
            # 微调权重
            adjustments = np.dot(training_inputs.T, error * self.tanh_derivative(output))
            print(iteration,"adjustments:",adjustments)
            self.synaptic_weights += adjustments
def think(self, inputs):
        # 输入通过网络得到输出
        output = self.tanh(np.dot(inputs, self.synaptic_weights))
        return output

简单讲讲,把训练的数据带入名为think的函数,数据与权重相乘可以得到一个值,把这个值带入tanh函数中,所得结果即为输出。得到输出后,计算该输出是否为目标输出结果,并计算差值,根据这个差值来调整权重。

最后我们把训练数据带入:

if __name__ == "__main__":
    # 初始化神经类
    neural_network = NeuralNetwork()
    print("Beginning Randomly Generated Weights: ")
    print(neural_network.synaptic_weights)

    #训练数据
    training_inputs = np.array([[1],[-1]])
    print("training_inputs",training_inputs)

    training_outputs = np.array([[-1,1]]).T
    print("training_outputs",training_outputs)

    # 开始训练
    neural_network.train(training_inputs, training_outputs, 20000)
    print("权重:",neural_network.synaptic_weights)

    user_input = int(input("User Input: "))
    print("New Output data: ",neural_network.think(np.array([user_input])))

注意,大家可以通过修改训练的数据、训练次数、**函数、调整权重的方法等,亲自体验学习神经网络的运行原理。

这篇文章是写给那些想要接触深度学习的同学的,另外,我写的可能还不够全面,大家如果遇到了什么问题,可以在下方评论区留言!

下面是程序代码:
(如果有同学不知道怎么安装资源库的话,可以翻阅我的前几篇文章进行学习)

import numpy as np

class NeuralNetwork():
    def __init__(self):
        # 将权重转化为一个1x1的矩阵,其值分布为-1~1,并且均值为0
        self.synaptic_weights = 2 * np.random.random((1, 1)) - 1

    def tanh(self, x):
        s1 = np.exp(x) - np.exp(-x)
        s2 = np.exp(x) + np.exp(-x)
        return s1 / s2

    def tanh_derivative(self, x):
        s1 = np.exp(x) - np.exp(-x)
        s2 = np.exp(x) + np.exp(-x)
        tanh = s1 / s2
        return 1 - tanh * tanh

    def train(self, training_inputs, training_outputs, training_iterations):
        # 训练模型
        for iteration in range(training_iterations):
            # 得到输出
            output = self.think(training_inputs)
            print(iteration,"output:",output)
            # 计算误差
            error = training_outputs - output
            print(iteration,"error:",error)
            # 微调权重
            adjustments = np.dot(training_inputs.T, error * self.tanh_derivative(output))
            print(iteration,"adjustments:",adjustments)
            self.synaptic_weights += adjustments

    def think(self, inputs):
        # 输入通过网络得到输出
        output = self.tanh(np.dot(inputs, self.synaptic_weights))
        return output

if __name__ == "__main__":
    # 初始化神经类
    neural_network = NeuralNetwork()
    print("Beginning Randomly Generated Weights: ")
    print(neural_network.synaptic_weights)

    #训练数据
    training_inputs = np.array([[1],[-1]])
    print("training_inputs",training_inputs)

    training_outputs = np.array([[-1,1]]).T
    print("training_outputs",training_outputs)

    # 开始训练
    neural_network.train(training_inputs, training_outputs, 20000)
    print("权重:",neural_network.synaptic_weights)

    user_input = int(input("User Input: "))
    print("New Output data: ",neural_network.think(np.array([user_input])))