序言

  在学机器视觉的这段时间里梳理了很多的手记,惦记着就把这种手记再分类整理出去,随后写出Blog和各位一起共享。现阶段的方案以下(下列互联网所有应用Pytorch构建):

专题讲座一:机器视觉基本

  • 详细介绍CNN互联网(机器视觉的基本)
  • 探讨VGG互联网,详细介绍ResNet互联网(互联网特性是愈来愈深)
  • 详细介绍GoogleNet互联网(互联网特性是愈来愈宽)
  • 详细介绍DenseNet互联网(一个看起来十分NB可是却事实上用得很少的互联网)
  • 梳理期内还会继续共享一些自身已经参与的竞赛的Baseline

专题讲座二:GAN网络

  • 构建一般的GAN网络
  • 卷积和GAN
  • 标准GAN
  • 方式奔溃的现象及网络维护

  之上会出现有关编码实践活动,编码是根据Pytorch架构。话不多说,大家先开展专题讲座一的第一部分详细介绍,卷积和神经元网络。

一、CNN解决了什么问题?

  在CNN发生以前,针对图片的解决一直全是一个非常大的难题,一方面由于图象处理的信息量很大,例如一张512 x 512的灰度图,它的填写主要参数就早已做到了252144个,更不要说1024x1024x3这类的彩色图,这也致使了它的处置成本费十分价格昂贵且效果极低。另一方面,图象在信息化的环节中难以保障原来的特点,这也致使了图象处理的准确度不高。

  而CNN互联网可以有效的处理上面2个难题。针对第一个难题,CNN互联网它可以有效的将繁杂的现象简单,将大批量的主要参数特征提取成小量的主要参数再做解决。换句话说,在绝大多数的情景下,大家应用特征提取不容易危害結果。例如在日常日常生活,大家用一张1024x1024x3表明鸟的彩色图和一张100x100x3表明鸟的彩色图,大家大部分都可以用眼睛鉴别出这也是一只鸟而不是一只狗。这也是卷积和神经元网络在图像分类里的一个关键运用。【ps:卷积和神经元网络能够对一张图片开展是猫或是狗开展归类。假如一张图片里有猫有狗有鸡,我们要各自鉴别出每一个地区的小动物,并且用色调切分出去,基本的CNN互联网还可以应用吗?这是一个扩展思索,有感兴趣的大家能够看一下FCN互联网。比照下可以更快的了解CNN互联网】

  针对第二个难题,CNN互联网运用了相近视觉效果的形式留下了画面的特点,当图象做旋转、转动或是转换方向的情况下,它也可以高效的分辨出来了是相似的图象。

  之上2个难题的处理,全是因为CNN互联网具备下列优点和特性:部分地区联接、权重值共享资源。在表述这三个特性以前,大家先看一下CNN互联网的三大关键构造,卷积层、池化层(或是称为聚集层)、池化层。

二、CNN互联网的构造

2.1 卷积层 - 获取特点

离散卷积

  掌握卷积层,大家先要了解一下离散卷积。别以为它称为卷积和,可是和严苛的意义上的数学课卷积和是不一样的。深度神经网络说白了的离散卷积是互相关( cross-correlation )计算。【事实上,历经数学课证实发觉不管用严苛卷积和或互相关计算,卷积层的輸出不容易受很大危害。而互相关计算比严苛离散卷积简约的多,因此 大家一般都选用互相关计算来取代严苛的意义上的离散卷积。】大家以二维数据信息为例子(高 x 宽),不考虑到图象的安全通道数量,假定键入的高宽比为3、总宽为3的二维偏微分,全连接层的髙度和总宽全是2,而全连接层对话框的样子由核心的髙度和总宽决策:

  二维的互相关计算。黑影一部分是第一个輸出原素,及其用作测算这一輸出的填写和核偏微分原素: 0 x 0 1x1 3x2 4x3 = 19。不难看出互相关计算便是一个相乘求饶的全过程。在二维互相关计算中,卷积和对话框从键入偏微分的左上方逐渐,从左往右、从上向下滚动。这儿大家设定步幅为1,即每一次超越一个间距。当卷积和对话框滑到新一个部位时,包括在该对话框中的一部分偏微分与全连接层偏微分开展按原素乘积,获得的偏微分再求饶获得一个单一的标量值,从而大家获得了这一部位的輸出张数值。 【大家这儿经常提及了偏微分,偏微分(Tensor)是一个多维数组,它是标量、空间向量、引流矩阵的高维空间扩展。】

  看过以上的內容,很有可能有阅读者逐渐思索,假如这一键入引流矩阵是 4x4,全连接层是3x3,步幅为1的情况下,在往右边挪动时,大家看到假如要和全连接层开展卷积和实际操作,左便的键入引流矩阵还缺乏了一列;内行的角度也是这般。如果我们忽视边沿的清晰度,大家也许就损失了边界的关键点。那麼这类情形下大家如何处理呢?这时候我们可以开展添充实际操作(padding),在使用 pytorch完成时我们可以在Convd涵数中对padding开展设定,这儿我们可以设定padding=1,就可以在列和行上向外扩大一圈。【ps:事实上当解决较为大尺寸照片,且每日任务是归类每日任务时,我们可以无需开展padding。由于针对大多数的图像分类每日任务,边沿的关键点是是无关痛痒的,且边沿的像素数对比于总的清晰度而言,占有率是不大的,针对全部图像分类的每日任务結果干扰并不大】

  针对卷积和实际操作,大家有一个统一的计算方法。且学好有关的测算针对掌握感受野和网上的构建尤为重要。学好有关的测算,我们在构建自个的互联网或是重现他人的互联网,才可以明确好添充padding、步幅stride及其全连接层kernel size的主要参数尺寸。一般这儿有一个统一的公式计算:

