python实现经典的3层神经网络

python实现经典的3层神经网络

作者:Student Guo
时间:2022/6/11
单位:Lanzhou University

前言

随着信息技术的快速发展,利用计算机识别手写数字节省了大量的人工识别成本,具有一定的现实意义。通过Python语言构建神经网络,以手写数字识别为研究对象,不仅对神经网络的原理和数学建模做了详细阐述,还用Python语言模拟实现神经网络模型,通过训练神经网络模型输出识别手写数字的准确度以及相关影响因子的分析,实现了对手写数字的识别。

一、神经网络是什么?

即: 人工神经网络(Artificial Neural Networks,简写为
ANNs)也简称为神经网络(NNs)它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。 简而言之是生物神经元可以接受许多输人,而不仅仅是一个输人,树突收集了这些电信号,将其组合形成更强的电信号。如果信号足够强,超过阈值,神经元就会发射信号,沿着轴突,到达终端,将信号传递给下一个神经元的树突。

二、为什么是三层?

因为三层的神经网络包含了输入层、隐藏层、以及输出层,已经可以完整的展现出神经网络最基本的结构方便学习。
如图是三层的神经网络模型,包含输入层(最左侧),隐藏层(中间),输出层(最右侧)。三层的神经网络模型,包含输入层(最左侧),隐藏层(中间),输出层(最右侧)

三,神经网络模型的构建

1.神经元的生物机理

即: 从神经元的工作原理来看,若是用数学思想来模拟的话,可以这样理解生物的神经元输人电信号后再输出另一个电信号。不过生物神经元与简单的线性函数不一样,不能简单地对输人做出反应。在产生输出之前,输人必须达到一个闽值,只有在输人明显的信号时才能有输出。 从上述的数学思想模拟构建神经元的工作机制中可以显示为,当输人达到闽值时,输出才有反映,并形成图形表达式,但是这种阶跃函数太过直接,现实的神经网络不会这么刻板,所以在用数学思维构建神经网络时,可以选择多种具有一定曲线的激活函数,常用的激活函数包含:Sigmoid函数、Tanh函数、ReLU函数。
我们将用的是Sigmoid函数,也是很常见的一种激活函数,需要引入这个库。

# 为了引入sigmoid函数作为神经网络的激活函数
import scipy.special

2.给神经元节点之间引入权重因子(即通过numpy产生和改变 的权重矩阵)

即: 上述构建了一个神经网络,但是这个神经网络会是一个有输人就输出的神经网络,会一成不变,不会自学习。通过观察能够调整的就是节点与节点之间连接的强弱,所以引人权重来表示节点之间的强弱关系。 权重是神经网络进行学习的内容,这些权重持续进行优化,进而得到越来越好的输出结果。通过给出初始权重,输人通过初始权重,得到了一次输出结果,这样神经网络就初具雏形了。
整个计算过程分两段:输人层到隐藏层之间以及隐藏层到输出层之间。
(1)输人层:输人层不需要激活函数的处理,输人值是784个像素点归一化后的0.01-1之间的数字;输出值是awa+bwb+cwc+(一共加784个节点),利用矩阵乘法计算每一个节点的输出值,也就是隐藏层的输人值,输出值=输人层权重矩阵输人值矩阵;
(2)隐藏层:输人值是输人层的输出值,这个值就是激活函数的X,输出值是利用激活函数进行计算的结果。
(3)输出层:输人值是隐藏层的输出值先用矩阵乘法公式计算,中间层权重矩阵*隐藏层输出值矩阵,得出x值后,再用激活函数计算得出输出层的输出值。

四,神经网络模型的学习

1.误差反向传播

即:在输出层的输出结果,与我们设置的目标结果做差后会得到一个误差值,这个误差值由之前我们构建的权重矩阵的权重因子来反向求导承受。

2.减小误差使用梯度下降法

即: 在计算上,使用梯度下降,如图所示简单来说就是使用更小的步子朝着实际的最小值方向迈进,直到对于所得到的精度感到满意为止。最小二乘法的思想就是通过找到目标直线(y=wx+b)与样本点的Y、偏差平方和最小的情况下w和b的取值。但是在神经网络中特征向量和隐藏神经元较多,解方程很麻烦,所采用的是不断设置系数w和b的值,通过“试探”(猜)的方法计算方程各向量偏导数(该点直线的斜率)为0时的w和b取值,由于是向曲线或曲面底部下探,这个过程称为梯度下降。(变化率最快的方向导数称为梯度),每次“试探”计算梯度的步长参数称为学习率,公式:B=6o-af’ (9})(。是步长,e。是当前权重或偏置项,e是更新后的权重或偏置项)。通过梯度下降,找损失函数导数为0(接近o>时的自变量w和b的取值,即找w, b的最优值。这样就可以快速计算出反向传播的误差值以及权重最有值。在这里插入图片描述
在这里插入图片描述

五,代码展示

import numpy
# 为了引入sigmoid函数作为神经网络的激活函数
import scipy.special


# 神经网络类定义
class neuralNetwork:

    # 神经网络这个对象的初始化
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        # 设置每个输入、隐藏、输出层中的节点数
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes

        # wih是输入层(input) 与隐藏层(hidden)的之间的权重配比
        
  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python实现三层神经网络通常使用深度学习库,如TensorFlow或PyTorch。以下是一个简单的示例,使用Keras库(TensorFlow的一个高级接口)来构建一个包含输入、隐藏和输出三层神经网络: ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 定义神经网络模型 def create_three_layer_neural_network(input_dim, hidden_units, output_dim): model = Sequential() # 输入 model.add(Dense(hidden_units, activation='relu', input_dim=input_dim)) # 隐藏 model.add(Dense(hidden_units, activation='relu')) # 输出(根据具体任务选择激活函数,如对于分类问题通常用softmax,回归问题用linear) model.add(Dense(output_dim, activation='sigmoid' if output_dim > 1 else 'linear')) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy' if output_dim == 1 else 'categorical_crossentropy', metrics=['accuracy']) return model # 示例参数 input_dim = 784 # 假设输入是28x28的灰度图像 hidden_units = 64 output_dim = 10 # 对于手写数字识别,输出10个类别 # 创建并编译模型 model = create_three_layer_neural_network(input_dim, hidden_units, output_dim) ``` 在这个例子中,我们首先创建了一个Sequential模型,然后添加了两个全连接(Dense),它们分别对应输入和隐藏。最后一根据任务类型(二分类或多分类)有不同的激活函数。最后,我们编译模型,选择合适的优化器、损失函数和评估指标。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值