外链论坛

 找回密码
 立即注册
搜索
查看: 34|回复: 1

9行Python代码创立一个简单神经网络

[复制链接]

2340

主题

250

回帖

9920万

积分

论坛元老

Rank: 8Rank: 8

积分
99201753
发表于 2024-7-29 10:48:14 | 显示全部楼层 |阅读模式
海量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。非常接近!传统的电脑程序一般没法学习。神经网络的神奇之处在于,她们能够学习,适应和响应新的状况。就像人类的思想同样

回复

使用道具 举报

0

主题

816

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-8-20 17:24:53 | 显示全部楼层
这夸赞甜到心里,让我感觉温暖无比。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-9-8 21:05 , Processed in 0.072664 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.