推荐 :手把手教你用Python创建简单的神经网络
了解神经网络工作方式的最佳途径莫过于亲自创建一个神经网络,本文将演示如何做到这一点。
神经网络(NN)又称人工神经网络(ANN),是机器学习领域中基于生物神经网络概念的学习算法的一个子集。
拥有五年以上经验的德国机器学习专家Andrey Bulezyuk声称:“神经网络正在彻底改变机器学习,因为它们能够在广泛的学科和行业中为抽象对象高效建模。”
人工神经网络基本上由以下组件组成:
输入层:接收并传递数据
隐藏层
输出层
各层之间的权重
每个隐藏层都有一个激活函数。在这个简单的神经网络Python教程中,我们将使用Sigmoid激活函数。
神经网络有多种类型。在本项目中,我们将创建前馈或感知神经网络。这种类型的ANN直接将数据从前向后传递。
前馈神经元的训练往往需要反向传播,它为网络提供了相应的输入和输出集。当输入数据被传送到神经元时,经过处理后,产生一个输出。
下面的图表显示了一个简单的神经网络的结构:
了解神经网络如何工作的最佳方法是学习如何从头开始构建神经网络(而不是采用任何库)。
在本文中,我们将演示如何利用Python编程语言创建一个简单的神经网络。
问题
如下是一个展示问题的表格。
我们将提供一个新的数据集,利用它训练神经网络,从而能够预测正确的输出值。
正如上表所示,输出值总是等于输入部分中的第一个值。因此,我们期望输出的值为1。
让我们看看是否可以使用Python代码来得出相同的结果(你可以在本文末尾仔细阅读这个项目的代码,然后再继续阅读本文)。
创建一个NeuralNetwork类
我们将用Python创建一个NeuralNetwork类来训练神经元,以期给出准确的预测。这个类还会有其他的帮助函数。
即使我们不会在这个简单的神经网络示例中使用神经网络库,我们也将导入numpy库来辅助计算。
numpy库提供了以下四种重要方法:
exp—用于生成自然指数
array—用于生成矩阵
dot—用于矩阵相乘
random—用于生成随机数。请注意,我们将生成随机数,以确保它们的有效分布。
- 应用Sigmoid函数
我们将使用Sigmoid函数,来绘制一个特征“S”型曲线,作为神经网络的激活函数。
此函数可以将任何值映射到0到1之间的值,它将有助于我们对输入的加权和归一化。
此后,我们将创建Sigmoid函数的导数,以帮助计算权重的调整参数。
可以利用Sigmoid函数的输出来生成它的导数。例如,如果输出变量为“x”,则其导数为x*(1-x)。
- 训练模型
这是我们教神经网络做出准确预测的阶段。每个输入都有一个权重-可为正值或负值。这意味着:有较大的正权重或负权重的输入会对结果的输出产生更大的影响。请记住,我们最初是通过为每个随机数分配一个权重后开始的。
下面是这个神经网络示例的训练过程:
第一步:从训练数据集中提取输入,根据训练数据集的权重进行调整,并通过一种计算神经网络输出的方法对其进行筛选。
第二步:计算反向传播错误率。在这种情况下,它是神经元的预测输出与训练数据集的期望输出之间的差异。
第三步:利用误差加权导数公式,根据所得到的误差范围,进行了一些较小的权值调整。
第四步:对这一过程进行15000次迭代。在每次迭代中,整个训练集被同时处理。
我们使用“.T”函数将矩阵从水平位置转换为垂直位置。因此,数字将以如下方式存储:
最终,神经元的权重将根据所提供的训练数据进行优化。随后,如果让神经元考虑一个新的状态,与先前的状态相同,它便可以作出一个准确的预测。这就是反向传播的方式。
打包运行
最后,NeuralNetwork类初始化成功后,可以运行代码了。
下面是如何在Python项目中创建神经网络的完整代码:
import numpy as np class NeuralNetwork(): def __init__(self): # seeding for random number generation np.random.seed(1) #converting weights to a 3 by 1 matrix with values from -1 to 1 and mean of 0 self.synaptic_weights = 2 * np.random.random((3, 1)) - 1 def sigmoid(self, x): #applying the sigmoid function return 1 / (1 + np.exp(-x)) def sigmoid_derivative(self, x): #computing derivative to the Sigmoid function return x * (1 - x) def train(self, training_inputs, training_outputs, training_iterations): #training the model to make accurate predictions while adjusting weights continually for iteration in range(training_iterations): #siphon the training data via the neuron output = self.think(training_inputs) #computing error rate for back-propagation error = training_outputs - output #performing weight adjustments adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output)) self.synaptic_weights += adjustments def think(self, inputs): #passing the inputs via the neuron to get output #converting values to floats inputs = inputs.astype(float) output = self.sigmoid(np.dot(inputs, self.synaptic_weights)) return output if __name__ == "__main__": #initializing the neuron class neural_network = NeuralNetwork() print("Beginning Randomly Generated Weights: ") print(neural_network.synaptic_weights) #training data consisting of 4 examples--3 input values and 1 output training_inputs = np.array([[0,0,1], [1,1,1], [1,0,1], [0,1,1]]) training_outputs = np.array([[0,1,1,0]]).T #training taking place neural_network.train(training_inputs, training_outputs, 15000) print("Ending Weights After Training: ") print(neural_network.synaptic_weights) user_input_one = str(input("User Input One: ")) user_input_two = str(input("User Input Two: ")) user_input_three = str(input("User Input Three: ")) print("Considering New Situation: ", user_input_one, user_input_two, user_input_three) print("New Output data: ") print(neural_network.think(np.array([user_input_one, user_input_two, user_input_three]))) print("Wow, we did it!")
运行代码之后的输出:
这样,我们便成功地创建了一个简单的神经网络。
神经元首先给自己分配一些随机权重,接着,利用训练实例进行了自我训练。
之后,如果出现新的状态[1,0,0],则它得出的数值为0.9999584。
还记得我们想要的正确答案是1吗?
这个数值非常接近,Sigmoid函数输出值在0到1之间。
当然,在这个例子中,我们只使用一个神经元网络来完成简单的任务。如果我们把几千个人工神经网络连接在一起,情况将会是怎样呢?我们能不能完全模仿人类的思维方式呢?
原文发布时间为:2018-12-18
本文作者:Michael Garbade
本文来自云栖社区合作伙伴“ 数据分析 ”,了解相关信息可以关注“
ecshujufenxi”微信公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
第一届PolarDB数据库性能大赛Java选手分享
天池大赛-第一届PolarDB数据库性能大赛,比赛以NVME Optane SSD为背景,在此之上开发单机存储引擎比拼性能,支持C++和Java语言。内部赛小试牛刀后,汲取了一些经验,作为这么多年的资深JAVAer,还是想继续挑战一把,这次参加外部赛,成绩是Java语言排名第一,总排名20(队伍名称:neoremind),与C++第一差距在2.1%(<9s)。众所周知,类似的系统如果想榨干硬件,那么越贴近底层越好,Java存在一些天然的劣势,跑出这样的成绩也是尽力了,虽然不是前十的C++高手,但是思想架构是通用的,抛出我的解法和代码,供学习交流。 本文是解题报告,源码地址 https://github.com/neoremind/2018-polar-race。 1. 赛题介绍 评测程序分为2个阶段: 1. 正确性评测 此阶段评测程序
- 下一篇
Golang学习笔记之错误处理error、panic (抛出错误),recover(捕获错误)
一、error错误表示程序中出现了异常情况。Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 • error类型是go语言的一种内置类型,使用的时候不用特定去import因为它本质上是一个接口error类型是一个接口类型,这是它的定义: 1type error interface { 2 Error() string 3} (1)一个例子理解error 1package main 2import ( 3 "fmt" 4 "os" 5) 6func main() { 7 //试图打开一个并不存在的文件,这将会返回一个error 8 f, err := os.Open("/test.txt") 9 if err != nil { 10 fmt.Println(err
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器
- CentOS关闭SELinux安全模块
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19