海量Python学习资料领取方式:添加微XhuanglaoshiJS或扫码,备注"学习资料领取"就可领取。
这儿仅有9行代码,完成为了一个简单的神经网络:
from numpy import exp, array, random, dot
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
training_set_outputs = array([[0, 1, 1, 0]]).T
random.seed(1)
synaptic_weights = 2 * random.random((3, 1)) - 1 for iteration in
range(10000):
output = 1 / (1 + exp(-(dot(training_set_inputs, synaptic_weights))))
synaptic_weights += dot(training_set_inputs.T, (training_set_outputs - output) * output * (1 - output)) print
(1 / (1 + exp(-(dot(array([1, 0, 0]), synaptic_weights)))))
在这篇文案中,我会解释我是怎样做到的,因此你能够创立自己的。我还会供给更长,但更美丽的源代码版本。
目录
1. 什么是神经网络?
2. 训练过程
3. 计算神经元输出的方式
4. 调节权重的公式
5. 构建Python代码
Part1什么是神经网络?
首要什么是神经网络?人类大脑由1000亿神经元构成,经过突触互相连接。倘若有足够的突触输入信息给神经元,那样神经元会产生相应的反应,咱们将这个过程叫作为“思考”。
咱们能够在电脑上模拟这个过程,不需要模拟到繁杂的生物分子级,只需要得到它们更高层次的规则。咱们运用数学技术——矩阵,一种网格数据。为了让它更简单咱们的神经网络仅有三个输入和一个输出。
咱们将训练神经网络处理下面的问题,前四个例子被叫作为训练集。你能处理这个问题吗??处是0还是1?
你可能已经重视到,输出始终等于最左边输入列的值。因此呢,答案是“?”应为1。
Part2训练过程
咱们怎样教会咱们的神经网络回答这个问题?咱们给每一个输入一个权重,能够是正值亦能够负值。有很强正权重或负权重的输入都会对输出有很大的影响。起始之前,咱们设置每一个权重为随机值,下面起始训练过程:
从训练集示例中获取输入,经过权重调节它们,并经过特殊公式来传递它们以计算神经元的输出。
计算误差,即训练集示例中神经元输出与期望输出之间的差异。
按照错误的方向,稍微调节权重。
重复这个过程10000次。
最后,神经元的权重将达到训练集的最佳值。倘若咱们准许神经元思考一个新状况,遵循相同的模式,它应该做出一个很好的预测。
Part3计算神经元输出的公式
你可能想晓得,计算神经元输出的特殊公式是什么?首要咱们取神经元输入的加权和,即:
接下来咱们规范化这个,因此结果在0和1之间。为此,咱们运用一个数学方便的函数,叫作为Sigmoid函数:
倘若绘制在图上,则Sigmoid函数绘制一个S形曲线。
因此呢,经过将第1个方程代入第二个方程,神经元输出的最后公式为: Output of neuron你可能已然重视到咱们无运用最小阈值,以保持简单。
Part4调节权重的公式
在训练周期中,咱们调节权重。然则咱们经过什么来调节权重?咱们能够运用“错误加权导数”公式: Adjust weights by还有其他的公式,能够让神经元更快地学习,然则这种办法的优点是非常简单。
Part5构建Python代码
尽管咱们不会运用神经网络库,但咱们将从Python的NumPy数学库中导入四种办法。这些是:
exp — 自然指数
array —构建矩阵
dot — 繁杂矩阵
random — 得到随机值
例如,咱们能够运用array()办法来暗示之前表示的训练集:
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
training_set_outputs = array([[0, 1, 1, 0]]).T
.T函数将矩阵从水平转换为垂直, 因此电脑存储这般的数字是这般的:
请重视,在每次迭代中,咱们同期处理全部训练集。因此呢咱们的变量是矩阵,它们是数字的网格。这是一个用Python编写的完整工作示例:
from numpy import exp, array, random, dot
class NeuralNetwork():
def __init__(self): # 设定随机数出现器,生成相同的数字
random.seed(1) # 咱们构造一个三个输入和一个输出相连接的神经网络 # 将随机权重设置为3*1的矩阵,值保持在-1到1之间平均值为0
self.synaptic_weights = 2 * random.random((3, 1)) - 1 # Sigmoid 函数描绘的是S形曲线 # 将她们规范化在0-1之间.
def __sigmoid(self, x): return
1 / (1 + exp(-x)) # Sigmoid函数的导数。 # 这是Sigmoid曲线的梯度。
def __sigmoid_derivative(self, x): return
x * (1 - x) # 咱们经过实验和错误的过程来训练神经网络。 # 每一次都调节权重
def train(self, training_set_inputs, training_set_outputs, number_of_training_iterations): for iteration in
range(number_of_training_iterations): # 经过咱们的神经网络(单个神经元)传递训练集。
output = self.think(training_set_inputs) # 计算错误(期望输出与预测输出之间的差异)。
error = training_set_outputs - output # 经过输入乘以误差并再次乘以Sigmoid曲线的梯度。 # 这寓意着输入为零,不会引起权重出现变化。
adjustment = dot(training_set_inputs.T, error * self.__sigmoid_derivative(output)) # 调节权重
self.synaptic_weights += adjustment # 神经网络的思考
def think(self, inputs): return
self.__sigmoid(dot(inputs, self.synaptic_weights)) if __name__ == "__main__"
: #初始化神经网络
neural_network = NeuralNetwork() print("Random starting synaptic weights: "
) print
(neural_network.synaptic_weights) # 训练数据及.咱们有4个样本每一个有三个输入 # 和1个输出.
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
training_set_outputs = array([[0, 1, 1, 0]]).T # 运用训练数据及训练模型. # 重复10000次,每次进行微小的调节.
neural_network.train(training_set_inputs, training_set_outputs, 10000) print("New synaptic weights after training: "
) print
(neural_network.synaptic_weights) # 用新状况对模型进行测试 print("Considering new situation [1, 0, 0] -> ?: "
) print
(neural_network.think(array([1, 0, 0])))
运行结果如下:
Random starting synaptic weights:
[[-0.16595599]
[ 0.44064899]
[-0.99977125]]
New synaptic weights after training:
[[ 9.67299303]
[-0.2078435 ]
[-4.62963669]]
Considering new situation [1, 0, 0] -> ?:
[0.99993704]
咱们做到了!咱们运用Python创立了一个简单的神经网络!首要,神经网络为自己分配随机权重,并运用训练集进行训练。而后它思虑了一个新状况[1,0,0]并预测了0.99993704。正确的答案是1。非常接近!传统的电脑程序一般没法学习。神经网络的神奇之处在于,她们能够学习,适应和响应新的状况。就像人类的思想同样。
|