
李沐动手学深度学习笔记
文章平均质量分 91
cv_lhp
纸上得来终觉浅,绝知此事要躬行
展开
-
李沐动手学深度学习V2-BERT微调和代码实现
load_pretrained_model函数用于加载预先训练好的BERT参数。原创 2022-08-03 01:31:55 · 5222 阅读 · 1 评论 -
李沐动手学深度学习V2-自然语言推断与数据集SNLI和代码实现
下面定义一个用于加载SNLI数据集的类。类构造函数中的变量num_steps指定文本序列的长度,使得每个小批量序列将具有相同的形状。也即是在较长序列中的前num_steps个标记之后的标记被截断,而特殊标记“”将被附加到较短的序列后,直到它们的长度变为num_steps。通过实现__getitem__功能,我们可以任意访问带有索引idx的前提、假设和标签。class SNLIDataset(torch.utils.data.Dataset) : "" "用于加载SNLI数据集的自定义数据集 "" "....原创 2022-08-03 00:19:38 · 3755 阅读 · 2 评论 -
李沐动手学深度学习V2-BERT预训练和代码实现
利用中实现的BERT模型和中从WikiText-2数据集生成的预训练样本,下面在WikiText-2数据集上对BERT进行预训练。首先,加载WikiText-2数据集作为小批量的预训练样本,用于遮蔽语言模型和下一句预测。批量大小是512,BERT输入序列的最大长度是64。注意在原始BERT模型中,最大长度是512。............原创 2022-08-02 11:22:40 · 2624 阅读 · 4 评论 -
李沐动手学深度学习V2-bert预训练数据集和代码实现
为了预训练前一篇实现的BERT模型,我们需要使用数据集用于训练这两个预训练任务遮蔽语言模型和下一句预测。一方面最初的BERT模型是在两个庞大的图书语料库和英语维基百科的合集上预训练的。另一方面现成的预训练BERT模型可能不适合医学等特定领域的应用。因此在定制的数据集上对BERT进行预训练变得越来越流行,本次使用了较小的语料库WikiText-2,来对BERT进行预训练。与用于预训练word2vec的PTB数据集相比,WikiText-2(1)保留了原来的标点符号,适合于下一句预测;.............原创 2022-08-02 00:32:42 · 4390 阅读 · 4 评论 -
李沐动手学深度学习V2-bert和代码实现
BERT通过使用预训练的Transformer编码器,能够基于其双向上下文表示任何词元,在下游任务的监督学习过程中,BERT在两个方面与GPT相似。。原创 2022-08-01 01:56:55 · 2580 阅读 · 0 评论 -
李沐动手学深度学习V2-transformer和代码实现
自注意力同时具有并行计算和最短的最大路径长度这两个优势。因此使用自注意力来设计深度架构是很有吸引力的。对比依赖循环神经网络实现输入表示的自注意力模型,transformer模型完全基于注意力机制,没有任何卷积层或循环神经网络层。尽管transformer最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语言、视觉、语音和强化学习领域。......原创 2022-07-26 01:45:56 · 3367 阅读 · 2 评论 -
李沐动手学深度学习V2-多头注意力机制和代码实现
在实践中,当给定相同的查询、键和值的集合时, 希望模型可以基于相同的注意力机制学习到不同的行为, 然后将不同的行为作为知识组合起来, 捕获序列内各种范围的依赖关系 (例如短距离依赖和长距离依赖关系)。 因此允许注意力机制组合使用查询、键和值的不同子空间表示(representation subspaces)可能是有益的。为此与其只使用单独一个注意力汇聚, 我们可以用独立学习得到的 ℎ 组不同的线性投影(linear projections)来变换查询、键和值。 然后,这 ℎ 组变换后的查询、键和值将并行地原创 2022-07-14 18:17:50 · 4372 阅读 · 0 评论 -
李沐动手学深度学习V2- self-attention自注意力机制
在深度学习中,经常使用卷积神经网络(CNN)或循环神经网络(RNN),自注意力机制对序列进行编码。使用自注意力机制将词元序列输入注意力池化中,以便同一组词元同时充当查询、键和值。具体来说每个查询都会关注所有的键-值对并生成一个注意力输出。由于查询、键和值来自同一组输入,因此被称为自注意力(self-attention)也被称为内部注意力(intra-attention) 。给定一个由词元组成的输入序列x1,…,xn\mathbf{x}_1, \ldots, \mathbf{x}_nx1,…,xn,其中任原创 2022-07-14 17:27:40 · 2182 阅读 · 0 评论 -
李沐动手学深度学习V2-自注意力机制之位置编码
在处理词元序列时,循环神经网络是逐个的重复地处理词元的,而自注意力则因为并行计算而放弃了顺序操作。**为了使用序列的顺序信息,我们通过在输入表示中添加位置编码(positional encoding)来注入绝对的或相对的位置信息。位置编码可以通过学习得到也可以直接固定得到。**下面使用基于正弦函数和余弦函数的固定位置编码:假设输入表示X∈Rn×d\mathbf{X} \in \mathbb{R}^{n \times d}X∈Rn×d包含一个序列中nnn个词元的ddd维嵌入表示。位置编码使用相同形状的位置嵌原创 2022-07-14 16:42:22 · 2349 阅读 · 0 评论 -
李沐动手学深度学习V2-基于注意力机制的seq2seq
在前面博客李沐动手学深度学习V2-seq2seq和代码实现中探讨了基于seq2seq架构的机器翻译问题: 通过设计一个基于两个循环神经网络的编码器-解码器架构, 用于序列到序列学习。 具体来说循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量, 然后循环神经网络解码器根据生成的词元和上下文变量按词元生成输出(目标)序列词元。 然而即使并非所有输入(源)词元都对解码某个词元都有用, 在每个解码步骤中仍使用编码相同的上下文变量,因此本节解决的是用什么方法能改变上下文变量呢?使用基于注意力机制的输出来改原创 2022-07-14 15:42:00 · 1549 阅读 · 0 评论 -
李沐动手学深度学习V2-注意力评分函数
在上篇博客李沐动手学深度学习V2-注意力机制中,使用高斯核来对查询和键之间的关系建模。 将Nadaraya-Watson-Gaussian中的高斯核指数部分视为注意力评分函数(attention scoring function), 简称评分函数(scoring function), 然后把这个函数的输出结果输入到softmax函数中进行运算。 通过上述步骤,我们将得到与键对应的值的概率分布(即注意力权重),最后注意力汇聚的输出就是基于这些注意力权重的值的加权和。下图说明了 如何将注意力汇聚的输出计算成为原创 2022-07-14 01:34:17 · 2089 阅读 · 1 评论 -
李沐动手学深度学习V2-attention注意力机制
非自主性提示是基于环境中物体的突出性和易见性。假如你面前有五个物品: 一份报纸、一篇研究论文、一杯咖啡、一本笔记本和一本书,如下图所示。 所有纸制品都是黑白印刷的,但咖啡杯是红色的。 也即是这个咖啡杯在这种视觉环境中是突出和显眼的, 不由自主地引起人们的注意。 所以你把视力最敏锐的地方放到咖啡上。自主性提示:喝咖啡后,你会变得兴奋并想读书。 所以你转过头,重新聚焦你的眼睛,然后看看书,如下图所示。 与上面非自主性提示突出性导致的选择不同, 此时选择书是受到了认知和意识的控制, 因此注意力在基于自主性提示原创 2022-07-12 02:35:02 · 2783 阅读 · 0 评论 -
李沐动手学深度学习V2-Encoder-Decoder编码器和解码器架构
机器翻译是序列转换模型的一个核心问题, 其输入和输出都是长度可变的序列。 为了处理这种类型的输入和输出, 可以设计一个包含两个主要组件的架构: 第一个组件是一个编码器(encoder): 它接受一个长度可变的序列作为输入, 并将其转换为具有固定形状的编码状态。 第二个组件是解码器(decoder): 它将固定形状的编码状态映射到长度可变的序列。 这被称为编码器-解码器(encoder-decoder)架构,如下图所示。以英语到法语的机器翻译为例: 给定一个英文的输入序列:“They”、“are”、“wat原创 2022-07-04 18:05:14 · 3798 阅读 · 0 评论 -
李沐动手学深度学习V2-机器翻译和数据集
机器翻译的数据集是由源语言和目标语言的文本序列对组成的,因此需要一种完全不同的方法来预处理机器翻译数据集, 而不是复用语言模型的预处理程序。首先,下载一个由Tatoeba项目的双语句子对组成的“英-法”数据集,数据集中的每一行都是制表符分隔的文本序列对,序列对由英文文本序列和翻译后的法语文本序列组成。注意每个文本序列可以是一个句子,也可以是包含多个句子的一个段落。在将英语翻译成法语的机器翻译问题中,英语是源语言(source language),法语是目标语言(target language)。下载数据原创 2022-07-04 02:06:31 · 2031 阅读 · 0 评论 -
李沐动手学深度学习V2-双向循环神经网络Bidirectional RNN和代码实现
在序列学习中,以往假设的目标是:在给定观测的情况下(例如在时间序列的上下文中或在语言模型的上下文中),对下一个输出进行建模,虽然这是一个典型情景,但不是唯一的,例如我们考虑以下三个在文本序列中填空的任务:根据可获得的信息量,我们可以用不同的词填空,如“很高兴”(“happy”)、“不”(“not”)和“非常”(“very”)。很明显每个短语的“下文”传达了重要信息(如果有的话),而这些信息关乎到选择哪个词来填空,所以无法利用这一点的序列模型将在相关任务上表现不佳。例如如果要做好命名实体识别(例如,识别“G原创 2022-06-30 18:03:41 · 1552 阅读 · 0 评论 -
李沐动手学深度学习V2-深度循环神经网络和代码实现
与多层感知机一样,循环神经网络也可以将多层循环神经网络堆叠在一起, 通过对几个简单层的组合,产生了一个灵活的机制。 特别是,数据可能与不同层的堆叠有关。 下图所示描述了一个具有 𝐿 个隐藏层的深度循环神经网络, 每个隐状态都连续地传递到当前层的下一个时间步输入和当前层下一层的当前时间步输入。假设在时间步ttt有一个小批量的输入数据Xt∈Rn×d\mathbf{X}_t \in \mathbb{R}^{n \times d}Xt∈Rn×d(样本数:nnn,每个样本中的输入数:ddd)。同时,将lthl^.原创 2022-06-30 16:34:38 · 751 阅读 · 0 评论 -
李沐动手学深度学习V2-LSTM长短期记忆网络以及代码实现
长期以来,隐变量模型存在着长期信息保存和短期输入缺失的问题,解决这一问题的最早方法之一是长短期存储器(long short-term memory,LSTM),它有许多与门控循环单元GRU一样的属性,但是长短期记忆网络的设计比门控循环单元稍微复杂一些, 却比门控循环单元早诞生了近20年。长短期记忆网络的设计灵感来自于计算机的逻辑门,长短期记忆网络引入了记忆元(memory cell),或简称为单元(cell)。 有些文献认为记忆元是隐状态的一种特殊类型, 它们与隐状态具有相同的形状,其设计目的是用于记录附加原创 2022-06-30 03:18:47 · 1918 阅读 · 0 评论 -
李沐动手学深度学习V2-GRU门控循环单元以及代码实现
我们可能会遇到这样的情况:1)早期观测值对预测所有未来观测值具有非常重要的意义。 考虑一个极端情况,其中第一个观测值包含一个校验和, 目标是在序列的末尾辨别校验和是否正确。 在这种情况下,第一个词元的影响至关重要,我们希望有某些机制能够在一个记忆元里存储重要的早期信息, 如果没有这样的机制,我们将不得不给这个观测值指定一个非常大的梯度, 因为它会影响所有后续的观测值。2) 一些词元没有相关的观测值。 例如在对网页内容进行情感分析时, 可能有一些辅助HTML代码与网页传达的情绪无关,希望有一些机制来跳过隐原创 2022-06-29 18:50:36 · 2031 阅读 · 1 评论 -
李沐动手学深度学习V2-使用Pytorch框架实现RNN循环神经网络
上篇博文记录了RNN从零实现过程,现在使用Pytorch的高级API提供的函数实现RNN,首先读取时光机器数据集:2. 模型定义Pytorch高级API提供了循环神经网络的实现,构造一个具有256个隐藏单元的单隐藏层的循环神经网络层rnn_layer。使用张量来初始化隐状态,它的形状是(隐藏层数,批量大小,隐藏单元数)。通过一个隐状态和一个输入,就可以用更新后的隐状态计算输出。注意:rnn_layer的“输出”(Y)不涉及输出层的计算: 它是指每个时间步的隐状态,这些隐状态可以用作后续输出层的输入。原创 2022-06-24 17:51:31 · 1909 阅读 · 0 评论 -
李沐动手学深度学习V2-RNN循环神经网络从零实现
根据上篇博客介绍李沐动手学深度学习V2-RNN循环神经网络原理, 来从头开始基于循环神经网络实现字符级语言模型,模型将在H.G.Wells的时光机器数据集上训练,首先读取数据集。2. 独热编码(one-hot encoding)在train_iter中,每个词元都表示为一个数字索引, 将这些索引直接输入神经网络可能会使学习变得困难,我们通常将每个词元表示为更具表现力的特征向量,最简单的表示称为独热编码(one-hot encoding)。简言之,将每个索引映射为相互不同的单位向量: 假设词表中不同词元原创 2022-06-24 16:07:45 · 3403 阅读 · 0 评论 -
李沐动手学深度学习V2-RNN循环神经网络原理
前面博文介绍了nnn元语法模型,其中单词xtx_txt在时间步ttt的条件概率仅取决于前面n−1n-1n−1个单词。对于时间步t−(n−1)t-(n-1)t−(n−1)之前的单词,如果想将其可能产生的影响合并到xtx_txt上,需要增加nnn,导致模型参数的数量也会随之呈指数增长,因为词表V\mathcal{V}V需要存储∣V∣n|\mathcal{V}|^n∣V∣n个数字,因此与其将P(xt∣xt−1,…,xt−n+1)P(x_t \mid x_{t-1}, \ldots, x_{t-n+1})P(x原创 2022-06-23 17:41:34 · 1702 阅读 · 0 评论 -
李沐动手学深度学习V2-NLP语言模型、数据集加载和数据迭代器实现以及代码实现
将文本数据映射为词元,以及将这些词元可以视为一系列离散的观测,例如单词或字符。假设长度为TTT的文本序列中的词元依次为x1,x2,…,xTx_1, x_2, \ldots, x_Tx1,x2,…,xT,于是xtx_txt(1≤t≤T1 \leq t \leq T1≤t≤T)可以被认为是文本序列在时间步ttt处的观测或标签。在给定这样的文本序列时,语言模型(language model)的目标是估计序列的联合概率P(x1,x2,…,xT).P(x_1, x_2, \ldots, x_T).P(x1原创 2022-06-21 16:49:11 · 1130 阅读 · 0 评论 -
李沐动手学深度学习V2-NLP文本预处理和代码实现
对于序列数据处理问题,上篇文章:李沐动手学深度学习V2-序列模型和代码实现评估了所需的统计工具和预测时面临的挑战,这样的数据存在许多种形式,文本是最常见例子之一。 例如一篇文章可以被简单地看作是一串单词序列,甚至是一串字符序列。文本的常见预处理步骤:首先从H.G.Well的时光机器中加载文本。这是一个相当小的语料库,只有30000多个单词,而现实中的文档集合可能会包含数十亿个单词。下面的函数将数据集读取到由多条文本行组成的列表中,其中每条文本行都是一个字符串,为简单起见,在这里忽略了标点符号和字母大写。3原创 2022-06-20 18:02:59 · 1121 阅读 · 0 评论 -
李沐动手学深度学习V2-NLP序列模型和代码实现
处理序列数据需要统计工具和新的深度神经网络架构,如下图股票价格示例所示,其中用xtx_txt表示价格,即在时间步(time step)t∈Z+t \in \mathbb{Z}^+t∈Z+时,观察到的价格xtx_txt。注意ttt对于本文中的序列通常是离散的,并在整数或其子集上变化。假设一个交易员想在ttt日的股市中表现良好,于是通过以下途径预测xtx_txt:xt∼P(xt∣xt−1,…,x1).x_t \sim P(x_t \mid x_{t-1}, \ldots, x_1).xt∼P(xt∣原创 2022-06-20 16:09:59 · 1186 阅读 · 0 评论 -
李沐动手学深度学习V2-风格迁移学习(style transfer learning)和代码实现
本节介绍如何使用卷积神经网络,自动将一个图像中的风格应用在另一图像之上,即风格迁移学习(style transfer learning)。 这里需要两张输入图像:一张是内容图像,另一张是风格图像,使用卷积神经网络修改内容图像,使其在风格上接近风格图像。 例如下图中内容图像为李沐老师在西雅图郊区的雷尼尔山国家公园拍摄的风景照,而风格图像则是一幅主题为秋天橡树的油画,最终输出的合成图像应用了风格图像的油画笔触让整体颜色更加鲜艳,同时保留了内容图像中物体主体的形状。首先初始化合成图像,例如将其初始化为内容图像,原创 2022-06-13 01:13:17 · 2965 阅读 · 2 评论 -
李沐动手学深度学习V2-全卷积网络FCN和代码实现
语义分割是对图像中的每个像素分类,全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换 ,与前面在图像分类或目标检测部分介绍的卷积神经网络不同,全卷积网络通过转置卷积层将中间层特征图的高和宽变换回输入图像的尺寸,因此输出的类别预测与输入图像在像素级别上具有一一对应关系:通道维的输出即该位置对应像素的类别预测。如下图所示为全卷积网络模型最基本的设计,全卷积网络先使用卷积神经网络抽取图像特征,然后通过 1×1 卷积层将通道数变换为类别个数(原创 2022-06-12 18:13:45 · 2190 阅读 · 1 评论 -
李沐动手学深度学习V2-转置卷积和代码实现
卷积神经网络层中卷积层和汇聚层,通常会减少下采样输入图像的空间维度(高和宽)。 然而如果输入和输出图像的空间维度保持相同,在以像素级分类的语义分割中将会很方便,输出像素所处的通道维可以保存有输入像素在同一位置上的分类结果。为了实现这一点,尤其是在空间维度被卷积神经网络层缩小后,可以使用另一种类型的卷积神经网络层,它可以增加上采样中间层特征图的空间维度。下面介绍转置卷积(transposed convolution), 用于逆转下采样导致的空间尺寸减小。先暂时忽略通道(通道为1),从基本的转置卷积开始,设步原创 2022-06-11 02:31:50 · 1989 阅读 · 0 评论 -
李沐动手学深度学习V2-语义分割和Pascal VOC2012数据集加载代码实现
目标检测问题中使用方形边界框来标注和预测图像中的目标,而语义分割(semantic segmentation)问题,重点关注于如何将图像分割成属于不同语义类别的区域。 与目标检测不同,语义分割可以识别并理解图像中每一个像素的内容:其语义区域的标注和预测是像素级的。如下图所示展示了语义分割中图像有关狗、猫和背景的标签,与目标检测相比,语义分割标注的像素级的边框显然更加精细。计算机视觉领域还有2个与语义分割相似的重要问题,即图像分割(image segmentation)和实例分割(instance segm原创 2022-06-09 17:01:42 · 3625 阅读 · 1 评论 -
李沐动手学深度学习V2-多尺度目标检测
一. 多尺度目标检测首先,考虑探测小目标,为了在显示时更容易分辨,在这里具有不同中心的锚框不会重叠: 锚框的尺度设置为0.15,特征图的高度和宽度设置为4,可以看到,图像上4行和4列的锚框的中心是均匀分布的,如下图所示。4. 然后,将特征图的高度和宽度减小一半,然后使用较大的锚框来检测较大的目标,当尺度设置为0.4时,一些锚框将彼此重叠,如下图所示。5. 最后进一步将特征图的高度和宽度减小一半,然后将锚框的尺度增加到0.8, 此时锚框的中心即是图像的中心,如下图所示。在某种规模上,假设有原创 2022-06-08 02:17:09 · 1619 阅读 · 0 评论 -
李沐动手学深度学习V2-目标检测边界框
根据坐标信息定义图像中狗和猫的边界框,图像中坐标的原点是图像的左上角,向右的方向为 𝑥 轴的正方向,向下的方向为 𝑦 轴的正方向。将边界框在图中画出,以检查其是否准确。 画之前定义一个辅助函数bbox_to_rect(),它将边界框表示成matplotlib的边界框格式。4. 小结......原创 2022-06-08 01:42:04 · 1607 阅读 · 1 评论 -
李沐动手学深度学习V2-目标检测数据集
一.目标检测数据集目标检测领域没有像MNIST和Fashion-MNIST那样的小数据集,为了快速测试目标检测模型,收集并标记了一个小型数据集。 首先拍摄了一组香蕉的照片,并生成了1000张不同角度和大小的香蕉图像,然后在一些背景图片的随机位置上放一张香蕉的图像,最后在图片上为这些香蕉标记了边界框。该数据集包括一个的CSV文件,内含目标类别标签和位于左上角和右下角的真实边界框坐标。通过使用read_data_bananas()函数读取图像和标签,以下BananasDataset类别将允许创建一个自定义Da原创 2022-06-08 01:24:03 · 1894 阅读 · 0 评论 -
李沐动手学深度学习V2-目标检测SSD
SSD模型主要由基础网络组成,其后是几个多尺度特征块。 基本网络用于从输入图像中提取特征,因此它可以使用深度卷积神经网络。 单发多框检测论文中选用了在分类层之前截断的VGG,现在也常用ResNet替代。 我们可以设计基础网络,使它输出的高和宽较大,从而基于该特征图生成的锚框数量较多,可以用来检测尺寸较小的目标,接下来的每个多尺度特征块将上一层提供的特征图的高和宽缩小(如减半),并使特征图中每个单元在输入图像上的感受野变得更广阔。由于接近顶部(输出层)的多尺度特征图较小,但具有较大的感受野,它们适合检测较少但原创 2022-06-07 16:22:07 · 1598 阅读 · 1 评论 -
李沐动手学深度学习V2-实战Kaggle比赛:叶子分类(Classify Leaves)和代码实现
一. 叶子分类预测叶子图像的类别,该数据集包含 176 个类别,18353 个训练图像,8800 个测试图像。每个类别至少有 50 张图像用于训练,测试集平均分为公共和私人排行榜,网址为:https://www.kaggle.com/competitions/classify-leaves/code由于images文件夹包含测试集和训练集所有图像,因此需要手动把测试集和训练集分开,所有代码如下,运行在一个GPU上面(lr,weight_decay,epochs = 2e-4,5e-4,100):i原创 2022-05-24 21:36:22 · 4836 阅读 · 3 评论 -
李沐动手学深度学习V2-实战Kaggle比赛:狗的品种识别(ImageNet Dogs)和代码实现
一. 实战Kaggle比赛:狗的品种识别(ImageNet Dogs)1. 介绍在这场比赛中,将识别120类不同品种的狗,这个数据集是ImageNet的数据集子集,与 CIFAR-10数据集中的图像不同, ImageNet数据集中的图像更高更宽,且尺寸不一。比赛网址:https://www.kaggle.com/c/dog-breed-identification比赛数据集分为训练集和测试集,分别包含RGB(彩色)通道的10222张、10357张JPEG图像。 在训练数据集中,有120种犬类,如拉布拉原创 2022-05-19 01:51:33 · 4827 阅读 · 3 评论 -
李沐动手学深度学习V2-实战 Kaggle 比赛:图像分类 (CIFAR-10)和代码实现
一.实战Kaggle竞赛:图像分类(CIFAR10)数据集信息比赛数据集分为训练集和测试集,其中训练集包含50000张、测试集包含300000张图像。 在测试集中,10000张图像将被用于评估,而剩下的290000张图像将不会被进行评估,包含它们只是为了防止手动标记测试集并提交标记结果。 两个数据集中的图像都是png格式,高度和宽度均为32像素并有三个颜色通道(RGB)。 这些图片共涵盖10个类别:飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车。数据集结构在…/data中解压下载的文件并在其中解原创 2022-05-17 12:37:09 · 4449 阅读 · 6 评论 -
使用Jupyter notebook和Pycharm 详细搭建深度学习远程服务器
一. Jupyter lab (Jupyter notebook)在远程服务器安装Jupyter Labpip install jupyterlab生成配置文件jupyter notebook --generate-config#生成的文件位于:~/.jupyter/jupyter_notebook_config.py #配置文件设置密码$ pythonIn [1]: from notebook.auth import passwdIn [2]: passwd()Ente原创 2022-05-16 12:16:02 · 7049 阅读 · 0 评论 -
李沐动手学深度学习V2-模型微调和代码实现
微调由于数据集有限,收集和标记数据可能需要大量的时间和金钱,因此需要应用迁移学习(transfer learning)将从源数据集学到的知识迁移到目标数据集。例如,尽管ImageNet数据集中的大多数图像与识别图像无关,但在此数据集上训练的模型可能会提取更通用的图像特征,这有助于识别边缘、纹理、形状和对象组合, 这些类似的特征也可能有效地识别当前图像。1. 微调步骤在源数据集(例如ImageNet数据集)上预训练神经网络模型,即源模型。创建一个新的神经网络模型,即目标模型。这将复制源模型上的所有模原创 2022-05-12 01:44:36 · 2393 阅读 · 1 评论 -
李沐动手学深度学习V2-图像增广和代码实现
图像增广大型数据集是成功应用深度神经网络的先决条件,因为解决了大型复杂网络的过拟合性。 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模。 此外,应用图像增广的原因是,随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力。 例如,我们可以以不同的方式裁剪图像,使感兴趣的对象出现在不同的位置,减少模型对于对象出现位置的依赖。 我们还可以调整亮度、颜色等因素来降低模型对颜色的敏感度。 可以说,图像增广技术对于AlexNet的成功是必不可少的。1.原创 2022-05-11 16:38:16 · 1945 阅读 · 1 评论 -
李沐动手学深度学习V2-多GPU数据并行使用Pytorch框架简洁实现
1. 多GPU数据并行简洁实现一般来说, 𝑘 个GPU数据并行训练过程如下:在任何一次训练迭代中,给定的随机的小批量样本都将被分成 𝑘 个部分,并均匀地分配到GPU上。每个GPU根据分配给它的小批量子集,计算模型的损失和参数的梯度。将 𝑘 个GPU中的局部梯度聚合,以获得当前小批量的随机梯度。聚合梯度被重新分发到每个GPU中。每个GPU使用这个小批量随机梯度,来更新它所维护的完整的模型参数集。Pytorch框架通过nn.DataParallel()多GPU数据并行函数来实现将网络多GPU数原创 2022-05-10 02:19:24 · 1602 阅读 · 0 评论 -
李沐动手学深度学习V2-多GPU数据并行内容和手动实现代码
1.多GPU并行1.1 多GPU并行方式模型并行:在多个GPU之间拆分网络。 也就是说,每个GPU将流入特定层的数据作为输入,跨多个后续层对数据进行处理,然后将数据发送到下一个GPU。 与单个GPU所能处理的数据相比,我们可以用更大的网络处理数据。 此外,每个GPU占用的显存(memory footprint)可以得到很好的控制,虽然它只是整个网络显存的一小部分。比如前五个层用第一个GPU计算,后面五个层用第二个GPU计算缺点:GPU的接口之间需要的密集同步可能是很难办的,特别是层之间计算的工作负载原创 2022-05-10 01:19:45 · 2092 阅读 · 0 评论