假定图象的外形尺寸是 input x input,全连接层的高低是kernel,添充数值padding,步幅为stride,卷积和后导出的规格为output x output,则卷积和后,规格的计算方法为:

\[output = \frac{input - kernel 2 * padding}{stride} 1 \]

ps:假如导入的图像尺寸是 mxn种类的,能够根据剪裁 or 插值法转化成 mxm or nxn种类的图象;或是各自测算图形的高和宽尺寸还可以,公式计算全是相似的。

  我们在第二一部分的一开始提及过特点投射(feature map)。实际上每一层卷积层获得的输入输出就被称作一个feature map,因为它能够被算作一个键入投射到下一层空间和时间的转化器。在CNN中,针对某一层的随意原素x,其感受野(Receptive Field)是指前向散播期内很有可能影象x测算的全部原素(来源于全部的此前层)。伴随着传输层数愈来愈深,感受野会越来越大。在感受野转变 的环节中,偏浅的感受野较为小,学习培训到一些部分区域的特征,较深的卷积层有很大的感受野,可以了解到更为抽象性的一些特点。

权重值共享资源

  我们在前边有提及过CNN互联网的一个特点是权重值共享资源(share weights)也就是反映在安全通道解决的环节中。一般的神经系统传输层与层中间的衔接是,每一个神经细胞与上一层的所有神经细胞联接,这种电极连接线的权重值单独于其余的神经细胞,因此假定上一层是m个神经细胞,当今层是n个神经细胞,那麼一共有mxn个联接,也就会有mxn个权重值。权重值引流矩阵是mxn的方式。那麼CNN是怎样呢?权重值共享资源代表什么意思?大家引进下边那样一张图来协助大家了解:

