上面我们说了神经网络的基础知识,根据上章的基础尝试搭建一个标准的3层神经网络,参考https://www.cnblogs.com/bestExpert/p/9128645.html

1.框架代码

1.>初始化函数 — 设定输入层节点、隐藏层节点、输出层节点的数量,设置学习率和各层的权重

2.>训练 — 学习给定训练集样本后,优化权重

3.>查询 — 给定输入,从输出节点给出答案

2.初始化网络

在init函数里面增加节点、学习率的初始化

3.权重--网络的核心

网路中最重要的部分是链接权重,我们使用这些权重来计算前馈信号、反向传播误差,并且在试图改进网路时优化链接权重本身。可以使用矩阵简明地表示权重,因为是三层结构,所以我们需要创建:

♦ 在输入层与隐藏层之间的连接权重矩阵Winput_hidden,大小为hidden_nodes乘以input_nodes

♦ 在隐藏层与输出层之间的连接权重矩阵Whidden_output,大小为output_nodes乘以hidden_nodes

我们使用 numpy.randon.rand(row,columns) 或者numpy.random.normal()生成权重

如下生成一个3*3大小,数值区间为±根号下hnodes的倒数

4.查询网络

query()函数接受神经网络的输入,返回网络的输出。需要传递来自输入层节点的输入信号,通过隐藏层,最后从输出层输出。当信号馈送至给定的隐藏层节点或输出层节点时,我们使用链接权重调节信号,还应用S激活函数抑制来自这些节点的信号。

1.>定义输入值为input_list,拆分成多维数组,利用python的nmpy.array(input_list,ndmin=2).T

2.>利用输入矩阵点乘于链接权重计算出隐藏层输出:Xhidden=Whidden_input * I ,在python中我们可以利用numpy.dot()来实现矩阵的点乘

3.>对输出矩阵应用激活函数:Ohidden=sigmoid(Xhidden),在python中我们可以利用scipy.special.expit(x)

隐藏层到输出层过程同上,整合之后代码如下:

5.训练网络:目的是根据误差优化权重

第一部分:针对给定的训练样本计算输出,这与我们刚刚在query()函数上所做的没什么区别

第二部分:将计算得到的输出与所需输出对比,使用差值来指导网络权重的更新。

第一部分和上面的一样,将不再细分,下来主要细分第二部分

1.>train()函数增加目标值列表参数,并转换成多维数组,方式同input的转换,在python中我们通过targets=numpy.array(target_input,ndmin=2).T

2.>计算输出层误差,为目标值减去输出值,output_errors=target-final_output

3.>计算得到隐藏层误差,errorhidden=weightThidden_output*erroroutput,在python中我们可以通过dot()方法计算矩阵点乘得到hidden_errors

4.>计算隐藏层到输出层的权重变化量,根据公式ΔWJ,K = & * E * sigmoid( Ofinal_input)  *  (1 - sigmoid(Ofinal_input)) • OjT ,&为学习率,sigmoid为激活函数,Oj为输出值的输入矩阵

5.>计算输入层到隐藏层的权重变化量,同上。

总结前面5步如下:

一个简单的3层神经网络就搭建完了,这些代码可用于创建、训练、查询3层神经网络,进行几乎任何任务,下面我们将进行特定任务,学习识别手写数字,上面的代码合起来如下:

import numpy as np
import scipy.special as spc class neuralNetwork: def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes self.lr = learningrate self.wih = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))
self.who = np.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes)) self.activation_function = lambda x: spc.expit(x)
pass def train(self, input_list, target_list):
inputs = np.array(input_list, ndmin=2).T hidden_input = np.dot(self.wih, input)
hidden_output = self.activation_function(hidden_input) final_input = np.dot(self.who, hidden_output)
final_output = self.activation_function(final_input) targets = np.array(target_list, ndmin=2).T output_error = targets - final_output hidden_errors = np.dot(self.who.T, output_error) self.who += self.lr * np.dot(output_error * final_output * (1.0 - final_output), np.transpose(hidden_output))
self.wih += self.lr * np.dot(hidden_errors * hidden_output * (1.0 - hidden_output), np.transpose(inputs))
pass def query(self, input_list):
inputs = np.array(input_list, ndmin=2).T hidden_input = np.dot(self.wih, inputs)
hidden_output = self.activation_function(hidden_input) final_input = np.dot(self.who, hidden_output)
final_output = self.activation_function(final_input) return final_output 也可以在github上面下载,里面有详细的注释:https://github.com/pythonAndAI/nerve-net/tree/master/threeLayerDome

