ANN的全拼是Artificial Neural Network即人工神经网络,简称神经网络,是一种基于模仿大脑神经网络结构和功能而建立的信息处理系统。
既然是模仿,那我们就必须了解生物学上的神经元到底是什么?
树突是是神经元的输入通道,接受来自其他神经元的信息。轴突即神经纤维,是神经元的输出通道。轴突末端称为神经末梢,它是神经元信息的输出端,用于输出神经元的动作脉冲。
由此我们可以得知,生物学上的神经元能起到接收信息,并传递信息的功能,换句话说,就是输入和输出。
那么应用在数学上,可以理解为:给你一个线性函数,神经元的功能就是把这个线性函数的解代入反曲函数,这是个连续可导函数。
但这是上世纪五十年代的研究水平,这么简单的神经元网络能解决的问题可以很复杂。
用贾通艺教授的话总结,就是:“本来无一物,何处惹尘埃”,就算再复杂的东西都可以找到方法来简化
最简单的神经网络其实可以理解为只有一个神经元的神经网络:
以上是只有一个权重(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:
用数学公式可以表示为:
用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