CS231n课程笔记
文章平均质量分 84
从CS231n课程作业官网上的深度学习知识点文档中翻译、整理、总结的笔记汇总。
zeeq_
A WHU LIESMARSer
展开
-
深度学习知识点笔记汇总
这段时间把CS231n课程作业网站上的知识点文档仔细看了一遍,感觉收获很大。于是后面就花了几天时间翻译、整理、总结这些文档的内容,并贴在CSDN博客上。如果发现有翻译错误或者没看懂的地方,欢迎留言或私信我更正。 总共整理出16篇神经网络笔记和10篇卷积神经网络笔记,现总结如下:...原创 2021-03-17 21:45:55 · 5245 阅读 · 0 评论 -
卷积神经网络[CNN]笔记(一)—— 网络体系结构概述
简单的ConvNet(卷积神经网络,CNN)是一个层次序列,ConvNet的每一层都通过一个可微函数(即激活函数,如Relu)将一个激活量转换为另一个激活量。通常,一个ConvNet由三种主要类型的层来构建:卷积层、池化层和全连接层。下面,我们将堆叠这些层以形成一个完整的ConvNet架构。架构示例:一个简单的用于CIFAR-10数据集分类的ConvNet可能有这样的体系结构[INPUT-CONV-RELU-POOL-FC]。更详细地说:输入[32x32x3]将保存图像的原始像素值,在这种情况下,图像的翻译 2021-03-16 10:25:57 · 908 阅读 · 0 评论 -
卷积神经网络[CNN]笔记(二)—— 全连接层[Fully-Connected Layer]与卷积层[Convolutional Layer]的转换
全连接层(Fully-connected Layer)中的神经元与前一层中的所有输出值都有完全连接,就像在常规神经网络中看到的那样。因此,它们的激活可以通过矩阵乘法和增加偏移来计算。下面详细讨论一下怎么将全连接层(FC层)转换为一般的卷积层(CONV层)。 值得注意的是,FC层和CONV层之间的唯一区别是CONV层中的神经元仅连接到输入中的局部区域,并且CONV层中的许多神经元共享参数。但是,这两种层的神经元都是通过点积进行计算的,所以它们的函数形式是相同的。因此,可以在FC层和CONV层之间进行转翻译 2021-03-15 22:27:35 · 2118 阅读 · 0 评论 -
卷积神经网络[CNN]笔记(三)—— 池化层[Pooling Layer]
在ConvNet体系结构中,在连续的Conv层之间定期插入池化层是很常见的。它的功能是逐步减小表示的空间大小,以减少网络中的参数和计算量,从而控制过拟合。池化层在输入的每个深度片上独立操作,并使用MAX运算在空间上调整其大小。最常见的形式是使用大小为2x2的过滤器的池化层,在输入的每个深度片上以2的宽度和高度下采样,舍弃75的激活值。池化层不会改变图像的深度。总的来说,池化层:接受大小为W1×H1×D1的输入需要两个超参数:它们的空间范围F步长S产生大小为W2×H2×D2的输出,其中:翻译 2021-03-15 21:52:02 · 2030 阅读 · 0 评论 -
卷积神经网络[CNN]笔记(四)—— 输入输出与超参数关系计算公式
首先,我们介绍一下卷积神经网络(Convolutional Neural Networks, CNNs / ConvNets)的三个主要的超参数depth、stride zero-padding:输出量的深度(depth)是一个超参数:它对应于我们想要使用的过滤器(filter)的数量,每个过滤器都从输入中学习不同的东西。例如,如果第一个卷积层将原始图像作为输入,则沿深度维度的不同神经元可在存在各种定向边缘或色块的情况下激活。我们将一组平面坐标一样,但所在的深度层不同的神经元称为深度列(depth翻译 2021-03-15 20:40:00 · 3376 阅读 · 0 评论 -
卷积神经网络[CNN]笔记(五)—— 参数共享机制
在卷积神经网络中,卷积层采用参数共享机制控制参数个数。举个例子,假设输入图像大小为55×55×96,卷积核大小为11×11×3。那么,对于神经网络的全连接算法,相当于有555596=290400个神经元的输入,每个神经元有11113=363个权值和1个偏差。加起来,仅第一层上的参数就达到290400364=105705600。显然,这个数字非常庞大。 事实证明,我们可以通过做出一个合理的假设来显著减少参数的数量:如果一个特征在某个空间位置(x,y)上的计算是有用的,那么在另一个位置(x2,y2)上的翻译 2021-03-15 21:08:31 · 5732 阅读 · 0 评论 -
卷积神经网络[CNN]笔记(六)—— 卷积层结构
卷积网络通常只由三种类型的层组成:CONV、POOL(除非另有说明,否则我们默认假设为Max POOL)和FC(fully connected的缩写)。我们还将把RELU激活函数显式地写为一个层,它使用非线性函数对数据进行处理。下面,我们将讨论如何将这几个层堆叠在一起以形成整个网络。 ConvNet架构最常见的形式是堆叠几个CONV-RELU层,然后在它们后面加上池化层,并重复此模式,直到图像在空间上被合并到一个小尺寸。其中,最后一个全连接层保存输出,例如类的分数。换句话说,最常见的ConvNet架翻译 2021-03-16 11:03:58 · 1643 阅读 · 0 评论 -
卷积神经网络[CNN]笔记(七)—— 层参数的经验值设置及网络内存问题分析
到目前为止,我们还没有提到ConvNet中每个层中使用的公共超参数。我们将首先说明确定体系结构大小的常用经验法则,然后按照这些法则讨论表示方法:输入层(input layer)应该可以被2整除很多次。常用数字包括32(例如CIFAR-10)、64、96(例如STL-10)或224(例如Common ImageNet ConvNets)、384和512。conv层应使用小的过滤器(例如3x3或最多5x5),使用S=1的步长,最关键的是,用零填充输入卷,这样conv层就不会改变输入的空间维度。也就是说,当翻译 2021-03-16 12:43:19 · 1222 阅读 · 0 评论 -
卷积神经网络[CNN]笔记(八)—— 深度学习入门时必须了解的几个经典网络结构
目前,卷积神经网络领域有几种家喻户晓的体系结构,包括:LeNet。卷积网络的第一个成功应用是由Yann LeCun在20世纪90年代开发的。其中最著名的是用于读取邮政编码、数字等的LeNet架构。AlexNet。在计算机视觉中普及卷积网络的第一项工作是Alex Krizhevsky、Ilya Sutskever和Geoff Hinton开发的AlexNet。AlexNet在2012年被提交到ImageNet ILSVRC挑战赛,并显著优于亚军(top5的错误率为16%,亚军的错误率为26%)。该网翻译 2021-03-16 13:41:48 · 406 阅读 · 0 评论 -
卷积神经网络[CNN]笔记(九)—— 网络及参数可视化方法
许多文献中都提出了几种理解和可视化卷积网络的方法,部分原因是因为人们普遍诟病神经网络中学习的特征不可解释。下面将简要介绍其中一些方法和相关工作。1. Visualizing the activations 最直接的可视化技术是显示网络在前向传播过程中的激活情况。对于ReLU网络,激活通常开始时看起来比较臃肿和密集,但随着训练的进行,激活通常变得更加稀疏和局部化。这种可视化很容易注意到的一个潜在问题是,对于许多不同的输入,某些激活映射可能都为零,这可能表示过滤器已死亡(dead),这可能是由于学习率翻译 2021-03-16 15:17:34 · 1511 阅读 · 2 评论 -
卷积神经网络[CNN]笔记(十)—— 使用预训练好的模型进行迁移学习
实际上,很少有人从零开始训练整个卷积网络(随机初始化),因为拥有足够大小的数据集相对较少。相反,通常在一个非常大的数据集上预训练ConvNet(例如ImageNet,它包含120万个图像和1000个类别),然后使用这个预训练好的ConvNet作为初始化或固定的特征提取器来完成感兴趣的任务。1. 三种主要的迁移学习场景ConvNet作为固定的特征提取器。取一个在ImageNet上预训练的ConvNet,移除最后一个全连接层(该层的输出是像ImageNet这样的不同任务的1000个类分数),然后将Co翻译 2021-03-16 15:49:27 · 3392 阅读 · 0 评论 -
深度学习笔记(十六)—— 自己创建并实现一个完整的神经网络(实践)[Put Into Practice]
在这篇博客里,我们将首先实现一个简单的线性分类器,然后将代码扩展到两层神经网络。这个扩展非常简单,几乎不需要做什么更改。1 Import package 首先,在程序最前面导入所需要的包,进行初始化:# Run some setup code for this notebook.import randomimport numpy as npimport matplotlib.pyplot as plt# This is a bit of magic to make matplotli翻译 2021-03-15 13:38:08 · 834 阅读 · 2 评论 -
深度学习笔记(一)—— 计算梯度[Compute Gradient]
有两种方法来计算梯度:一种是计算速度慢,近似的,但很简单的方法(数值梯度),另一种是计算速度快,精确的,但更容易出错的方法,需要用到微积分(解析梯度)。1. Numerical gradient 数值梯度就是根据导数的定义来求解梯度: 在具体实现的时候,只要保证h很小,就可以近似求出精确的梯度值了。下面的这段python代码实现的是一个通用的数值梯度求解方法,它接受一个函数f和一个向量x来计算梯度,并返回f在x处的梯度:def eval_numerical_gradient(f, x):翻译 2021-03-13 16:06:35 · 12997 阅读 · 0 评论 -
深度学习笔记(二)—— 梯度下降[Gradient Descent]
为了在权重空间中找到一个方向来改进我们的权重向量(并降低loss),我们可以计算出最佳方向,这个向量(也就是梯度)在数学上保证是最陡的下降方向(至少在步长趋于零的极限范围内)。关于梯度计算的相关知识,可以参考这篇博客。梯度下降就是取我们计算出来的梯度值的相反方向(因为梯度告诉我们的是增长方向,但我们需要减小loss),然后将其乘以一个步长,一步步减小loss,从而不断优化网络。1. Vanilla Gradient Descent Vanilla梯度下降代码如下:# Vanilla Gradie翻译 2021-03-14 09:56:20 · 918 阅读 · 0 评论 -
深度学习笔记(三)—— 反向传播[Back Propagation] & 计算图[Computational Graph]
反向传播就是求梯度值,然后通过梯度下降的方式对损失函数进行迭代优化的过程。在通常情况下,直接对一个复杂的函数一步到位写出其解析导数(关于数值导数和解析导数的求法可以查看这篇博客)是不太现实的,因此,一般需要再结合链式法则(chain rule)来进行计算。下面主要讲解链式法则的应用。1. A simple example 现在,假设你已经具备了求解偏导数的基本知识。首先,先看一个简单的示例:f(x,y,z)=(x+y)z。这个表达式很简单,可以直接进行微分,但是我们将采用链式法则来处理它,这将有助翻译 2021-03-14 13:24:59 · 1319 阅读 · 0 评论 -
深度学习笔记(四)—— 神经网络结构[Neural Network Architectures]
神经网络被建模为在一个非循环图中连接的神经元的集合。换句话说,一些神经元的输出可以变成其他神经元的输入。循环是不允许的,因为这意味着在网络的正向传播过程中会出现无限循环。神经网络模型通常被组织成不同的神经元层,而不是由连接的神经元组成的无定形点。对于规则神经网络,最常见的层类型是全连接层(fully-connected layer),其中两个相邻层之间的神经元完全成对连接,但单层内的神经元不共享连接。下面是两个使用全连接层堆叠的示例神经网络: 需要注意的是,当我们说N层神经网络时,我们并没有把输入翻译 2021-03-12 17:47:09 · 1715 阅读 · 0 评论 -
深度学习笔记(五)—— 激活函数[Activation Functions]
激活函数都是非线性的,它将非线性特性引入到神经网络中,对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。 1. Sigmoid Sigmoid激活函数的数学形式为σ(x)=1/(1+e−x) ,如上图左所示。如前一节所述,它接受实数并将其“压缩”到0到1之间的范围。特别是,大负数变为0,大正数变为1。sigmoid函数在历史上被频繁使用,因为它有一个很好的解释,即神经元的放电率:从根本不放电(0)到以假定的最大频率(1)完全饱和放电。在实践中,sigmoid非线性翻译 2021-03-12 17:28:19 · 1067 阅读 · 0 评论 -
深度学习笔记(六)—— 数据预处理[Data Preprocessing]
设输入数据的维度为N×D,其中,N是数据量,D是它们的维数。对数据矩阵X进行数据预处理有三种常见形式:1. Mean subtraction Mean subtraction是最常见的预处理形式。它通过减去数据中每个维度的平均值,将数据的每个维度都以原点为中心进行居中。其python numpy的代码为X -= np.mean(X, axis = 0)。2. Normalization Normalization(也就是正则化)通过规范化数据维度,使它们具有大致相同的比例。有两种常用的方法:翻译 2021-03-10 13:46:15 · 1731 阅读 · 0 评论 -
深度学习笔记(七)—— 初始化权值[Weight Initialization]
首先说一个误区,那就是将所有权值都初始化为0。我们不知道训练网络中每个权重的最终值应该是多少,但是通过适当的数据规范化,可以合理地假设大约一半的权重为正,一半为负。一个听起来合理的想法可能是将所有初始权重设置为零。但是,这是一个错误的想法。因为如果网络中的每个神经元计算相同的输出,那么它们在反向传播过程中也会计算相同的梯度,并经历完全相同的参数更新。换言之,如果神经元的权值被初始化为相同的数值,那么神经元之间就没有不对称的根源。下面介绍几种权值初始化的方法:1. Small random number翻译 2021-03-12 11:30:52 · 1817 阅读 · 0 评论 -
深度学习笔记(八)—— 正则化[Regularization]
下面介绍几种可以控制神经网络的容量以防止过拟合(overfitting)的方法:1. L2 regularization L2正则化可能是最常见的正则化形式。它可以通过直接惩罚(penalize)目标中所有参数的平方大小来实现。也就是说,对于网络中的每个权重w,我们将1/2λw2项添加到目标中,其中λ是正则化强度。使用系数1/2是为了使该项相对于参数w的梯度为λw而不是2λw。L2正则化具有严重惩罚峰值权重向量和偏好扩散权重向量的直观解释。由于权重和输入之间的乘法运算,这具有一个很好的特性,即鼓励翻译 2021-03-12 14:38:45 · 2036 阅读 · 0 评论 -
深度学习笔记(九)—— 损失函数[Loss Functions]
Data loss在有监督学习问题中,度量预测值(例如分类问题中类的分数)和真值之间的兼容性。Data loss是每个样本的数据损失的平均值。也就是说,L=(1/N)∑iLi,其中N是训练数据的个数。在实践中,可能需要解决的几种问题类型:1 Classification1.1 SVM 分类问题中最常见的两种loss函数是支持向量机(Support Vector Machine, SVM)(比如Weston Watkins公式): 有些人认为平方损失函数更好:1.2 cross-entr翻译 2021-03-12 15:35:42 · 1382 阅读 · 0 评论 -
深度学习笔记(十)—— 梯度检验[Gradient Checks]
1. Use the centered formula 在计算梯度的时候,使用第二个式子的计算结果会比第一个式子好。2. Use relative error for the comparison 在计算梯度误差时,应计算相对误差。 在实践中:相对误差>1e-2 通常意味着年计算的梯度可能是错误的1e-2>相对误差>1e-4 的结果不是很理想相对误差<1e-4 在有kinks(第5点会讲到kinks是指什么)时这个结果通常是可以的。但如果没有kinks(例翻译 2021-03-11 15:05:54 · 2851 阅读 · 0 评论 -
深度学习笔记(十一)—— 完整性检查[Sanity Checks]
在进行高运算量的网络优化之前,可以先考虑进行以下几个检验:1. Look for correct loss at chance performance 当使用少量参数进行初始化时,请确保得到了预期的损失。最好先单独检查数据损失(将正则化强度设置为零)。例如,对于具有Softmax分类器的CIFAR-10,我们期望初始损失为2.302,因为我们期望每个类的扩散概率为0.1(因为有10个类),并且Softmax损失是正确类的负对数概率,所以:-ln(0.1)=2.302。如果检验时没有获得预期损失,那翻译 2021-03-11 15:55:15 · 2525 阅读 · 0 评论 -
深度学习笔记(十二)—— 训练过程监视[Babysitting The Learning Process]
在神经网络的训练过程中,有许多有用的量需要监控。下面介绍的几种曲线图是分析训练过程的有用工具,可以用来获得关于不同超参数设置的直观信息,以及如何更改这些参数以提高训练效率。 下面的图的x轴都是以epochs为单位,用来衡量每个样本在预期训练中被使用的次数(例如,一个epochs意味着每个例子都被使用了一次)。由于迭代次数取决于batch大小的设置,因此最好跟踪epochs而不是迭代次数。1. Loss function 在训练过程中,第一个有用的跟踪量是损失(loss),因为它是在前向传播过程翻译 2021-03-11 16:28:03 · 1990 阅读 · 0 评论 -
深度学习笔记(十三)—— 参数更新[Parameter Updates]
1 SGD and bells and whistles1.1 Vanilla update 最简单的更新形式是沿负梯度方向更新参数(因为梯度指示增加的方向,但我们通常希望最小化损失函数)。设参数x和梯度dx,最简单的更新形式如下:# Vanilla updatex += - learning_rate * dx 其中learning_rate是一个超参数(一个固定常数)。1.2 Momentum update 动量更新是另一种在深度网络上几乎总是具有更好收敛速度的方法。这个更新从物理翻译 2021-03-11 18:59:45 · 3384 阅读 · 0 评论 -
深度学习笔记(十四)—— 超参数优化[Hyperparameter Optimization]
训练神经网络会涉及到许多超参数设置。神经网络中最常见的超参数包括:the initial learning ratelearning rate decay schedule (such as the decay constant)regularization strength (L2 penalty, dropout strength) 但正除此之外,还有许多相对不太敏感的超参数,例如在单参数自适应学习方法中,动量的设置及其schedule等方面。在本节中,我们将介绍一些执行超参数搜索的t翻译 2021-03-11 19:52:05 · 8316 阅读 · 0 评论 -
深度学习笔记(十五)—— 模型集成[Model Ensembles]
在实践中,将神经网络的性能提高几个百分点的一个可靠方法是训练多个独立的模型,并在测试时平均它们的预测。随着集成中模型数量的增加,性能通常会单调地提高(尽管回报率会逐渐减少)。此外,随着集合中模型的变化越大,改进就越显著。组建一个集成模型有几种方法:1. Same model, different initializations 利用交叉验证法确定最优超参数,然后训练多个具有最优超参数集但随机初始化不同的模型。这种方法的问题在于,变化仅仅是由于初始化的不同引起的。2. Top models dis翻译 2021-03-11 20:15:26 · 1657 阅读 · 0 评论