img

  大家先表明图中中每个组件的引流矩阵文件格式及关联:

  • 键入引流矩阵文件格式:(样本量,图象高宽比,图象总宽,图象安全通道数)
  • 輸出引流矩阵文件格式:(样本量,图象高宽比、图象总宽、图象安全通道数)
  • 全连接层的文件格式:(全连接层高宽比、全连接层总宽、键入安全通道数、輸出安全通道数)
  • 全连接层的导入安全通道数(in depth)由键入引流矩阵的安全通道数所决策。(鲜红色标明)
  • 輸出引流矩阵的安全通道数(out depth)由全连接层的輸出安全通道所决策。(翠绿色标明)
  • 輸出引流矩阵的髙度和总宽,由键入引流矩阵、全连接层尺寸、步幅、添充一同决策,实际计算方法见上文。

  当键入一张尺寸为8x8x3的彩色图时,大家早已事先设计方案好啦全连接层后的輸出安全通道为5,即全连接层的数量为5【即五个参考点,一个全连接层一个参考点】(安全通道数的设计方案一般是试验后获得的较好結果)。每一个全连接层去和键入图象在安全通道上一一对应开展卷积和实际操作(即互相关实际操作,除非是有意注重,这儿所指的卷积和全是互相关,步幅为1,添充为0),获得了3个6x6的feature map。随后再将三个6x6的Feature map依照Eletwise求和开展安全通道结合获得最后的feature map,尺寸为6x6(也就是将获得的三个引流矩阵逐原素求和,以后全部原素再再加上该引流矩阵的参考点值,获得新的6x6引流矩阵)。权重值共享资源也是反映在这个环节中。大家独立获取出第一个全连接层,当它的第一个安全通道(3x3)与键入图片的第一个安全通道(8x8)开展卷积和实际操作时,依照平常的神经元网络接口方式其权重值引流矩阵是9 x 81。可是在这里我们要留意,我们在对话框滚动开展卷积和的实际操作权重值是明确的,全是以键入图片的第一个安全通道为模版,全连接层的第一个安全通道3x3引流矩阵为权重,随后获得卷积和結果。这一全过程中权重值引流矩阵便是3x3,且数次使用于每一次测算中。权重值的数量有9x81降低到3x3,巨大的降低了主要参数的总数。综合性起來,针对第一个全连接层而言,它的权重值引流矩阵便是3x3x3 1,全部卷积和全过程的权重值尺寸为3x3x3x5 5,而不是8x8x3x3x3x3x5。权重值共享资源大大减少了实体模型的训炼主要参数。权重值共享资源代表着当今掩藏层中的全部神经细胞都是在检验图象不一样部位处的同一个特点,即检验特点同样。因而也将键入层到掩藏层的这类投射称之为特点投射。由上我们可以了解,从某种程度上而言,安全通道便是某种程度上的特性图。輸出的同一张特点图上的全部原素共享资源一个全连接层,即共享资源一个权重值。安全通道中某一处(特点图上某一个神经细胞)标值的尺寸便是所在位置对当今特点高低的反映。而为啥CNN互联网中人们会提升安全通道数量,实际上 也是在提升安全通道的环节中区学习培训图象的数个不一样特点。

稀少联接

  根据以上针对卷积和的流程及其权重值共享资源的表述,大家可以归纳出CNN的另一个特点。用心的阅读者实际上可以自身汇总出去。大家在上面提及过,针对一般的神经元网络,掩藏层和键入层中间的神经细胞是选用全连接的方法。殊不知CNN互联网并没有这般。它的在部分地区建立联接,即稀少联接。例如,针对一张键入的多通道的8x8图片,大家用3x3的全连接层和他开展卷积和,全连接层中的每一个因素的值是和8x8引流矩阵中选择了3x3的引流矩阵做离散卷积,随后根据滑动窗口的方法,全连接层中的每一个原素(也就是神经细胞)只与上一层的全部神经细胞中的9个开展联接。对比于神经细胞相互间的全接口方式,稀少联接巨大的程度上的降低了主要参数的总数,与此同时也一定水平上防止了实体模型的多重共线性。这类优化算法的设计灵感是来源于小动物视觉效果的表皮层构造,其指的是小动物视觉效果的神经细胞在认知外部物质的环节中起功效的仅有一部分神经细胞。在机器视觉中,清晰度中间的关联性与清晰度中间的间距一样有关,间距较近的象素间关联性强,间距很远则关联性较为弱,不难看出部分关联性基础理论也适用机器视觉的图象处理。因而,部分认知(稀少联接)选用一部分神经细胞接纳图象信息内容,再利用综合性所有的图形信息内容做到提高图象数据的目地。(对于人们为何如今常常选用3x3全连接层,由于试验結果告知大家,3x3全连接层经常能实现更快的试验实际效果。)

汇总:规范的卷积和实际操作

  在开展上边的解读后,坚信各位早已针对什么叫卷积和,卷积和的二点特性:稀少连接和权重值共享资源早已得到掌握。下边咱们来汇总一般实际意义的规范的卷积和实际操作:当导入的feature map总数(即导入的安全通道数)是N,卷积层filter(全连接层)数量是M时,则M个filter中,每一个filter都是有N个channel,都需要各自和填写的N个安全通道做卷积和,获得N个特点图,随后将这N个feature map按Eletwise求和(即:开展安全通道结合),再再加上该filter相匹配的参考点(一个filter相匹配一个共享资源参考点),做为该全连接层所得的的特性图。同样,对别的M-一个filter也开展上述实际操作。因此最后该层的输入输出为M个feature map(即:輸出channel相当于filter的数量)。由此可见,輸出的同一张特点图上的全部原素共享资源同一个全连接层,即共享资源一个权重值。不一样特点图相匹配的全连接层不一样。

img

