Xiang神经网络总结(五)

让我们敲开卷积神经网络的大门!
在这里插入图片描述
结构图心中有,走在路上不会丢。
首先我们研究图像怎么表示
在这里插入图片描述
还是直接展开为列向量。
在这里插入图片描述
全连接神经网络的瓶颈:全连接网络每一个隐层的神经元都和前层的所有输入连接,考虑CIFAR10.一个神经元权值个数有3072+1(偏置)个,如果图像大小2002003,一个神经元就12万个权值个数,这只是一个神经元,一层可能有一千个,有好多隐层,这谁顶得住,生产队的牛都顶不住啊!
我们刚刚在前一节用卷积核得到了特征相应图组,并考虑忽略位置信息的平均特征响应图组,这个权值少啊!把这个平均特征权值当作全连接神经网络的输入,不就解决了参数庞大的,易过拟合,不易训练的问题了嘛!
在这里插入图片描述
基于此我们得到了卷积神经网络的结构图!
在这里插入图片描述
卷积神经网络一个典型的场景。
为什么要有这么多的ConV层?实际上前层的纹理基元所需的ConV层并不多,后层的ConV层逐渐递进,有基元信息慢慢抽象出了语义信息。
在这里插入图片描述
这里注意我们的卷积核组得到的特征响应图组我们并不关心位置信息对我们图片分类的影响,所以我们对得到的权值向量进行平均(在最后与FC层连接的卷积核)。在这里插入图片描述
在这里插入图片描述
卷积操作,和我们之前提到的卷积操作并没有什么本质上的区别。
在这里插入图片描述

在这里插入图片描述
特征响应图组的个数等于使用卷积核的个数。一想就懂。在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这里特征响应图因为没有做平均所以还是记录了对应位置对对应卷积核的响应信息。
在这里插入图片描述
在这里插入图片描述
一些计算特征:
在这里插入图片描述

在这里插入图片描述
ReLu层就是对特征响应图进行非线性操作。
在这里插入图片描述
接下来我们讨论POOL层
在这里插入图片描述
pooling层,再不损失特征响应图信息的情况下,尽量的减少特征响应图的尺寸,方便计算。在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
最后一个pooling层对得到的裁剪后的特征响应图进行平均得到:在这里插入图片描述
平均值,忽略位置信息,连接全连接层,正向传播,反向更新!成了!

在这里插入图片描述
我们讨论图像增强的问题。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
以下是一个简单的神经网络Java代码示例: ```java public class NeuralNetwork { private double[] input; // 输入层 private double[][][] weights; // 权重 private double[][] bias; // 偏置 private double[][] output; // 输出层 private int[] layerSizes; // 每层神经元数量 public NeuralNetwork(int... layerSizes) { this.layerSizes = layerSizes; this.weights = new double[layerSizes.length - 1][][]; this.bias = new double[layerSizes.length - 1][]; this.output = new double[layerSizes.length][]; this.input = new double[layerSizes[0]]; // 初始化权重和偏置 for (int i = 0; i < layerSizes.length - 1; i++) { weights[i] = new double[layerSizes[i + 1]][layerSizes[i]]; bias[i] = new double[layerSizes[i + 1]]; for (int j = 0; j < layerSizes[i + 1]; j++) { for (int k = 0; k < layerSizes[i]; k++) { weights[i][j][k] = Math.random() * 2 - 1; // 随机初始化权重 } bias[i][j] = Math.random() * 2 - 1; // 随机初始化偏置 } } // 初始化输出层 for (int i = 0; i < layerSizes.length; i++) { output[i] = new double[layerSizes[i]]; } } // 激活函数,这里使用sigmoid函数 private double sigmoid(double x) { return 1 / (1 + Math.exp(-x)); } // 前向传播 public double[] feedForward(double... input) { if (input.length != layerSizes[0]) { throw new IllegalArgumentException("输入层大小错误"); } this.input = input; for (int i = 0; i < layerSizes.length - 1; i++) { for (int j = 0; j < layerSizes[i + 1]; j++) { double sum = 0; for (int k = 0; k < layerSizes[i]; k++) { sum += weights[i][j][k] * input[k]; } sum += bias[i][j]; output[i + 1][j] = sigmoid(sum); } input = output[i + 1]; } return output[layerSizes.length - 1]; } // 训练网络 public void train(double[] input, double[] targetOutput, double learningRate) { if (input.length != layerSizes[0]) { throw new IllegalArgumentException("输入层大小错误"); } if (targetOutput.length != layerSizes[layerSizes.length - 1]) { throw new IllegalArgumentException("目标输出层大小错误"); } // 前向传播 feedForward(input); // 反向传播 double[][] delta = new double[layerSizes.length][]; for (int i = layerSizes.length - 1; i >= 1; i--) { delta[i] = new double[layerSizes[i]]; if (i == layerSizes.length - 1) { for (int j = 0; j < layerSizes[i]; j++) { delta[i][j] = (output[i][j] - targetOutput[j]) * output[i][j] * (1 - output[i][j]); } } else { for (int j = 0; j < layerSizes[i]; j++) { double sum = 0; for (int k = 0; k < layerSizes[i + 1]; k++) { sum += weights[i][k][j] * delta[i + 1][k]; } delta[i][j] = sum * output[i][j] * (1 - output[i][j]); } } } // 更新权重和偏置 for (int i = 0; i < layerSizes.length - 1; i++) { for (int j = 0; j < layerSizes[i + 1]; j++) { for (int k = 0; k < layerSizes[i]; k++) { weights[i][j][k] -= learningRate * delta[i + 1][j] * input[k]; } bias[i][j] -= learningRate * delta[i + 1][j]; } input = output[i + 1]; } } } ``` 这个神经网络有一个输入层,一个输出层和任意数量的隐藏层。可以使用`NeuralNetwork`类的构造函数指定每个层的神经元数量。`feedForward`方法将输入传递到网络并返回输出,`train`方法用于训练网络并更新权重和偏置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值