神经网络构建与实现:从设计到代码
立即解锁
发布时间: 2025-09-13 01:59:29 阅读量: 5 订阅数: 44 AIGC 

### 神经网络构建与实现:从设计到代码
#### 1. 神经网络概述与目标
神经网络比感知机强大得多,感知机需要线性可分的简单数据,而神经网络可以处理复杂的数据,如现实世界物体的照片。在MNIST这样简单的数据集上,感知机每识别十个字符几乎会出现一个错误,而我们的目标是构建一个MNIST分类器,达到99%的准确率,即每识别100个字符只出现一个错误。
为了实现这个目标,我们制定了以下计划:
- 设计一个能对MNIST数字进行分类的神经网络。
- 编写神经网络的分类代码。
- 编写神经网络的训练代码。
#### 2. 从感知机构建神经网络
我们从已有的感知机开始构建神经网络。在之前,我们以两种不同的方式组合感知机:一是同时用多个MNIST图像训练感知机;二是用十个感知机对十个可能的数字进行分类。实际上,我们是使用矩阵来实现类似“堆叠”和“并行化”感知机的效果。现在,我们将这些扩展后的感知机作为构建神经网络的基础。
#### 3. 链式感知机构建神经网络
通过串联两个感知机可以构建一个神经网络。每个感知机有自己的权重和Sigmoid操作,第一个感知机的输出是第二个感知机的输入。这种结构过去被称为多层感知机或人工神经网络,现在通常称为神经网络。该网络有三层:输入层、隐藏层和输出层。
隐藏层的节点(除了偏置节点)由输入层的节点计算得出。输入层和隐藏层都有一个偏置节点,其值固定为1。需要注意的是,当我们说“某层有10个节点”时,意味着该层由一个有10列的矩阵表示,行数根据需要而定。有时人们会将神经网络中的节点称为神经元,严格来说,神经元不仅包括节点,还包括影响其值的前一层节点和中间的操作。层与层之间的函数称为激活函数,在我们设计的网络中,最初两层的激活函数都是Sigmoid函数。
#### 4. 确定各层节点数量
- **输入层**:和感知机一样,对于MNIST的784像素图像,每个输入变量对应一个输入节点,再加上偏置节点,所以输入层有785个节点,输入矩阵每行代表一个图像,有785列。
- **输出层**:MNIST有10个类别,所以输出层有10个节点,输出矩阵每行代表一个图像,有10列。
- **隐藏层**:隐藏层节点数量由我们决定,一般在输入层和输出层节点数量之间。我们暂时设置为200个节点,加上偏置节点后为201个。选择201是为了提醒我们其中一个隐藏节点是特殊的偏置节点,其值固定为1。
神经网络有两个权重矩阵:一个在输入层和隐藏层之间,另一个在隐藏层和输出层之间。每个权重矩阵的行数等于其输入元素的数量,列数等于其输出元素的数量,即$w_1$是$(n, d)$,$w_2$是$(d, k)$。网络中的操作如下:
$H = sigmoid(X \cdot W_1)$
$\hat{Y} = sigmoid(H \cdot W_2)$
#### 5. 引入Softmax函数
大多数神经网络会将输出层前的最后一个Sigmoid函数替换为Softmax函数。Softmax函数接受一个数组(称为logits),返回一个相同大小的数组。其公式为:对每个logit取指数,然后除以所有logit指数的总和。
使用Softmax函数的好处是,它返回的数组中每个元素在0到1之间,且所有元素之和为1,这样我们可以将其输出解释为概率。例如,对于一个三分类器,经过隐藏层后的加权和得到的logits为$[0.5, 3.1, 1.6]$,经过Softmax函数处理后得到$[0.05724785, 0.77077009, 0.17198205]$,我们可以直观地看出该物品属于第二类的概率为77%。
最终设计的神经网络:输入层有785列(每个像素加偏置),激活函数为Sigmoid;隐藏层有201列(含偏置),激活函数为Softmax;输出层有10列,对应MNIST的10个类别。权重矩阵的维度确保矩阵乘法能够正确进行。
#### 6. 神经网络设计总结
通过连接两个感知机,我们设计了一个具有输入层、隐藏层和输出层的神经网络。每层由节点(神经元)组成,层与层之间有加权和与激活函数操作。我们使用Sigmoid作为输入层的激活函数,Softmax作为隐藏层的激活函数,输入层和隐藏层都有偏置节点,值固定为1。基于这些知识,我们设计了一个用于识别MNIST字符的网络,接下来将把这
0
0
复制全文
相关推荐









