Xiang神经网络总结(二)

线性分类器

  1. 数据集介绍
    在这里插入图片描述

  2. 核心流程图在这里插入图片描述

  3. 图像类型:二进制图,灰度图,彩色图在这里插入图片描述
    二进制图像:图像的每一个像素值都是非0及1,非黑即白
    灰度图像:图像的每一像素值都是0-255之间的值
    彩色图像:RGB表示

  4. 图像表示

    必要性:在这里插入图片描述
    转换方法:在这里插入图片描述
    [R1,G1,B1,R2,G2,B2,R3,G3,B3]^T 三元组

  5. 线性分类器

  • 定义

在这里插入图片描述
每个类的参数w和b初始值是随意设置的,通过反向传播使得参数w和参数b得到更新。
Wi的函数等于类别数。

  • 线性分类器决策
    在这里插入图片描述
  • 线性分类器示例

图像表示成向量在这里插入图片描述
计算当前图像每个类别的分数在这里插入图片描述
按得分高低得出相应结论
在这里插入图片描述
参数梳理&CIFAR10举例
在这里插入图片描述
在这里插入图片描述

线性分类器的权值向量的物理理解
权值向量可以理解为数据的统计信息,一种数据的模板,“平均值”
在这里插入图片描述
在这里插入图片描述
线性分类器的决策边界
在这里插入图片描述
以二维平面为例,权值矩阵相当于y=ax+b的a控制着线的方向,b控制线的偏移,线性分类器尝试将二维平面中的样本簇以线的方式进行划分,由此带来的缺陷—线性不可分区域 注意二维平面到高维平面的映射。二维线,三维面 etc。

  1. 损失函数

    求解分类最优
    在这里插入图片描述

  • 损失函数的定义
    在这里插入图片描述
    作用:(1)度量给定分类器的预测值和真实值的不一致程度(2)作为反馈信号对分类器参数进行调整,降低当前示例对应的损失值。

在这里插入图片描述
Eg: 多类支撑向量机损失
在这里插入图片描述
若某一样本(比如说样本是猫)对于该样本是猫的得分比该样本是其他类别的得分高出1分,则没有损失。

计算举例:
在这里插入图片描述

  1. 正则项在这里插入图片描述
    对于是某一样本的损失均为零的两个权值矩阵
    在这里插入图片描述
    如何进行选择?
    在这里插入图片描述
    R(w)可以控制权值的分布(以L2正则项举例)
    在这里插入图片描述

超参数
在这里插入图片描述
常见的正则项损失:在这里插入图片描述

  1. 参数优化

定义
在这里插入图片描述
说白了就是你的权值矩阵和偏移量不够好,要改!

方法一:直接法

我们考虑一般函数的极值点一定是导数等于0的那些点,所以直接求解。
在这里插入图片描述
方法二:
梯度下降算法
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
学习率*梯度也就是 dx × 斜率

那么 如何计算梯度? 数值法,解析法(高中数学水平)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题 我们注意梯度计算公式
在这里插入图片描述
对于每一个训练样本都要算他的梯度,然后进行1/N操作,而我们从初始权值求解最优权值的过程中可能要进行多次迭代,这样每次涉及全部样本的操作耗时!计算量巨大!
在这里插入图片描述
解决方法:随机梯度下降算法 统计学思路,当迭代次数足够多的时候,频率接近概率。我们每次只随机选择一个样本计算梯度,并以此梯度,代替样本的平均梯度。虽然有些样本会带来噪声,但是当迭代次数足够多的时候,总会朝着样本的平均趋势前进
在这里插入图片描述
折中:小批量随机梯度下降算法
在这里插入图片描述

  1. 数据集划分
    传统划分:训练集+测试集。问题:诸如正则项等超参数的引入,超参数是你在测试集之前就应该准备好的,你不能用训练集训练超参数,测试集选取最优超参数-----引入验证集。
    在这里插入图片描述

在这里插入图片描述
解决数据较少时的方法:K折交叉验证
在这里插入图片描述
在这里插入图片描述
10. 数据预处理
去均值:不让最大和最小数据差距过大,减去平均值。
归一化:每个维度的数据分布一致,打个比方值域都是 [0,1]。保持量纲一致。w
去相关:一定的降维,让数据能够独立出来。(白化 神经网络不常用)
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的神经网络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`方法用于训练网络并更新权重和偏置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值