尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Deep Learning for Computer Vision - Part1

Deep Learning for Computer Vision - Part1 # 关于计算机视觉神经网络深度学习李飞飞Stanford CS231n公开课的笔记。 #首先从完全没有接触过神经网络及计算机学习中的高等数学慢慢一步一步学习记录学习中的疑点难点。前置一点之前学习python的时候还没能理解numpy这个库存在的意义因为当时觉得python不是一种编程语言嘛怎么还需要内嵌一个数学库。后面才慢慢发现其实好像数学才是代码的底层逻辑了。进入正题吧首先之前完全没有接触过深度学习和神经网络我指的没有接触过是指没有认真了解过其本质而不是单纯的知道这个词汇然后泛泛而谈就像当初AICG一样其实真正应该是AIGCArtificial Intelligence Gernerated Content人工智能生成内容之所以一直以为是AICG就是因为都是在词汇上泛泛而谈以为是ai生成的cg图。所以啊一定要了解事物背后的本质。其实这次学习的是计算机深度学习里面的一环就是关于视觉学习的原理之前看李飞飞教授主要是惊讶于她们团队使用的图片生成3D高斯泼溅技术后来就来搜关于李飞飞教授的课程了才有了这次Stanford CS231n的公开课。图像分类器所谓的图像分类器其实就是输入一张图片输出这张图片属于哪一个类别的程序 / 数学模型。比如输入一张照片输出青蛙、汽车、猫、狗。向量那么这里就有一个非常关键的知识点了就是计算机是通过什么来感知或者说看懂图像之间的差异的呢。这里潜藏着一个十分核心的要素那就是向量在往后的学习当中会慢慢发现其实所谓的神经网络深度学习其实非常依赖一样东西就是向量的转换把原始输入像素 / 文字 / 音频→转换成数字向量。只有转化为数字向量这才是计算机能读懂的语言才能进行后续的一系列操作。图像分类发展阶段模板向量距离匹配L1/L2手工特征 SVM传统 CVSIFT、HOG单层线性分类多层全连接 MLP带 ReLU基础 CNNAlexNet深度改良 CNNVGG、ResNet、EfficientNet、ConvNeXtVision TransformerViT、Swin多模态大模型CLIP 等零样本分类、自监督预训练1.模板向量距离匹配我们首先来看看关于模板向量距离匹配的机制其实就是把待测图片和标准答案图片模板图片所有像素上的RGB数值进行向量转换并且实现flatten铺平通过L1、L2向量距离计算公式来比对二者图片间的向量差从而获得二者图像吻合度来判断待测图片是否是标准答案图片的类别。这就是非常古早的图像分类阶段了。值得提一嘴的是往后所有的关于向量的计算待测图片和模板图片的向量元素必须是一致才能计算这是很基础的数学底层逻辑就是2*2像素RGB通道的图片不能和4*4像素CMYK的图片进行向量计算。L1距离计算曼哈顿距离 ManhattanL1距离计算其实就是把待测图片和模板图片所有像素点上的RGB值分别进行相减并取绝对值然后把所有常量相加在一起此时相加的和越小说明二者越接近。L2 距离计算欧氏距离 EuclideanL2距离计算其实是把待测土坯那和模板图片所有像素点上的RGB值分别进行相减再平方求和后再开根同样的值越小说明二者越接近。在python中的代码呈现就是import numpy as np # L1距离 l1_dist np.sum(np.abs(x - x_temp)) # L2距离 l2_dist np.sqrt(np.sum((x - x_temp)**2))L1、L2 向量距离计算是很初阶的传统计算机视觉比对手段直接计算两张图像向量之间的差异。之后进阶到线性分类器有可训练的权重\(W、b\)依靠标签、损失、梯度下降迭代优化正式迈入机器学习。 但线性分类只是单层线性变换缺少非线性激活不属于深度学习。真正的深度学习从多层网络 非线性激活ReLU开始只有同时具备多层可训练权重并且插入非线性激活函数模型才拥有拟合复杂现实模式的能力才算深度学习。2.手工特征 SVM这是深度学习大规模爆发之前工业界主流的图像分类流水线介于「原始像素 L1/L2 模板匹配」和「神经网络」中间的一代技术。手工特征hand‑crafted feature直接拿原始像素做 L1/L2 距离效果很差图片稍微平移、亮度变化距离直接乱掉。 于是人设计算法从图片里提取更稳定的信息HOG提取图像边缘、梯度方向物体轮廓SIFT提取关键点旋转、缩放、光照变化依然相对稳定流程输入原图 →运行 HOG/SIFT 算法 →输出一段特征向量。SVM 支持向量机Support Vector MachineSVM 是一个机器学习分类器。 输入上面提取好的特征向量输出类别青蛙 / 汽车。SVM 有可训练参数用标注数据训练找到一个最优的分割超平面把不同类别分开。SVM 干的活和我们之前学的线性分类器非常像数学内核都是找超平面做分类只是损失函数不一样。SVM是使用Hinge来计算损失函数而线性分类s xW b是使用Softmax交叉熵损失。 把得分 s 转成概率分布惩罚 “正确类别概率不够高”。from sklearn.svm import LinearSVC #线性SVM3.1单层线性分类核心公式关于铺平Flatten的概念赘述我们假设一张图片是横向2像素纵向2像素的RGB三通道图片那么必定在每一个像素点上都会有对应的RGB数值这样就会形成一个矩阵而把这样的一个矩阵平铺成一个数组序列如[R1,,G1,B1,R2,G2,B2,R3,G3,B3,R4,G4,B4]就是所谓的铺平Flatten把一个在二维层面的空间信息全部丢掉只保留所有元素的数值所以能够看到当张量shape 223被铺平之后就会变成一维有序序列。其实对于单层线性分类整体的核心公式并不难理解W是提前训练好的权重系数它里面包含了若干图像标签的权重系数可以看作是标准答案利用铺平后的一维向量与W权重系数进行矩阵相乘。得出数值再和b偏置系数相加就得出该待测图片与当前标签的得分得分越高越属于那一类标签项。矩阵乘法那么接下来就慢慢搞懂几个概念先首先是xW这里其实是矩阵乘法。其实更加标准应该写成举一个最极端的例子假设我们的待测图片为横向1像素纵向1像素RGB三通道图片那么该图片x.shape 1133个元素分别为R、G、B。我们W权重系数是2种分类分别为青蛙和汽车所以要能对应我们待测图片使用的W权重系数必定也是每列三个元素。那么如果这个矩阵被铺平将会得到一个一维序列[RGB]接下来需要和W权重系数进行矩阵其实就是W权重当中的W r_frog * R W g_frog * G W b_frog * B 这样会得出S frog也就是待测图片的得分数值如下图实际运算就是这样可以看出使用这套W权重计算结果Sfrog 19Scar 12.5明显19更大所以待测图片更加偏向于是Frog。那么问题就来了对于x我们可以显然易见得到假设待测图片为横向32像素纵向32像素RGB三通道图片那么x.shape (32,32,3)一共3072维向量。3.2W权重系数但是W权重系数是怎么得来得呢这就很值得考究了。整体流程总览初始化 W随机给初始小数拿一批训练图片前向传播算出得分用损失函数衡量当前这套 W 预测错得有多离谱求损失对 W 每个元素的梯度往哪个方向改 W损失会变小使用梯度下降更新 W 里面每一个数值循环 2‑5反复迭代直到损失不再明显下降最后拿到训练完成的权重矩阵 WW 的初始化起点从哪里来W shape(输入特征数,类别数)例如 3 像素二分类W(3,2)。 一开始 W 全部填很小的随机数不能全部填 0。如果 W 全部初始化为 0所有输出得分全部一样梯度全部为 0模型学不到任何东西。# numpy伪代码 W 0.01 * np.random.randn(3,2) b np.zeros((2,))训练数据集修改 W 的依据我们手里有大量标注好的图片图片 正确标签青蛙 / 汽车。W 不是凭空算出来W 的好坏完全由训练数据决定。 同样网络换一套训练图片训练结束得到完全不一样的 W 矩阵。每次循环拿若干张图片mini‑batch送入网络\(X_{batch}\)每一行是一张铺平后的图片向量输出 S 每一行是一张图片各个类别的得分。损失函数 Loss衡量现在 W 有多差核心损失就是一把尺子数值越大 当前 W 预测结果越离谱。 我们的目标不断修改 W让 Loss 尽可能变小。修正W的两大核心分别是数据损失和惩罚项。两种常见损失① Softmax 交叉熵损失最常用把得分 s 经过 softmax 映射成 0~1 的概率再拿真实标签计算损失。如果正确类别得分很高错误类别得分低 → loss 很小如果正确类别得分很低其他类别得分高 → loss 很大② SVM 铰链损失看正确类别得分要比错误类别得分高出一个安全间隔 margin达不到就产生损失。⚠️Loss 是全部样本的平均损失。 另外还要加上正则惩罚项L1/L2得到总损失所谓的正则化惩罚其实是为了防止W权重为了过渡贴合现有样本当出现新样本与W权重系数差异很大但实际上又真的是该标签时W权重系数矩阵相乘出来得分就会出现误判。值得注意的是这里的L1、L2是正则化计算跟最初阶段的L1、L2向量距离计算不是同一样东西。很明显看到L1、L2的正则化公式只针对W权重进行计算与此前的向量距离计算很大不同。这里需要说明下在当中是作为人工写入的叫做正则化强度超参数用来控制「正则惩罚项」到底有多强。梯度告诉我们 W 往哪个方向调整其实之所以上一个步骤得到损失函数的目的L total其实最大的作用就是为了接下来判断W该怎么再优化调整.其实我是这么理解的,就是要求出W的正负变化对整体L total的影响是正还是负,正如豆包所说的,其实求导的最大目的并非是要知道怎么去调整W,更多的反而是知道我们现在这样去调整W方向上是否正确,求导是要知道调整方向而并非知道调整量!!!这是最重要的点.梯度下降更新 W获取到dW之后,知道了W该往哪个方向调整之后,我们要开始对W进行调整,那么W需要循环优化到什么地步为之最接近正确W呢.这就需要类似计算边际效用一样去计算了,正如截图中所示,和我们之前见过的其实都属于人工超参数,其逻辑都有点像永真循环中的跳出机制,为了避免计算无休止地进行下去.然后这里会涉及到包括局部最小值和鞍点的知识点,其最核心含义都是为了计算W在循环优化中的函数曲线什么时候达到最平缓,最平缓就证明W权重系数已经相当接近最优解了,那就可以停止运算了.但是也值得注意鞍点和局部最小值的区别,两者还是有差异的,这里就不作过多深入探讨了.以上是计算梯度下降常用的工具.循环迭代epoch不断重复 前向计算得分 → 算总损失 → 求梯度 dW → 更新 W 循环成千上万次。随着迭代进行 W 里面每一个数字被一点点打磨修改。 训练损失会持续下降模型分类效果越来越好。什么时候停止训练训练集损失不再明显下降看验证集精度当验证集精度不再提升甚至开始变差代表出现过拟合就要停止训练。不能只看训练集 loss训练 loss 很低但验证变差就是过拟合。这正是我们引入正则化的意义。其实这里就是接我们刚刚上一个步骤提到的利用梯度下降的规律来不断循环计算优化W权重系数,等到W权重系数在优化函数曲线中不再下降,达到平缓曲率就可以停止优化了.超参数的定义全部不能梯度自动算出需要人工调参其实在W权重系数的整体优化运算中,都会有好些人工填入的参数,这里做一个简单的了解即可.训练完成之后W 拿来干什么见到来说训练停止保存最终的 W、b。 训练到此结束不再修改 W。 推理预测新图片 新图片 flatten 得到 x执行 \(\boldsymbol sxWb\)取得分最大类别作为输出。3.3单层线性分类知识点梳理3.4单层线性分类案例
返回列表