Python实现一个简单三层神经网络的搭建及测试 代码解析

目录
  • 1.初始化
  • 2.预测
  • 3.训练
  • 4.测试

废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层。本文所构建的神经网络隐藏层只有一层。一个神经网络主要由三部分构成(代码结构上):初始化,训练,和预测。首先我们先来初始化这个神经网络吧!

1.初始化

  • 我们所要初始化的内容包括:神经网络每层上的神经元个数(这个是根据实际问题输入输出而得到的,我们将它设置为一个可自定义量)。
  • 不同层间数据互相传送的权重值。
  • 激活函数(模拟自然界的神经元,刺激信号需要达到一定的程度才能激活神经元)

下面上代码:

 def __init__(self, input_nodes_num, hidden_nodes_num, output_nodes_num, lr):
        # 初始化神经元个数,可以直接修改
        self.input_nodes = input_nodes_num
        self.hidden_nodes = hidden_nodes_num
        self.output_nodes = output_nodes_num
        self.learning_rate = lr

        # 初始化权重值,利用正态分布函数进行随机初始化,均值为0,方差为神经元个数开方
        self.w_input_hidden = numpy.random.normal(0.0, pow(self.hidden_nodes, -0.5),
                                                  (self.hidden_nodes, self.input_nodes))
        self.w_hidden_output = numpy.random.normal(0.0, pow(self.output_nodes, -0.5),
                                                   (self.output_nodes, self.hidden_nodes))
        # 初始化激活函数,激活函数选用Sigmoid函数,更加平滑,接近自然界的神经元行为模式
        # lambda定义了一个匿名函数
        self.activation_function = lambda x: scipy.special.expit(x)
        pass

下面我们来解释一下上述代码段中的一些编程知识。首先是__init__()它是一个类的构造函数,在构建一个类的对象时会调用此函数,所以我们将神经网络初始化相关代码放到这个函数里。

self.w_input_hidden = numpy.random.normal(0.0, pow(self.hidden_nodes, -0.5),
                                                  (self.hidden_nodes, self.input_nodes))

这句代码使用了numpy库中的random.normal()函数,为输入层和隐藏层之间的数据传递初始化了权重值,这个函数会根据正态分布随机生成一个

self.hidden_nodes*self.input_nodes的矩阵(hidden_nodesinput_nodes表示隐藏层和输入层神经元的个数)。

self.activation_function = lambda x: scipy.special.expit(x)

这句代码使用lambda定义了一个匿名函数,将它赋值给激活函数,函数为sigmoid函数,是一条平滑的曲线,比较接近自然界神经元对于刺激信号的反应方式。

2.预测

按照正常顺序,初始化完成后应该进行训练,但由于训练较为复杂,且预测较为简单容易实现,我们先完成这一部分的代码。预测环节需要我们将输入信息进行处理,加权求和后传输给隐藏层神经元,经过激活函数并再次加权求和后,传输给输出层经过输出层神经元的处理得到最终的结果。代码片段如下:

    def query(self, inputs_list):
        # 转置将行向量转成列向量,将每组数据更好的分隔开来,方便后续矩阵点乘操作
        inputs = np.array(inputs_list, ndmin=2).T
        # 加权求和后经过sigmoid函数得到隐藏层输出
        hidden_inputs = np.dot(self.w_input_hidden, inputs)
        hidden_outputs = self.activation_function(hidden_inputs)
        # 加权求和后经过sigmoid函数得到最终输出
        final_inputs = np.dot(self.w_hidden_output, hidden_outputs)
        final_outputs = self.activation_function(final_inputs)
        # 得到输出数据列
        return final_outputs

这段代码没有什么好说的,比较简单,只需按照笔者上述的步骤做即可。有什么不懂的可以看注释或者留下评论。

3.训练