卷积和的实际意义

  假如用图象处理上的专业名词,我们可以将卷积和称为动态模糊。卷积和实际上是要想注重一些特点,随后将特点加强后获取出去,不一样全连接层关注图片上不一样的特点,例如有的更关心边沿而有的更关心中心地段等。当进行好多个卷积层后(卷积和 激活函数 池化)【后边解读激活函数和池化】,如下图所示:

  在CNN中,大家便是根据持续的更改全连接层矩阵的值来关心不一样的关键点,获取不一样的特点。换句话说,在大家复位全连接层的引流矩阵值(即权重值主要参数)后,大家根据梯度下降法持续减少loss来得到较好的权重值主要参数,全部流程全是全自动更改的。

1x1卷积和的积极意义

  按照道理讲,我是不应该这么快就引进1x1卷积和的,但是充分考虑它在各种各样互联网中运用的必要性而且也不难理解,就在这里提早和大伙儿解释一下1x1卷积和是啥,功效是啥。

  如果有阅读者在了解完上文所提及的卷积和后,很有可能会产生疑惑:卷积和的实质并不是合理的获取邻近清晰度间的有关特点吗?1x1全连接层的各个安全通道和上一层的渠道开展卷积和实际操作的情况下并不是无法鉴别邻近原素了没有?

  其实不是,1x1卷积层确实是在高宽比和间距的层面上失去鉴别邻近原素间的相互影响的工作能力,而且根据1x1全连接层后的輸出效果的高和宽与上一层的高和宽是同样的。可是,安全通道数量可能是不一样的。而1x1卷积和的唯一测算也恰好是出现在安全通道上。它借助更改1x1全连接层的总数,完成了多路的线形累加,促使差异的feature map开展线形累加。大家根据下面的图来更快的了解1x1卷积和的功效:

../_images/conv-1x1.svg

  图中应用了两个安全通道的1x1全连接层与3个安全通道的3x3键入引流矩阵开展卷积和实际操作。由图得知,这儿的填写和輸出具备同样的髙度和总宽,輸出的每一个要素都是以键入图片的同一部位的要素的线性组合。我们可以将1x1卷积层看作是每一个清晰度部位运用的池化层。与此同时,大家发觉輸出效果的安全通道数量发生了更改,这也是1x1卷积和的一个关键运用。能够对輸出安全通道开展升维或是特征提取,而且不更改图像尺寸的尺寸,有益于跨安全通道的数据沟通的含义。特征提取以后我们可以促使主要参数总数越来越更少,训炼更快,内存占用也会越来越少。如果是在GPU上训炼,显卡内存就更为宝贵了。

  卷积网络的一个十分关键的使用便是ResNet互联网,而ResNet网络架构,早已使用于各种各样大中型互联网中,能够算是经常可以看到。这儿先铺个ResNet中使用了1x1卷积和的方差块,后边会出现一篇文章来讲解ResNet互联网:ResNet paper download

2.2 激活函数

  由上述得知,在CNN中,卷积和实际操作仅仅加权求和的线形实际操作。若神经元网络中仅用卷积层,那麼不管有多少层,輸出全是键入的线性组合,互联网的语言表达能力比较有限,没法学习培训到非线性函数。因而CNN引进激活函数,激活函数是个非线性函数,常见于卷积层和池化层輸出的每一个神经细胞,给神经细胞引进了离散系统要素,使网上的语言表达能力更强,基本上能够靠近随意涵数,那样的神经元网络就可运用到很多的离散系统实体模型中,大家可以用公式计算来界定掩藏层的每一个神经细胞輸出公式计算:

\[y_l^i = W_l \times x_{l-1}^{n \times n} b_l \]

在其中,\(b_l\)是该认知与衔接的共享资源参考点,\(W_l\)​是个nxn的共享资源权重值引流矩阵,\(X_{l-1}^{n \times n}\)​意味着在键入层的nxn的矩形框区域的特征值。

  当激活函数功效于卷积层的輸出时:

\[y_l^i = \sigma (W_l \times x_{l-1}^{n \times n} b_l) \]

这儿的\(\sigma\)是神经细胞的激励函数,能够是Sigmoid、tanh、ReLU等涵数。

2.3 池化层(下采样) - 数据降维,防止多重共线性

  在CNN中,池化层一般在卷积和或是激励函数的后边,池化的形式有二种,全较大池化或是均值池化,池化关键有三个作用:

  • 一是减少卷积层对总体目标部位的敏感性,即完成部分移动不变,当键入有一定的移动时,历经池化后輸出不容易发生改变。CNN根据引进池化,促使其svm算法不容易由于总体目标部位改变而遭受很大的危害。
  • 二是减少对室内空间降取样表明的敏感度
  • 三是可以对其开展特征提取缩小,以加速计算速率 ,避免多重共线性。

  与卷积层相近的是,池化层操作符有一个固定不动的对话框构成,该对话框也是依据步幅尺寸在填写的任何地区上滚动,为固定不动的样子对话框解析xml每一个部位测算一个輸出。

