(pytorch-深度学习系列)深度卷积神经网络AlexNet

深度卷积神经网络AlexNet

文字过多,但是重点已经标出来了

背景

在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意。一方面,神经网络计算复杂。虽然20世纪90年代也有过一些针对神经网络的加速硬件,但并没有像之后GPU那样大量普及。因此,训练一个多通道、多层和有大量参数的卷积神经网络在当年很难完成。另一方面,当年研究者还没有大量深入研究参数初始化和非凸优化算法等诸多领域,导致复杂的神经网络的训练通常较困难

神经网络可以直接基于图像的原始像素进行分类。这种称为端到端(end-to-end)的方法节省了很多中间步骤。然而,在很长一段时间里更流行的是研究者通过勤劳与智慧所设计并生成的手工特征。这类图像分类研究的主要流程是:

  • 获取图像数据集;
  • 使用已有的特征提取函数生成图像的特征;
  • 使用机器学习模型对图像的特征分类。

当时认为的机器学习部分仅限最后这一步。如果那时候跟机器学习研究者交谈,他们会认为机器学习既重要又优美。优雅的定理证明了许多分类器的性质。机器学习领域生机勃勃、严谨而且极其有用。然而,如果跟计算机视觉研究者交谈,则是另外一幅景象。他们会告诉你图像识别里“不可告人”的现实是:计算机视觉流程中真正重要的是数据和特征。也就是说,使用较干净的数据集和较有效的特征甚至比机器学习模型的选择对图像分类结果的影响更大。

特征的表示

  • 在相当长的时间里,特征都是基于各式各样手工设计的函数从数据中提取的。事实上,不少研究者通过提出新的特征提取函数不断改进图像分类结果。

  • 然而,另一些研究者认为特征本身也应该由学习得来。他们还相信,为了表征足够复杂的输入,特征本身应该分级表示。多层神经网络可能可以学得数据的多级表征,并逐级表示越来越抽象的概念或模式

  • 以图像分类为例,(二维卷积层)中物体边缘检测的例子。在多层神经网络中,图像的第一级的表示可以是在特定的位置和⻆度是否出现边缘;

  • 而第二级的表示说不定能够将这些边缘组合出有趣的模式,如花纹;

  • 在第三级的表示中,也许上一级的花纹能进一步汇合成对应物体特定部位的模式。这样逐级表示下去,最终,模型能够较容易根据最后一级的表示完成分类任务。需要强调的是,输入的逐级表示由多层模型中的参数决定,而这些参数都是学出来的。

AlexNet

AlexNet网络结构

直接上图:AlexNet网络结构
在这里插入图片描述

AlexNet包含8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。

  • 第一层中的卷积窗口形状是11×1111\times1111×11
  • 第二层中的卷积窗口形状减小到5×55\times55×5
  • 之后全采用3×33\times33×3
  • 第一、第二和第五个卷积层之后都使用了窗口形状为3×33\times33×3、步幅为2的最大池化层
  • AlexNet使用的卷积通道数大于LeNet中的卷积通道数几十倍
  • 紧接着最后一个卷积层的是两个输出个数为4096的全连接层

简单说网络结构就是:
卷积(96个11∗11的核)(步长为4)→降采样(最大池化)(3∗3的核,步长2)→.卷积(256个5∗5的核)(padding为2)→降采样(最大池化)(3∗3的核,步长2)→.卷积(384个3∗3的核)(padding为1)→.卷积(384个3∗3的核)(padding为1)→.卷积(256个3∗3的核)(padding为1)→降采样(最大池化)(3∗3的核,步长2)→.全连接6∗6∗256→4096→全连接4096→4096→全连接4096→10\begin{matrix}卷积 \\ (96个11*11的核) \\(步长为4)\end{matrix} \rightarrow \begin{matrix}降采样(最大池化) \\ (3*3的核,步长2) \end{matrix}\rightarrow \\.\\ \begin{matrix}卷积 \\ (256个5*5的核)\\(padding为2) \end{matrix} \rightarrow \begin{matrix}降采样(最大池化) \\ (3*3的核,步长2) \end{matrix}\rightarrow \\.\\ \begin{matrix}卷积 \\ (384个3*3的核)\\(padding为1)\end{matrix} \rightarrow \\.\\ \begin{matrix}卷积 \\ (384个3*3的核)\\(padding为1)\end{matrix} \rightarrow \\.\\ \begin{matrix}卷积 \\ (256个3*3的核)\\(padding为1)\end{matrix} \rightarrow \begin{matrix}降采样(最大池化) \\ (3*3的核,步长2) \end{matrix}\rightarrow \\.\\ \begin{matrix}全连接 \\ 6*6*256\rightarrow4096\end{matrix}\rightarrow \begin{matrix}全连接 \\ 4096\rightarrow4096\end{matrix}\rightarrow \begin{matrix}全连接 \\ 4096\rightarrow10\end{matrix} (961111)(4)()(332).(25655)(padding2)()(332).(38433)(padding1).(38433)(padding1).(25633)(padding1)()(332).66256409640964096409610

