Xiang神经网络总结(十一)

在这里插入图片描述
视觉识别任务

  1. 分类:就是识别出你这个图片主体是什么,比如我就仅仅说这个图片是个猫。
  2. 语义分割:图片上的每一个像素属于什么类别,针对于像素级别。
  3. 目标检测:给出图片上目标是什么以及目标的位置。
  4. 实力分割:给出图片上不同目标像素级别的分割。
    在这里插入图片描述达到语义分割最简单的思路是对于每一个像素进行判断,用一个窗口进行滑动。
    在这里插入图片描述
    这样有个问题:滑动窗口如果重叠,会使相邻特征被反复重复计算。若滑动窗口没有重叠,也得好几次对同一图片进行滑动。
    解决方案,我就卷积一次。
    在这里插入图片描述
    多个卷积核进行一次卷积。
    在这里插入图片描述
    得到C×H×W的特征响应图,对于其中每一个横条矩阵,预测了网络对于该像素属于哪一个类的预测。原来图像进行每一个像素的类别标注,多次卷积然后反向计算类别预测损失,更新卷积核值。
    在这里插入图片描述
    问题:每一步保持原始H×W的分辨率会使的显存需求特别大,导致显存爆炸。
    在这里插入图片描述
    介绍几种上采样方法:
    在这里插入图片描述
    在这里插入图片描述

1.直接4个小格全部由原始值代替。
2.四个小格某个位置为原始值,其他位置为0。
3.下采样的时候记录下采样位置,上采样的时候恢复对应位置值。
在这里插入图片描述
我们来看另一种方式。
首先回顾卷积操作,以上述三×三操作为例。
在这里插入图片描述

在这里插入图片描述
通过转置可以使得4维变回6维
在这里插入图片描述
在这里插入图片描述

上采样中x y z是可以学习的。
在这里插入图片描述
上层网络向上采样依赖于高层信息,但是很多低层信息也是有用的,所以两个桥接:低层卷积核和高层卷积核桥接,downpooling和uppooling桥接,保证低层信息不被丢失。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的神经网络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、付费专栏及课程。

余额充值