輸出的偏微分高宽比为2,总宽为2,这四个原素为每一个池化对话框中的最高值(stride=1,padding=0):

  可是,有别于卷积层中的导入与全连接层中间的互相关测算,池化层不包含主要参数。池化层的操作符是可预测性的,大家一般测算池化对话框中所有的要素的极值或均值(些实际操作各自被称作较大池化层和平均池化层),而不是像卷积层那般将各渠道的键入在互相关实际操作后开展eletwise特征融合,这也代表着池化层的輸出安全通道数和键入安全通道数量是同样的。池化实际操作的测算一般方式为,设键入图像尺寸为WxHxC,宽x高x深层,全连接层的规格为FxF,S:步幅,则池化后图象的尺寸为:

\[W = \frac{W-F}{S} 1 \\ H = \frac{H-F}{S} 1 \]

2.4 池化层 - 归类,輸出結果

  大家刚给讲了卷积层、池化层和激活函数,这种在池化层以前层的效果全是将原始记录投射到隐层特点室内空间来获取特点,而池化层的效果便是将了解到的特点表明投射到样品的标识室内空间。也就是说,便是把特点正和岛一起(高宽比纯化特点),便捷交到最终的支持向量机或是重归。

  大家还可以把池化层的历程看作一个卷积和全过程,比如某一互联网在历经卷积和、ReLU激话后获得3x3x5的輸出,随后历经池化层转化成1x4096的方式:

  从上面我们可以看得出,大家用一个3x3x5的filter去卷积激活函数的輸出,获得的结论是池化层的一个神经细胞,由于咱们有4096个神经细胞,大家事实上便是用一个3x3x5x4096的卷积层去卷积激活函数的輸出【没有参考点】。因而池化层中的每一个神经细胞都能够当做一个没有参考点加权平均值的代数式,我们可以简易写出$y_l^i = W_l \times x_{l-1}^{n \times n} $​。​

  这一步卷积和还有一个十分关键的功效,便是把分布式系统特点representation投射到样版标识室内空间,简易说便是把特点融合到一起,輸出为一个值,那样能够大大减少特点部位对归类产生的危害。

  从上边的图,我们可以看得出,猫在不一样的部位,輸出的矩阵的特征值同样,可是部位不一样;针对电脑上而言,矩阵的特征值同样,可是矩阵的特征值部位不一样,那归类結果可能是不一样的。这时池化层的效果便是,在展开后忽视其空间布局特点,无论它在哪里,只需它有这一猫,那麼就能辨别它是猫。这也表明了它是一个跟全局性图象的难题相关的难题(比如:图象是不是包括一只猫呢)。这也表明了池化层的构造不宜用以在方向上找patter的每日任务,比如切分每日任务(后边的FCN便是将池化层改为了卷积层)。但是池化层有一个非常大的缺陷,便是主要参数过度多。因此后边的像ResNet互联网、GoogLeNet都早已选用全局性均值池化替代池化层来结合学得的特点。此外,主要参数多了也导致了此外一个难题,实体模型复杂性提高,自学能力太好不容易导致多重共线性。

三、Pytorch完成LeNet互联网

  LeNet实体模型是最先发表的卷积和神经元网络之一,它是由AT&T贝尔实验室的研究所Yann LeCun在1989年明确提出的,目地是识别图像中的手写数字,发布了第一篇根据反向传播取得成功训炼卷积和神经网络模型的科学研究。大家如今根据pytorch来完成:LeNet - Paper Download 。

  LeNet它尽管不大,可是涵盖了深度神经网络的主要控制模块。大家先向LeNet构造开展一个实际的剖析,这也是大家构建一切一个神经元网络以前要事先明白的:

  每一个卷积和块中的基础模块是一个卷积层、一个Sigmod激活函数和平均池化层。(尽管ReLU涵数和较大池化层很合理,可是那时候还没发生)。每一个卷积层应用5x5全连接层和一个Sigmoid激活函数。第一个卷积层有6个輸出安全通道,第二个卷积层有16个輸出安全通道。每一个2x2赤化实际操作根据室内空间下采样将维数降低4倍。卷积和的輸出样子由(大批量尺寸,安全通道数,高宽比,总宽)决策。LeNet中有三个池化层,各自有120、84、10个輸出,由于我们在实行手写数字的归类每日任务(一共有0-9共10个数据),因此輸出层的10维相匹配于最终导出的结论的总数。