每层尺寸解析:
(1)
原始图像的227*227*3的图像(最开始是224*224*3,为后续处理,t需要调整为227)
卷积(96个11∗11的核)(步长为4)⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋=⌊(227−11+0×2+4)/4⌋×⌊(227−11+0×2+4)/4⌋=55×55.降采样(最大池化)(3∗3的核,步长2)⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋=⌊(55−3+0×2+2)/2⌋×⌊(55−3+0×2+2)/2⌋=27×27\begin{matrix}卷积 \\ (96个11*11的核) \\(步长为4)\end{matrix}\\ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor = \\ \lfloor(227-11+0\times2+4)/4\rfloor \times \lfloor(227-11+0\times2+4)/4\rfloor = 55 \times 55 \\.\\ \begin{matrix}降采样(最大池化) \\ (3*3的核,步长2) \end{matrix} \\ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor = \\ \lfloor(55-3+0\times2+2)/2\rfloor \times \lfloor(55-3+0\times2+2)/2\rfloor = 27 \times 27 (961111)(4)(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw=(22711+0×2+4)/4×(22711+0×2+4)/4=55×55.()(332)(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw=(553+0×2+2)/2×(553+0×2+2)/2=27×27
第一层卷积层结束后形成的图像层的规模为27∗27∗9627*27*96272796.分别由96个卷积核对应生成,这96层数据分为2组,每组48个像素层
(2)
卷积(256个5∗5的核)(padding为2)⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋=⌊(27−5+2×2+1)/1⌋×⌊(27−5+2×2+1)/1⌋=27×27.降采样(最大池化)(3∗3的核,步长2)⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋=⌊(27−3+0×2+2)/2⌋×⌊(27−3+0×2+2)/2⌋=13×13\begin{matrix}卷积 \\ (256个5*5的核)\\(padding为2) \end{matrix}\\ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor = \\ \lfloor(27-5+2\times2+1)/1\rfloor \times \lfloor(27-5+2\times2+1)/1\rfloor = 27 \times 27 \\.\\ \begin{matrix}降采样(最大池化) \\ (3*3的核,步长2) \end{matrix} \\ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor = \\ \lfloor(27-3+0\times2+2)/2\rfloor \times \lfloor(27-3+0\times2+2)/2\rfloor = 13 \times 13 (25655)(padding2)(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw=(275+2×2+1)/1×(275+2×2+1)/1=27×27.()(332)(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw=(273+0×2+2)/2×(273+0×2+2)/2=13×13
第二层输入数据为第一层输出的27*27*96的像素层,分为2组像素数据,两组像素数据分别在两个不同的GPU中进行运算,一共有256个卷积核,即池化后像素的规模为2组13*13*128的像素层。
(3)
卷积(384个3∗3的核)(padding为1)⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋=⌊(13−3+1×2+1)/1⌋×⌊(13−3+1×2+1)/1⌋=13×13\begin{matrix}卷积 \\ (384个3*3的核)\\(padding为1)\end{matrix} \\ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor = \\ \lfloor(13-3+1\times2+1)/1\rfloor \times \lfloor(13-3+1\times2+1)/1\rfloor = 13 \times 13 (38433)(padding1)(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw=(133+1×2+1)/1×(133+1×2+1)/1=13×13
一共有384个卷积核,同理,也就是13*13*192两组像素层。
(4)
卷积(384个3∗3的核)(padding为1)⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋=⌊(13−3+1×2+1)/1⌋×⌊(13−3+1×2+1)/1⌋=13×13\begin{matrix}卷积 \\ (384个3*3的核)\\(padding为1)\end{matrix} \\ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor = \\ \lfloor(13-3+1\times2+1)/1\rfloor \times \lfloor(13-3+1\times2+1)/1\rfloor = 13 \times 13 (38433)(padding1)(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw=(133+1×2+1)/1×(133+1×2+1)/1=13×13
一共有384个卷积核,同理,也就是13*13*192两组像素层。
(5)
卷积(256个3∗3的核)(padding为1)⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋=⌊(13−3+2×1+1)/1⌋×⌊(13−3+2×1+1)/1⌋=13×13.降采样(最大池化)(3∗3的核,步长2)⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋=⌊(13−3+0×2+2)/2⌋×⌊(13−3+0×2+2)/2⌋=6×6\begin{matrix}卷积 \\ (256个3*3的核)\\(padding为1) \end{matrix}\\ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor = \\ \lfloor(13-3+2\times1+1)/1\rfloor \times \lfloor(13-3+2\times1+1)/1\rfloor = 13 \times 13 \\.\\ \begin{matrix}降采样(最大池化) \\ (3*3的核,步长2) \end{matrix} \\ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor = \\ \lfloor(13-3+0\times2+2)/2\rfloor \times \lfloor(13-3+0\times2+2)/2\rfloor = 6 \times 6 (25633)(padding1)(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw=(133+2×1+1)/1×(133+2×1+1)/1=13×13.()(332)(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw=(133+0×2+2)/2×(133+0×2+2)/2=6×6
一共有256个卷积核,同理,也就是6*6*128两组像素层。
(6)
第6层输入数据的尺寸是6*6*256,采用6*6*256尺寸的滤波器对第六层的输入数据进行卷积运算;每个6*6*256尺寸的滤波器对第六层的输入数据进行卷积运算生成一个运算结果,通过一个神经元输出这个运算结果;共有4096个6*6*256尺寸的滤波器对输入数据进行卷积,通过4096个神经元的输出运算结果;然后通过ReLU激活函数以及dropout运算输出4096个本层的输出结果值。所以结果是2个2048输出结果组
(7)
第6层输出的4096个数据与第7层的4096个神经元进行全连接,然后由ReLU和Dropout进行处理后生成4096个数据。所以结果是2个2048输出结果组
(8)
第7层输入的4096个数据与第8层的1000个神经元进行全连接。

与LeNet的显著区别

  • AlexNet将sigmoid激活函数改成了更加简单的ReLU激活函数
    (ReLU激活函数的计算更简单,例如它并没有sigmoid激活函数中的求幂运算。另一方面,ReLU激活函数在不同的参数初始化方法下使模型更容易训练。这是由于当sigmoid激活函数输出极接近0或1时,这些区域的梯度几乎为0,从而造成反向传播无法继续更新部分模型参数;而ReLU激活函数在正区间的梯度恒为1。因此,若模型参数初始化不当,sigmoid函数可能在正区间得到几乎为0的梯度,从而令模型无法得到有效训练。)
  • AlexNet通过丢弃法来控制全连接层的模型复杂度。而LeNet并没有使用丢弃法。
  • AlexNet引入了大量的图像增广,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。

实现简化过的AlexNet

import time
import torch
from torch import nn, optim
import torchvisiondevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')class AlexNet(nn.Module):def __init__(self):super(AlexNet, self).__init__()self.conv = nn.Sequential(nn.Conv2d(1, 96, 11, 4), # in_channels, out_channels, kernel_size, stride, paddingnn.ReLU(),nn.MaxPool2d(3, 2), # kernel_size, stride# 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数nn.Conv2d(96, 256, 5, 1, 2),nn.ReLU(),nn.MaxPool2d(3, 2),# 连续3个卷积层,且使用更小的卷积窗口。除了最后的卷积层外,进一步增大了输出通道数。# 前两个卷积层后不使用池化层来减小输入的高和宽nn.Conv2d(256, 384, 3, 1, 1),nn.ReLU(),nn.Conv2d(384, 384, 3, 1, 1),nn.ReLU(),nn.Conv2d(384, 256, 3, 1, 1),nn.ReLU(),nn.MaxPool2d(3, 2))# 这里全连接层的输出个数比LeNet中的大数倍。使用丢弃层来缓解过拟合self.fc = nn.Sequential(nn.Linear(256*5*5, 4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096, 4096),nn.ReLU(),nn.Dropout(0.5),# 输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000nn.Linear(4096, 10),)def forward(self, img):feature = self.conv(img)output = self.fc(feature.view(img.shape[0], -1))return output
net = AlexNet()
print(net)
AlexNet((conv): Sequential((0): Conv2d(1, 96, kernel_size=(11, 11), stride=(4, 4))(1): ReLU()(2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(3): Conv2d(96, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(4): ReLU()(5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(6): Conv2d(256, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(7): ReLU()(8): Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(9): ReLU()(10): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(11): ReLU()(12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False))(fc): Sequential((0): Linear(in_features=6400, out_features=4096, bias=True)(1): ReLU()(2): Dropout(p=0.5)(3): Linear(in_features=4096, out_features=4096, bias=True)(4): ReLU()(5): Dropout(p=0.5)(6): Linear(in_features=4096, out_features=10, bias=True))
)

读取数据:

def load_data_fashion_mnist(batch_size, resize=None, root='~/Datasets/FashionMNIST'):"""Download the fashion mnist dataset and then load into memory."""trans = []if resize:trans.append(torchvision.transforms.Resize(size=resize))trans.append(torchvision.transforms.ToTensor())transform = torchvision.transforms.Compose(trans)mnist_train = torchvision.datasets.FashionMNIST(root=root, train=True, download=True, transform=transform)mnist_test = torchvision.datasets.FashionMNIST(root=root, train=False, download=True, transform=transform)train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=4)test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=4)return train_iter, test_iterbatch_size = 128
# 如出现“out of memory”的报错信息,可减小batch_size或resize
train_iter, test_iter = load_data_fashion_mnist(batch_size, resize=224)

训练吧:

lr, num_epochs = 0.001, 5
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
def train(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs):net = net.to(device)print("training on ", device)loss = torch.nn.CrossEntropyLoss()for epoch in range(num_epochs):train_l_sum, train_acc_sum, n, batch_count, start = 0.0, 0.0, 0, 0, time.time()for X, y in train_iter:X = X.to(device)y = y.to(device)y_hat = net(X)l = loss(y_hat, y)optimizer.zero_grad()l.backward()optimizer.step()train_l_sum += l.cpu().item()train_acc_sum += (y_hat.argmax(dim=1) == y).sum().cpu().item()n += y.shape[0]batch_count += 1test_acc = evaluate_accuracy(test_iter, net)print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f, time %.1f sec'% (epoch + 1, train_l_sum / batch_count, train_acc_sum / n, test_acc, time.time() - start))train(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs)

《动手学深度学习》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(pytorch-深度学习)包含并行连结的网络(GoogLeNet)

包含并行连结的网络(GoogLeNet) 在2014年的ImageNet图像识别挑战赛中,一个名叫GoogLeNet的网络结构大放异彩。它虽然在名字上向LeNet致敬,但在网络结构上已经很难看到LeNet的影子。GoogLeNet吸收了NiN中网络串联网络的思想&#…

(pytorch-深度学习)实现稠密连接网络(DenseNet)

稠密连接网络(DenseNet) ResNet中的跨层连接设计引申出了数个后续工作。稠密连接网络(DenseNet)与ResNet的主要区别在于在跨层连接上的主要区别: ResNet使用相加DenseNet使用连结 ResNet(左)…

(pytorch-深度学习)循环神经网络

循环神经网络 在nnn元语法中,时间步ttt的词wtw_twt​基于前面所有词的条件概率只考虑了最近时间步的n−1n-1n−1个词。如果要考虑比t−(n−1)t-(n-1)t−(n−1)更早时间步的词对wtw_twt​的可能影响,需要增大nnn。 这样模型参数的数量将随之呈指数级增长…

(pytorch-深度学习)使用pytorch框架nn.RNN实现循环神经网络

使用pytorch框架nn.RNN实现循环神经网络 首先,读取周杰伦专辑歌词数据集。 import time import math import numpy as np import torch from torch import nn, optim import torch.nn.functional as Fimport sys sys.path.append("..") device torch.d…

(pytorch-深度学习)通过时间反向传播

通过时间反向传播 介绍循环神经网络中梯度的计算和存储方法,即通过时间反向传播(back-propagation through time)。 正向传播和反向传播相互依赖。正向传播在循环神经网络中比较直观,而通过时间反向传播其实是反向传播在循环神经…

(pytorch-深度学习)门控循环单元(GRU)

门控循环单元(GRU) 循环神经网络中的梯度计算 当时间步数较大或者时间步较小时,循环神经网络的梯度较容易出现衰减或爆炸。虽然裁剪梯度可以应对梯度爆炸,但无法解决梯度衰减的问题。通常由于这个原因,循环神经网络在…

(pytorch-深度学习)长短期记忆(LSTM)

长短期记忆(LSTM) LSTM 中引入了3个门,即 输入门(input gate)遗忘门(forget gate)输出门(output gate)以及与隐藏状态形状相同的记忆细胞(某些文献把记忆细…

(pytorch-深度学习)深度循环神经网络

深度循环神经网络 循环神经网络只有一个单向的隐藏层,在深度学习应用里,我们通常会用到含有多个隐藏层的循环神经网络,也称作深度循环神经网络。 下图演示了一个有LLL个隐藏层的深度循环神经网络,每个隐藏状态不断传递至当前层的…

(pytorch-深度学习)双向循环神经网络

双向循环神经网络 一般,我们认为循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的,因此它们都将信息通过隐藏状态从前往后传递。 有时候,当前时间步也可能由后面时间步决定。 例如,当我们写下一个句子时&…

pytorch实现梯度下降、随机梯度下降-图像直观展示

深度学习与优化算法原理 优化函数与深度学习 在一个深度学习问题中,通常需要预先定义一个损失函数。有了损失函数以后,使用优化算法试图将其最小化。 在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function…

小批量随机梯度下降

小批量随机梯度下降 在每一次迭代中,梯度下降使用整个训练数据集来计算梯度,因此它有时也被称为批量梯度下降(batch gradient descent)。 随机梯度下降在每次迭代中只随机采样一个样本来计算梯度。可以在每轮迭代中随机均匀采样…

动量法解决梯度下降的一些问题

动量法 目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向,因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变…

深度学习AdaGrad算法

AdaGrad算法 在一般的优化算法中,目标函数自变量的每一个元素在相同时间步都使用同一个学习率来自我迭代。 例如,假设目标函数为fff,自变量为一个二维向量[x1,x2]⊤[x_1, x_2]^\top[x1​,x2​]⊤,该向量中每一个元素在迭代时都使…

深度学习优化算法:RMSProp算法

RMSProp算法 在AdaGrad算法中,因为调整学习率时分母上的变量st\boldsymbol{s}_tst​一直在累加按元素平方的小批量随机梯度,所以目标函数自变量每个元素的学习率在迭代过程中一直在降低(或不变)。因此,当学习率在迭代…

深度学习优化算法-AdaDelta算法

AdaDelta算法 除了RMSProp算法以外,另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进 [1]。 不一样的是,AdaDelta算法没有学习率这个超参数。 它通过使用有关自变量更新量平方的指数加权移动平均的项来替代…

深度学习优化算法-Adam算法

Adam算法 Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。Adam算法可以看做是RMSProp算法与动量法的结合。 算法内容 Adam算法使用了动量变量vt\boldsymbol{v}_tvt​和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量st\boldsymbol{s}_…

深度学习-计算机视觉--图像增广

图像增广 大规模数据集是成功应用深度神经网络的前提。图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。 图像增广的另一种解释是,随机改…

pytorch深度学习-微调(fine tuning)

微调(fine tuning) 首先举一个例子,假设我们想从图像中识别出不同种类的椅子,然后将购买链接推荐给用户。一种可能的方法是先找出100种常见的椅子,为每种椅子拍摄1,000张不同角度的图像,然后在收集到的图像…

c语言封闭曲线分割平面_高手的平面课堂:8种常用的设计排版方式,告别通宵加班...

重复、对比、对齐以及亲密性是传统平面排版的四大原则,即将元素重复运用(包括颜色、形状、材质、字体、空间关系等)以增加画面的条理性和整体性;避免页面上的元素形态与关系构建过于相似;画面上的每一元素都应该与另一个元素存在某种视觉联系…

我的世界java版和基岩版对比_基岩版Beta1.11.0.1发布

本帖来自好游快爆-我的世界精选推荐原帖作者:好游快爆用户3302482我的世界基岩版1.11.0.1测试版发布了,Minecraft基岩版1.11仍未发布,1.11.0.1为测试版本,Beta版本可能不稳定,并不代表最终版本质量,请在加入测试版之前…