教AI做件简单的事:从零开始构建首个神经网络

人工智能 深度学习
很长时间以来,我一直对构建神经网络跃跃欲试,现在终于有机会来研究它了。我想我并没有完全掌握神经网络背后的数学原理,所以先教人工智能做一些简单的事情吧。

本文转载自公众号“读芯术”(ID:AI_Discovery)。

很长时间以来,我一直对构建神经网络跃跃欲试,现在终于有机会来研究它了。我想我并没有完全掌握神经网络背后的数学原理,所以先教人工智能做一些简单的事情吧。

[[360266]]

代码原理

神经网络并不是一个新概念,1943年,由沃伦·麦卡洛克(WarrenMcCulloch)和沃尔特·皮茨(Walter Pitts)首次提出。

我们将构建一个没有隐藏层或感知器的单层神经网络。它由一个包含训练示例、突触或权重以及神经元的输入层和一个含有正确答案的输出层组成。神经网络图形如下所示:

此外,需要了解一些如sigmoid和导数之类的数学概念,以清楚神经元的学习方式。神经元只需进行简单操作,即取一个输入值,乘以突触权重。之后,对所有这些乘法结果求和,并使用sigmoid函数获得0到1内的输出值。

神经元表示:

Sigmoid函数:

问题界定

输入层上有数字序列。我们预期的理想结果是,在数据集样本中,如果输入第一个数字是1,则神经网络返回1;如果第一个数字是0,则返回0。结果在输出层中显示。问题集如下图:

先决条件

开始编码的前提——在概念上达到一定程度的理解。

NumPY安装:

  1. pip install numpy 

安装成功,即可进入编码部分。首先,将NumPy导入Python文件中:

  1. import numpy as np 

训练神经网络

首先,创建一个sigmoid函数:

其次,定义训练示例、输入(4×5矩阵)和输出:

接下来,通过生成随机值来初始化突触权重,并将结果排列在4×1的矩阵中:

最后,构建训练模型。使用for循环,所有的训练都将在此循环中进行。调用sigmoid函数,并将所有输入的总和乘以sigmoid权重。然后采用Np.dot进行矩阵乘法。过程如下图:

输出结果如下图:

现在进行神经网络模型训练,方法是计算sigmoid函数的输出和实际输出之间的差值。之后可以根据误差的严重性调整权重。多次重复这个过程,比如说一万次。定义sigmoid导数:

以下是计算和调整权重的方法:

开始学习,观察学习时长会如何影响结果。从100次迭代开始:

开始情况比较乐观——我们的人工智能已经学会了识别模式,但错误率仍然居高不下。现在进行1000次迭代:

情况好转,继续进行10000次迭代:

10万次迭代:

我们可以继续更多次的学习迭代,但永远无法达到100%的准确性,因为这需要进行无限次的计算。但即使在最坏的情况下,准确率也达到了99.77%,这相当不错。

对于最终代码,我写得很漂亮,并通过函数将其分开。除此之外,在文本文件中,我还添加了一种非常复杂方法以存储权重。这样只需进行一次学习,而且需要使用AI时,只需导入权重并利用sigmoid函数即可。

  1. import numpy as np 
  2. from tempfile import TemporaryFile 
  3. def sigmoid(x): 
  4.     return 1 / (1 + np.exp(-x)) 
  5. def sigmoid_der(x): 
  6.     return x * (1 - x) 
  7. def training(): 
  8.     training_inputs = np.array([[0,0,1,0], [1,1,1,0], [1,0,1,0], [0,1,1,1], [0,1,0,1]]) 
  9.     trainign_outputs = np.array([[0,1,1,0,0]]).T 
  10.     np.random.seed(1) 
  11.     synaptic_weights = 2 * np.random.random((4,1)) - 1 
  12.             for i in range(50000): 
  13.         inputs = training_inputs 
  14.         outputs = sigmoid(np.dot(inputs, synaptic_weights)) 
  15.         error = trainign_outputs - outputs 
  16.                 adjustments = error * sigmoid_der(outputs) 
  17.         synaptic_weights += np.dot(inputs.T, adjustments) 
  18.     data_file = open("data.txt", "w") 
  19.     for row in synaptic_weights: 
  20.         np.savetxt(data_file, row) 
  21.     data_file.close() 
  22. def thinking(inputs): 
  23.     synaptic_weights = np.loadtxt("data.txt").reshape(4, 1) 
  24.     outputs = sigmoid(np.dot(inputs, synaptic_weights)) 
  25.     print(outputs) 
  26.     return outputs 
  27. training() 
  28. thinking(np.array([1,1,0,1])) 

[[360273]]

图源:Pixabay

我的第一个人工智能已经准备就绪,随时可以投入生产。即使它只能在极小的数据集上识别非常简单的模式,但现在我们可以扩展它,例如,尝试教授人工智能识别图片中的内容。学无止境,精进不休!

 

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2020-03-26 09:00:00

神经网络AI人工智能

2018-05-28 13:12:49

深度学习Python神经网络

2020-03-25 09:00:00

神经网络AI人工智能

2018-01-09 10:05:55

神经网络ClojureCortex

2017-02-10 09:30:33

数据化运营流量

2010-02-22 09:39:52

HTML 5Web

2024-03-01 19:53:37

PyBuilderPython开发

2019-07-12 07:26:26

神经网络数学乐高

2024-02-23 09:00:00

编程语言编译器工具

2021-05-17 22:40:56

区块链比特币技术

2020-05-11 13:44:38

神经网络人工智能深度学习

2022-03-30 08:24:25

操作系统内核开源软件

2017-07-19 10:22:07

2010-06-10 09:31:26

2020-07-02 15:32:23

Kubernetes容器架构

2019-01-18 12:39:45

云计算PaaS公有云

2018-04-18 07:01:59

Docker容器虚拟机

2015-11-17 16:11:07

Code Review

2018-03-22 13:34:59

TensorFlow神经网络

2016-11-02 14:18:45

搭建论坛Flask框架
点赞
收藏

51CTO技术栈公众号