标准3层神经网络搭建Demo的更多相关文章

  1. 用标准3层神经网络实现MNIST识别

    一.MINIST数据集下载 1.https://pjreddie.com/projects/mnist-in-csv/      此网站提供了mnist_train.csv和mnist_test.cs ...

  2. C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

    前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DDD领域驱动设计初 ...

  3. Web层的搭建

    Web层的搭建 前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DD ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...

  5. [DeeplearningAI笔记]神经网络与深度学习3.2_3.11(激活函数)浅层神经网络

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.2 神经网络表示 对于一个由输入层,隐藏层,输出层三层所组成的神经网络来说,输入层,即输入数据被称为第0层,中间层被称为第1层,输出层被称为 ...

  6. WCF快速搭建Demo

    WCF快速搭建Demo ps:本Demo只是演示如何快速建立WCF 1.首先完成IBLL.BLL.Model层的搭建,由于数据访问层不是重点,WCF搭建才是主要内容,所以本Demo略去数据访问层. 新 ...

  7. ng-深度学习-课程笔记-4: 浅层神经网络(Week3)

    1 神经网络概览( Neural Networks Overview ) 先来快速过一遍如何实现神经网络. 首先需要输入特征x,参数w和b,计算出z,然后用激活函数计算出a,在神经网络中我们要做多次这 ...

  8. DDD领域驱动设计初探(七):Web层的搭建

    前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DDD领域驱动设计初 ...

  9. 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第三周:浅层神经网络(Shallow neural networks) -课程笔记

    第三周:浅层神经网络(Shallow neural networks) 3.1 神经网络概述(Neural Network Overview) 使用符号$ ^{[

随机推荐

  1. kubernetes系列08—service资源详解

    本文收录在容器技术学习系列文章总目录 1.认识service 1.1 为什么要使用service Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结 ...

  2. 创建简单的npm脚手架

    前言 vue-cli, webpack-cli 等脚手架是不是用起来爱不释手?自己写了个模版每次来回复制粘贴代码是不是很难维护?如果你是对前端.Node操作有一定的了解,同时也存在以上疑问,那就请尽情 ...

  3. OpenXMl倒出word、PDF

    OpenXMl倒出word.PDF @using MarkdownSharp @{     ViewBag.Title = "预览";     Layout = "~/V ...

  4. WebAPI Angularjs 上传文件

    直接上代码 HTML页面代码: <label>资源URL</label> <input type="text" class="form-co ...

  5. Source-Based XSS Test Cases

    Single Reflection Case 01 - Direct URL Injection (no parameter) payload: https://brutelogic.com.br/x ...

  6. Python笔记-高阶函数

    1.函数式编程 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! 传入函数 既然 ...

  7. Numpy库的学习(三)

    今天我们继续学习一下Numpy库的学习 废话不多说 ,开始讲 比如我们现在想创建一个0-14这样一个15位的数组 可以直接写,但是很麻烦,Numpy中就给我们了一个方便创建的方法 numpy中有一个a ...

  8. curl 命令-接口测试

    在linux/Unix 为代表的os上, 对后端进行测试, 模拟连接请求都会书写脚本 场景: 在Linux 上接口测试工具有ab, restClient, postman等, 最常用的方法是curl进 ...

  9. C# 匿名对象(匿名类型)、var、动态类型 dynamic——实用之:过滤类属性、字段实用dynamic

    例子 返回一个LIst<oject>类型 而oject含有 30个字段 而我只需要两个字段.这里实用dynamic 和 linq. 上代码: 注意select new {} 为匿名类型,这 ...

  10. SQLServer之数据库行锁

    行锁使用注意事项 1.ROWLOCK行级锁确保在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改.因而行级锁即可保证数据的一致性,又能提高数据操作的并发性. 2.ROWLOCK告诉SQ ...