把上边的模型简化一下,网络架构大约就是这个模样:

3.1 实体模型界定

import torch
from torch import nn
from d2l import torch as d2l


class Reshape(torch.nn.Module):
    def forward(self, x):
        # 根据view涵数把图象展成规范的Tensor接受文件格式,即(样版总数,安全通道数,高,宽)
        return x.view(-1, 1, 28, 28)

net = torch.nn.Sequential(
    Reshape(),
    # 第一个卷积和块,这儿使用了padding=2
    nn.Conv2d(1, 6, kernel_size=5, padding=2), 
    nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    # 第二个卷积和块
    nn.Conv2d(6, 16, kernel_size=5),   nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    # 较密块(三个池化层)
    nn.Flatten(),
    nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
    nn.Linear(120, 84), nn.Sigmoid(),
    nn.Linear(84, 10))
X = torch.rand(size=(1, 1, 28, 28), dtype=torch.float32)
for layer in net:
    X = layer(X)
    print(layer.._class._.._name._,'output shape: \t',X.shape)

輸出结果显示为:

3.2 实体模型训炼(应用GPU训炼)

大家用LeNet在Fashion-MNIST数据上检测实体模型主要表现結果:

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=batch_size)

def evaluate_accuracy_gpu(net, data_iter, device=None): #@save
    """应用GPU测算实体模型在数据上的精密度。"""
    if isinstance(net, torch.nn.Module):
        net.eval()  # 设定为评定方式
        if not device:
            device = next(iter(net.parameters())).device
    # 恰当预测分析的总数,总预测分析的总数
    metric = d2l.Accumulator(2)
    for X, y in data_iter:
        if isinstance(X, list):
            X = [x.to(device) for x in X]
        else:
            X = X.to(device)
        y = y.to(device)
        metric.add(d2l.accuracy(net(X), y), y.numel())
    return metric[0] / metric[1]

#@save
def train_ch6(net, train_iter, test_iter, num_epochs, lr, device):
    """用GPU训炼实体模型。"""
    def init_weights(m):
        if type(m) == nn.Linear or type(m) == nn.Conv2d:
            nn.init.xavier_uniform_(m.weight)
    net.apply(init_weights)
    print('training on', device)
    net.to(device)
    optimizer = torch.optim.SGD(net.parameters(), lr=lr)
    loss = nn.CrossEntropyLoss()
    animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs],
                            legend=['train loss', 'train acc', 'test acc'])
    timer, num_batches = d2l.Timer(), len(train_iter)
    for epoch in range(num_epochs):
        # 训炼损害之和,训炼准确度之和,案例数
        metric = d2l.Accumulator(3)
        net.train()
        for i, (X, y) in enumerate(train_iter):
            timer.start()
            optimizer.zero_grad()
            X, y = X.to(device), y.to(device)
            y_hat = net(X)
            l = loss(y_hat, y)
            l.backward()
            optimizer.step()
            with torch.no_grad():
                metric.add(l * X.shape[0], d2l.accuracy(y_hat, y), X.shape[0])
            timer.stop()
            train_l = metric[0] / metric[2]
            train_acc = metric[1] / metric[2]
            if (i   1) % (num_batches // 5) == 0 or i == num_batches - 1:
                animator.add(epoch   (i   1) / num_batches,
                             (train_l, train_acc, None))
        test_acc = evaluate_accuracy_gpu(net, test_iter)
        animator.add(epoch   1, (None, None, test_acc))
    print(f'loss {train_l:.3f}, train acc {train_acc:.3f}, '
          f'test acc {test_acc:.3f}')
    print(f'{metric[2] * num_epochs / timer.sum():.1f} examples/sec '
          f'on {str(device)}')

3.3 训炼和评定实体模型

``

lr, num_epochs = 0.9, 10
train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

这一就是我的训炼結果,大约就酱紫,告一段落告一段落,累死我了。

引入:

https://www.cnblogs.com/chumingqian/articles/11495364.html

https://blog.csdn.net/u011240016/article/details/78475043

https://mp.weixin.qq.com/s/eOM3YHPkCCmMpLrv4ZDhBA

https://zhuanlan.zhihu.com/p/33841176

https://blog.csdn.net/weixin_45829462/article/details/106548749

评论(0条)

刀客源码 游客评论