适合新手入门且最简单的ANN人工神经网络模型(Python)
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(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])))
上一篇: 什么素菜好,你真的知道么
下一篇: 如何做鱼肉,小编来告诉你