神经网络的训练问题较为复杂,涉及到神经网络的正向和反向传播,微积分的链式法则,矩阵运算,偏微分求导和梯度下降算法的一些知识,都是机器学习的一些基础知识,在这里就不做过多的赘述,过几天我会新发一篇详细讲一下。下面来了解一下训练代码段的主要任务:

  • 训练和预测一样都要首先读入一些输入并预测输出,不同的是,训练阶段我们是从训练数据集中获取数据,我们知道正确的输出是什么,而预测阶段我们只知道输入而输出需要通过我们训练的模型预测出来。首先训练阶段读入输入并按照当前的模型对其进行预测。
  • 基于训练预测结果和标注好的实际结果的误差更新各个层之间的权值。

下面来贴代码:

    def train(self, inputs_list, targets_list):
        # 将训练集和测试集中的数据转化为列向量
        inputs = np.array(inputs_list, ndmin=2).T
        targets = np.array(targets_list, ndmin=2).T
        # 隐藏层的输入为训练集与权重值的点乘,输出为激活函数的输出
        hidden_inputs = np.dot(self.w_input_hidden, inputs)
        hidden_outputs = self.activation_function(hidden_inputs)
        # 输出层的输入为隐藏层的输出,输出为最终结果
        final_inputs = np.dot(self.w_hidden_output, hidden_outputs)
        final_outputs = self.activation_function(final_inputs)
        # 损失函数
        output_errors = targets - final_outputs
        # 隐藏层的误差为权值矩阵的转置与输出误差的点乘
        hidden_errors = np.dot(self.w_hidden_output.T, output_errors)
        # 对权值进行更新
        self.w_hidden_output += self.learning_rate * np.dot((output_errors *
                                                             final_outputs * (1.0 - final_outputs)),
                                                            np.transpose(hidden_outputs))

        self.w_input_hidden += self.learning_rate * np.dot((hidden_errors *
                                                            hidden_outputs * (1.0 - hidden_outputs)),
                                                           np.transpose(inputs))

上述代码段可能对于一些刚接触机器学习或深度学习的同学来说可能有点不知所云或产生一种好复杂的感觉,但是这只是对反向传播算法,链式法则和偏导的综合应用。我会在另一篇随笔中讲述我的心得(可能讲得不好),感兴趣的可以看一下。

4.测试

三层神经网络构建完成,我用mnist训练集和测试集对其进行了测试,代码及结果如下:

# 初始化各层神经元个数,期中输入神经元个数取决于读入的因变量,而输出神经元个数取决于分类的可能性个数
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
# 学习率,每次调整步幅大小
learning_rate = 0.2

n = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
# 获取训练集信息
training_data_file = open('data/mnist_train.csv', 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()

for record in training_data_list:
    all_values = record.split(',')

    inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01

    targets = numpy.zeros(output_nodes) + 0.01
    targets[int(all_values[0])] = 0.99
    n.train(inputs, targets)
    pass
print('train successful!')
test_file = open('data/mnist_test.csv', 'r')
test_list = test_file.readlines()
test_file.close()
m = np.size(test_list)
j = 0.0
for record in test_list:
    test_values = record.split(',')
    np.asfarray(test_values)
    results = n.query(np.asfarray(test_values[1:]))
    if results[int(test_values[0])] == max(results):
        j += 1
    pass

print("正确率为;" + str(j/m))

到此这篇关于Python实现一个简单三层神经网络的搭建及测试 代码解析的文章就介绍到这了,更多相关Python实现三层神经网络的搭建及测试内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python网络爬虫精解之Beautiful Soup的使用说明

    目录 一.Beautiful Soup的介绍 二.Beautiful Soup的使用 1.节点选择器 2.提取信息 3.关联选择 4.方法选择器 5.CSS选择器 一.Beautiful Soup的介绍 Beautiful Soup是一个强大的解析工具,它借助网页结构和属性等特性来解析网页. 它提供一些函数来处理导航.搜索.修改分析树等功能,Beautiful Soup不需要考虑文档的编码格式.Beautiful Soup在解析时实际上需要依赖解析器,常用的解析器是lxml. 二.Beautif

  • Python测试网络连通性示例【基于ping】

    本文实例讲述了Python测试网络连通性.分享给大家供大家参考,具体如下: Python代码 #!/usr/bin/python # -*- coding:GBK -*- """Document: network script, keep network always working, using python3""" import os import time PING_RESULT = 0 NETWORK_RESULT = 0 def Dis

  • 详解python网络进程

    目录 一.多任务编程 二.进程 三.os.fork创建进程 3.1.进程ID和退出函数 四.孤儿和僵尸 4.1.孤儿进程 4.2.僵尸进程 4.3.如何避免僵尸进程的产生 五.Multiprocessing创建进程 5.1.multiprocessing进程属性 六.进程池 七.进程间通信(IPC) 7.1.管道通信(Pipe) 7.2.消息队列 7.3.共享内存 7.4.信号量(信号灯集) 一.多任务编程 意义:充分利用计算机的资源提高程序的运行效率 定义:通过应用程序利用计算机多个核心,达到

  • python网络通信图文详解

    目录 1. 常用的网络协议 2. 数据传输过程 3.  两台电脑通信 4. IP地址网络号与主机号的确定规则 5.  最开始集线器解决多台电脑通信 6. 使用交换机进行网络通信 7. 使用udp协议实现内网瘫痪 8. 使用路由器连接多个网络 9. 浏览器访问服务器的过程 总结 1. 常用的网络协议 ICMP协议又叫:网络控制协议 2. 数据传输过程 3.  两台电脑通信 网络传输的是数据的信号而不是电流 4. IP地址网络号与主机号的确定规则 通过ip地址和网络掩码的二进制数实行按位与运算,计算

  • 利用Python实现网络测试的脚本分享

    前言 最近同学让我帮忙写一个测试网络的工具.由于工作上的事情,断断续续地拖了很久才给出一个相对完整的版本.其实,我Python用的比较少,所以基本都是边查资料边写程序. 程序的主要逻辑如下: 读取一个excel文件中的ip列表,然后使用多线程调用ping统计每个ip的网络参数,最后把结果输出到excel文件中. 代码如下所示: #! /usr/bin/env python # -*- coding: UTF-8 -*- # File: pingtest_test.py # Date: 2008-

  • Python实现一个简单三层神经网络的搭建及测试 代码解析

    目录 1.初始化 2.预测 3.训练 4.测试 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网络主要由三部分构成(代码结构上):初始化,训练,和预测.首先我们先来初始化这个神经网络吧! 1.初始化 我们所要初始化的内容包括:神经网络每层上的神经元个数(这个是根据实际问题输入输出而得到的,我们将它设置为一个可自定义量). 不同层间数据互相传送的权重值. 激活函数(模拟自然界的神经元,刺激信号需要达到

  • Python实现一个简单的毕业生信息管理系统的示例代码

    写在前面: 从昨晚的梦里回忆起数据管理的作业: 实现一个自己的选题---- 毕业生信息管理系统,实现学生个人信息基本的增删改查, 我想了想前段时间刚学习的列表,这个简单啊 ,设计一个学生信息列表,然后列表里面再存每个学生详细信息的列表,然后来实现一个基本的增删查改,这个不难啊!直接开始撸代码! 上代码! def Menu():##菜单主界面 print('*'*22) print("* 查看毕业生列表输入: 1 *") print("* 添加毕业生信息输入: 2 *"

  • python实现一个简单的并查集的示例代码

    并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题.常常在使用中以森林来表示. 并查集有三种基本操作,获得根节点,判断两节点是否连通,以及将两不连通的节点相连(相当于将两节点各自的集合合并) 用UnionFind类来表示一个并查集,在构造函数中,初始化一个数组parent,parent[i]表示的含义为,索引为i的节点,它的直接父节点为parent[i].初始化时各个节点都不相连,因此初始化parent[i]=i,让自己成为自己的父节点,从而实现各节点不互连. def __ini

  • 用python实现一个简单的验证码

    我们经常在登录一个网站,或者注册的时候需要输入一个验证码,有时候觉得很烦,因为有些验证码不仅复杂还看不清,许多用户就会因为这些而懒得再登录或者注册之类的. 既然验证码会造成流失用户的风险,为什么大家都还要使用验证码呢? 这是验证码在一定程度上起到保护网站安全的作用,比如防止大规模恶意注册(比如手机验证码形式,一机一户),再比如反爬虫(至少不会轻易让你爬取数据)等,你看用户基数最大的12306,就会有各种验证码. 既然验证码这么重要,它的原理是什么?是怎么实现的? 它的原理其实很简单,就是在服务器

  • Python利用numpy实现三层神经网络的示例代码

    本文主要介绍了Python利用numpy实现三层神经网络的示例代码,分享给大家,具体如下: 其实神经网络很好实现,稍微有点基础的基本都可以实现出来.主要都是利用上面这个公式来做的. 这是神经网络的整体框架,一共是三层,分为输入层,隐藏层,输出层.现在我们先来讲解下从输出层到到第一个隐藏层. 使用的编译器是jupyter notebook import numpy as np #定义X,W1,B1 X = np.array([1.0, 0.5]) w1 = np.array([[0.1, 0.3,

  • 利用Python实现一个简单的Web汇率计算器

    目录 Dash是什么 网页搭建步骤 安装相关依赖(库) 导入相关包 构建app 构建结果输出函数 网页结构Layout搭建 callback回调参数设定 界面效果 前段时间刚接触到前端网页开发,但是对于刚入门的小白而言,像flask.Django等这类稍大型的框架确实不太适合,今天这个Dash是集众家之长于一体的轻量化Web开发库. Dash是什么 Dash 是一个用于构建基于 Web 的应用程序的 Python 库,无需 JavaScript . Dash 同时也是用于创建分析 Web 应用程

  • Python实现一个简单的验证码程序

    老师讲完random函数,自己写的,虽然和老师示例的不那么美观,智能,但是也自己想出来的,所以记录一下,代码就需要自己不断的自己练习,实战,才能提高啊!不然就像我们这些大部分靠自学的人,何时能学会.还有就是,这次听老师的,把自己的代码添加注释,所以这次把很简单的代码都写上了注释,而且很大白话,不管有没有接触过python的,我相信仔细看了,肯定能看懂.如果看完,再自己尝试着默写出来,那就是更好到了,好了进入正题: 自己写的: __Author__ = "Zhang Peng" impo

  • Python实现一个简单的MySQL类

    本文实例讲述了Python实现一个简单的MySQL类.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- # Created on 2011-2-19 # @author: xiaoxiao import MySQLdb import sys __all__ = ['MySQL'] class MySQL(object):     '''     MySQL     '''     conn

  • 如何利用Python开发一个简单的猜数字游戏

    前言 本文介绍如何使用Python制作一个简单的猜数字游戏. 游戏规则 玩家将猜测一个数字.如果猜测是正确的,玩家赢.如果不正确,程序会提示玩家所猜的数字与实际数字相比是"大(high)"还是"小(low)",如此往复直到玩家猜对数字. 准备好Python3 首先,需要在计算机上安装Python.可以从Python官网下载并安装.本教程需要使用最新版的Python 3(版本3.x.x). 确保选中将Python添加到PATH变量的框.如果不这样做,将很难运行该程序.

  • python实现一个简单的ping工具方法

    继上一篇计算checksum校验和,本章通过socket套接字,struct字节打包成二进制,select返回套接字的文件描述符的结合,实现一个简单的ping工具. #!/usr/bin/python3.6.4 #!coding:utf-8 __author__ = 'Rosefinch' __date__ = '2018/5/31 22:27' import time import struct import socket import select import sys def chesks

随机推荐