当前位置: 首页 > news >正文

推荐家居企业网站建设app开发网上app开发

推荐家居企业网站建设,app开发网上app开发,西安h5网站建设,锦州建设工程信息网站1、引言 卷积神经网络是当前最热门的技术#xff0c;我想深入地学习这门技术#xff0c;从他的发展历史开始#xff0c;了解神经网络算法的兴衰起伏#xff1b;同时了解他在发展过程中的**里程碑式算法**#xff0c;能更好的把握神经网络发展的未来趋势#xff0c;了解神…1、引言 卷积神经网络是当前最热门的技术我想深入地学习这门技术从他的发展历史开始了解神经网络算法的兴衰起伏同时了解他在发展过程中的**里程碑式算法**能更好的把握神经网络发展的未来趋势了解神经网络的特征。 之前的LeNet为以后的神经网络模型打下了一个基础的框架真正让神经网络模型在外界广泛引起关注的还是AlexNet在AlexNet之后也出现了相应对他的改进或多或少会有一些效果。但是ZFNet是在AlexNet上的改进他的论文对神经网络的各个层级的作用做了十分详细的阐述为如何优化模型怎样“有理有据”地调节参数指出了一个方向这是他最大的一个贡献。VggNet也是在2014年的ImageNet的定位赛和分类赛上获得了第一名和第二名他在原来卷积神经网络结构的基础上大大增加了网络的深度最后取得了不错的成绩。GoogleNet同样是在2014年诞生的他在ImageNet大规模视觉识别挑战赛ILSVRC14上提出了一种代号为Inception的深度卷积神经网络结构并在分类和检测上取得了新的最好结果。 GoogleNet论文原文下载地址 GoogleNet论文中文详解 2、GoogleNet提出背景 在LeNet之后随着计算能力的提升研究者不断改进模型的表达能力最明显的是卷积层数的增加每一层的内部通道数目也在增加。其中最具代表性的就是AlexNet模型。 AlexNet由Hinton和他的学生Alex Krizhevsky设计模型名字来源于论文第一作者的姓名Alex。该模型以很大的优势获得了2012年ISLVRC竞赛的冠军网络分类准确率由传统的 70%提升到 80%自那年之后深度学习开始迅速发展。GoogLeNet是2014年Christian Szegedy提出的一种全新的深度学习结构在这之前的AlexNet、VGG等结构都是通过增大网络的深度层数来获得更好的训练效果但层数的增加会带来很多负作用比如overfit、梯度消失、梯度爆炸等。inception的提出则从另一种角度来提升训练结果能更高效的利用计算资源在相同的计算量下能提取到更多的特征从而提升训练结果。值得注意的是GoogLeNet的参数为500w个5M),VGG16的参数是138M在表现接近的情况下GoogLeNet的参数量有明显的优势。 注 ImageNet是一个在2009年创建的图像数据集从2010年开始到2017年举办了七届的ImageNet 挑战赛——ImageNet Large Scale Visual Recognition ChallengeI (LSVRC)在这个挑战赛上诞生了AlexNet、ZFNet、OverFeat、VGG、Inception、ResNet、WideResNet、FractalNet、DenseNet、ResNeXt、DPN、SENet 等经典模型。 一般来说提升网络性能最直接的办法就是增加网络深度和宽度深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题 1参数太多如果训练数据集有限很容易产生过拟合2网络越大、参数越多计算复杂度越大难以应用3网络越深容易出现梯度弥散问题梯度越往后穿越容易消失难以优化模型。 所以有人调侃“深度学习”其实是“深度调参”。 解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数为了减少参数自然就想到将全连接变成稀疏连接。但是在实现上全连接变成稀疏连接后实际计算量并不会有质的提升因为大部分硬件是针对密集矩阵计算优化的稀疏矩阵虽然数据量少但是计算所消耗的时间却很难减少。 那么有没有一种方法既能保持网络结构的稀疏性又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能就如人类的大脑是可以看做是神经元的重复堆积因此GoogLeNet团队提出了Inception网络结构就是构造一种“基础神经元”结构来搭建一个稀疏性、高计算性能的网络结构。 3、GoogleNet的模型详解 GoogLeNet的网络结构图细节如下 GoogLeNet网络结构明细表解析如下 0、输入 原始输入图像为224x224x3且都进行了零均值化的预处理操作图像每个像素减去均值。 1、第一模块 第一模块采用的是一个单纯的卷积层紧跟一个最大池化层。 卷积层卷积核大小77步长为2padding为3输出通道数64输出特征图尺寸为(224-732)/21112.5(向下取整)112输出特征图维度为112x112x64卷积后进行ReLU操作。 池化层窗口大小33步长为2输出特征图尺寸为((112 -3)/2)155.5(向上取整)56输出特征图维度为56x56x64。 2、第二模块 第二模块采用2个卷积层后面跟一个最大池化层。 卷积层1先用64个1x1的卷积核3x3卷积核之前的降维将输入的特征图56x56x64变为56x56x64然后进行ReLU操作。参数量是1164644096。 2再用卷积核大小33步长为1padding为1输出通道数192进行卷积运算输出特征图尺寸为(56-312)/1156输出特征图维度为56x56x192然后进行ReLU操作。参数量是3364192110592。第二模块卷积运算总的参数量是1105924096114688即114688/1024112K。 池化层 窗口大小33步长为2输出通道数192输出为((56 - 3)/2)127.5(向上取整)28输出特征图维度为28x28x192。 第三模块(Inception 3a层) Inception 3a层分为四个分支采用不同尺度图示如下 再看下表格结构来分析和计算吧 1使用64个1x1的卷积核运算后特征图输出为28x28x64然后RuLU操作。参数量111926412288。 296个1x1的卷积核3x3卷积核之前的降维运算后特征图输出为28x28x96进行ReLU计算再进行128个3x3的卷积输出28x28x128。参数量11192963396128129024。 316个1x1的卷积核5x5卷积核之前的降维将特征图变成28x28x16进行ReLU计算再进行32个5x5的卷积输出28x28x32。参数量111921655163215872。 4pool层使用3x3的核输出28x28x192然后进行32个1x1的卷积输出28x28x32.。总参数量11192326144。 将四个结果进行连接对这四部分输出结果的第三维并联即641283232256最终输出28x28x256。总的参数量是12288129024158726144163328即163328/1024159.5K约等于159K。 第三模块(Inception 3b层) Inception 3b层分为四个分支采用不同尺度。 1128个1x1的卷积核然后RuLU输出28x28x128。 2128个1x1的卷积核3x3卷积核之前的降维变成28x28x128进行ReLU再进行192个3x3的卷积输出28x28x192。 332个1x1的卷积核5x5卷积核之前的降维变成28x28x32进行ReLU再进行96个5x5的卷积输出28x28x96。 4pool层使用3x3的核输出28x28x256然后进行64个1x1的卷积输出28x28x64。 将四个结果进行连接对这四部分输出结果的第三维并联即1281929664480最终输出输出为28x28x480。 Inception 3b和Inception 4a之间有一个最大池化下采样层 窗口大小33步长为2输出特征图维度为14x14x480。 第四模块(Inception 4a、4b、4c、4e) 与Inception3a3b类似 Inception 4e和Inception 5a之间有一个最大池化下采样层 窗口大小33步长为2输出特征图维度为7x7x832。 第五模块(Inception 5a、5b) 与Inception3a3b类似 输出层 在输出层GoogLeNet与AlexNet、VGG采用3个连续的全连接层不同GoogLeNet采用的是全局平均池化层得到的是高和宽均为1的卷积层然后添加丢弃概率为40%的Dropout输出层激活函数采用的是softmax。 激活函数 GoogLeNet每层使用的激活函数为ReLU激活函数。 辅助分类器分别来自于Inception 4a和Inception 4d的输出 根据实验数据发现神经网络的中间层也具有很强的识别能力为了利用中间层抽象的特征在某些中间层中添加含有多层的分类器。如下图所示红色边框内部代表添加的辅助分类器。GoogLeNet中共增加了两个辅助的softmax分支作用有两点一是为了避免梯度消失用于向前传导梯度。反向传播时如果有一层求导为0链式求导结果则为0。二是将中间某一层输出用作分类起到模型融合作用。最后的lossloss_2 0.3 * loss_1 0.3 * loss_0。实际测试时这两个辅助softmax分支会被去掉。 1辅助分类器的第一层是一个平均池化下采样层池化核大小为5x5stride3。使得(4a)阶段的输出为4×4×512(4d)的输出为4×4×528。 2第二层是卷积层卷积核大小为1x1stride1卷积核个数是128。 3第三层是全连接层节点个数是1024。 4丢弃70%输出的丢弃层。 5第四层是全连接层节点个数是1000对应分类的类别个数。 4、GoogleNet的创新之处 4.1、提出Inception结构 Inception的设计原则 逐层构造网络如果数据集的概率分布能够被一个神经网络所表达那么构造这个网络的最佳方法是逐层构筑网络即将上一层高度相关的节点连接在一起。几乎所有效果好的深度网络都具有这一点不管AlexNet VGG堆叠多个卷积googleNet堆叠多个inception模块还是ResNet堆叠多个resblock。稀疏的结构人脑的神经元连接就是稀疏的因此大型神经网络的合理连接方式也应该是稀疏的。稀疏的结构对于大型神经网络至关重要可以减轻计算量并减少过拟合。 卷积操作局部连接权值共享本身就是一种稀疏的结构相比于全连接网络结构是很稀疏的。符合Hebbian原理: Cells that fire together, wire together. 一起发射的神经元会连在一起。 相关性高的节点应该被连接而在一起。 inception中 1×1的卷积恰好可以融合三者。我们一层可能会有多个卷积核在同一个位置但在不同通道的卷积核输出结果相关性极高。一个1×1的卷积核可以很自然的把这些相关性很高在同一个空间位置但不同通道的特征结合起来。而其它尺寸的卷积核3×35×5可以保证特征的多样性因此也可以适量使用。于是这就完成了inception module下图的设计初衷4个分支 4.2、1*1卷积核降维 左上图是GoogleNet作者设计的初始inception结构(native inception)其想法是用多个不同类型的卷积核1 × 1 1\times11×13 × 3 3\times33×35 × 5 5\times55×53 × 3 P o o l 3\times3Pool3×3Pool堆叠在一起卷积、池化后的尺寸相同将通道相加代替一个3x3的小卷积核好处是可以使提取出来的特征具有多样化并且特征之间的co-relationship不会很大最后用把feature map都concatenate起来使网络做得很宽然后堆叠Inception Module将网络变深。但仅仅简单这么做会使一层的计算量爆炸式增长。 native inception中所有的卷积核都在上一层的所有输出上来做而那个5x5的卷积核所需的计算量就太大了造成了特征图的厚度很大为了避免这种情况在3x3前、5x5前、max pooling后分别加上了1x1的卷积核以起到了降低特征图厚度的作用这也就形成了Inception v1的网络结构(右上图)。 假设input feature map的size为28 × 28 × 256 28\times28\times25628×28×256output feature map的size为28 × 28 × 480 28\times28\times48028×28×480则native Inception Module的计算量有854M。计算过程如下 从上图可以看出计算量主要来自高维卷积核的卷积操作因而在每一个卷积前先使用1 × 1 1\times11×1卷积核将输入图片的feature map维度先降低进行信息压缩在使用3x3卷积核进行特征提取运算相同情况下Inception v1的计算量仅为358M。 Inception结构总共有4个分支输入的feature map并行的通过这四个分支得到四个输出然后在在将这四个输出在深度维度channel维度进行拼接(concate)得到我们的最终输出注意为了让四个分支的输出能够在深度方向进行拼接必须保证四个分支输出的特征矩阵高度和宽度都相同因此inception结构的参数为 branch1: C o n v 1 × 1 Conv 1\times1Conv1×1, stride1branch2: C o n v 3 × 3 Conv 3\times3Conv3×3, stride1, padding1branch3: C o n v 5 × 5 Conv 5\times5Conv5×5, stride1, padding2branch4: M a x P o o l 3 × 3 MaxPool 3\times3MaxPool3×3, stride1,padding1 GoogLeNet中使用了9个Inception v1 module分别被命名为inception(3a)、inception(3b)、inception(4a)、inception(4b)、inception(4c)、inception(4d)、inception(4e)、inception(5a)、inception(5b)。 4.3、两个辅助分类器帮助训练 作用有两点一是为了避免梯度消失用于向前传导梯度。反向传播时如果有一层求导为0链式求导结果则为0。二是将中间某一层输出用作分类起到模型融合作用。   辅助函数Axuiliary Function从信息流动的角度看梯度消失因为是梯度信息在BP过程中能量衰减无法到达浅层区域因此在中间开个口子加个辅助损失函数直接为浅层。   GoogLeNet网络结构中有深层和浅层2个分类器为了避免梯度消失两个辅助分类器结构是一模一样的其组成如下图所示这两个辅助分类器的输入分别来自Inception(4a)和Inception(4d)。 辅助分类器的第一层是一个平均池化下采样层池化核大小为5x5stride3第二层是卷积层卷积核大小为1x1stride1卷积核个数是128第三层是全连接层节点个数是1024第四层是全连接层节点个数是1000对应分类的类别个数。   辅助分类器只是在训练时使用在正常预测时会被去掉。辅助分类器促进了更稳定的学习和更好的收敛往往在接近训练结束时辅助分支网络开始超越没有任何分支的网络的准确性达到了更高的水平。 4.4、使用平均化吃层减少模型参数 网络最后采用了average pooling平均池化来代替全连接层该想法来自NINNetwork in Network事实证明这样可以将准确率提高0.6%。 5、GoogleNet的代码实现 #class_indices.json {0: daisy,1: dandelion,2: roses,3: sunflowers,4: tulips }#model.py import torch.nn as nn import torch import torch.nn.functional as Fclass GoogLeNet(nn.Module):def __init__(self, num_classes1000, aux_logitsTrue, init_weightsFalse):super(GoogLeNet, self).__init__()self.aux_logits aux_logitsself.conv1 BasicConv2d(3, 64, kernel_size7, stride2, padding3)self.maxpool1 nn.MaxPool2d(3, stride2, ceil_modeTrue)self.conv2 BasicConv2d(64, 64, kernel_size1)self.conv3 BasicConv2d(64, 192, kernel_size3, padding1)self.maxpool2 nn.MaxPool2d(3, stride2, ceil_modeTrue)self.inception3a Inception(192, 64, 96, 128, 16, 32, 32)self.inception3b Inception(256, 128, 128, 192, 32, 96, 64)self.maxpool3 nn.MaxPool2d(3, stride2, ceil_modeTrue)self.inception4a Inception(480, 192, 96, 208, 16, 48, 64)self.inception4b Inception(512, 160, 112, 224, 24, 64, 64)self.inception4c Inception(512, 128, 128, 256, 24, 64, 64)self.inception4d Inception(512, 112, 144, 288, 32, 64, 64)self.inception4e Inception(528, 256, 160, 320, 32, 128, 128)self.maxpool4 nn.MaxPool2d(3, stride2, ceil_modeTrue)self.inception5a Inception(832, 256, 160, 320, 32, 128, 128)self.inception5b Inception(832, 384, 192, 384, 48, 128, 128)if self.aux_logits:self.aux1 InceptionAux(512, num_classes)self.aux2 InceptionAux(528, num_classes)self.avgpool nn.AdaptiveAvgPool2d((1, 1))self.dropout nn.Dropout(0.4)self.fc nn.Linear(1024, num_classes)if init_weights:self._initialize_weights()def forward(self, x):# N x 3 x 224 x 224x self.conv1(x)# N x 64 x 112 x 112x self.maxpool1(x)# N x 64 x 56 x 56x self.conv2(x)# N x 64 x 56 x 56x self.conv3(x)# N x 192 x 56 x 56x self.maxpool2(x)# N x 192 x 28 x 28x self.inception3a(x)# N x 256 x 28 x 28x self.inception3b(x)# N x 480 x 28 x 28x self.maxpool3(x)# N x 480 x 14 x 14x self.inception4a(x)# N x 512 x 14 x 14if self.training and self.aux_logits: # eval model lose this layeraux1 self.aux1(x)x self.inception4b(x)# N x 512 x 14 x 14x self.inception4c(x)# N x 512 x 14 x 14x self.inception4d(x)# N x 528 x 14 x 14if self.training and self.aux_logits: # eval model lose this layeraux2 self.aux2(x)x self.inception4e(x)# N x 832 x 14 x 14x self.maxpool4(x)# N x 832 x 7 x 7x self.inception5a(x)# N x 832 x 7 x 7x self.inception5b(x)# N x 1024 x 7 x 7x self.avgpool(x)# N x 1024 x 1 x 1x torch.flatten(x, 1)# N x 1024x self.dropout(x)x self.fc(x)# N x 1000 (num_classes)if self.training and self.aux_logits: # eval model lose this layerreturn x, aux2, aux1return xdef _initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, modefan_out, nonlinearityrelu)if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):nn.init.normal_(m.weight, 0, 0.01)nn.init.constant_(m.bias, 0)class Inception(nn.Module):def __init__(self, in_channels, ch1x1, ch3x3red, ch3x3, ch5x5red, ch5x5, pool_proj):super(Inception, self).__init__()self.branch1 BasicConv2d(in_channels, ch1x1, kernel_size1)self.branch2 nn.Sequential(BasicConv2d(in_channels, ch3x3red, kernel_size1),BasicConv2d(ch3x3red, ch3x3, kernel_size3, padding1) # 保证输出大小等于输入大小)self.branch3 nn.Sequential(BasicConv2d(in_channels, ch5x5red, kernel_size1),# 在官方的实现中其实是3x3的kernel并不是5x5这里我也懒得改了具体可以参考下面的issue# Please see https://github.com/pytorch/vision/issues/906 for details.BasicConv2d(ch5x5red, ch5x5, kernel_size5, padding2) # 保证输出大小等于输入大小)self.branch4 nn.Sequential(nn.MaxPool2d(kernel_size3, stride1, padding1),BasicConv2d(in_channels, pool_proj, kernel_size1))def forward(self, x):branch1 self.branch1(x)branch2 self.branch2(x)branch3 self.branch3(x)branch4 self.branch4(x)outputs [branch1, branch2, branch3, branch4]return torch.cat(outputs, 1)class InceptionAux(nn.Module):def __init__(self, in_channels, num_classes):super(InceptionAux, self).__init__()self.averagePool nn.AvgPool2d(kernel_size5, stride3)self.conv BasicConv2d(in_channels, 128, kernel_size1) # output[batch, 128, 4, 4]self.fc1 nn.Linear(2048, 1024)self.fc2 nn.Linear(1024, num_classes)def forward(self, x):# aux1: N x 512 x 14 x 14, aux2: N x 528 x 14 x 14x self.averagePool(x)# aux1: N x 512 x 4 x 4, aux2: N x 528 x 4 x 4x self.conv(x)# N x 128 x 4 x 4x torch.flatten(x, 1)x F.dropout(x, 0.5, trainingself.training)# N x 2048x F.relu(self.fc1(x), inplaceTrue)x F.dropout(x, 0.5, trainingself.training)# N x 1024x self.fc2(x)# N x num_classesreturn xclass BasicConv2d(nn.Module):def __init__(self, in_channels, out_channels, **kwargs):super(BasicConv2d, self).__init__()self.conv nn.Conv2d(in_channels, out_channels, **kwargs)self.relu nn.ReLU(inplaceTrue)def forward(self, x):x self.conv(x)x self.relu(x)return x#predict.py import os import jsonimport torch from PIL import Image from torchvision import transforms import matplotlib.pyplot as pltfrom model import GoogLeNetdef main():device torch.device(cuda:0 if torch.cuda.is_available() else cpu)data_transform transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])# load imageimg_path ../tulip.jpgassert os.path.exists(img_path), file: {} dose not exist..format(img_path)img Image.open(img_path)plt.imshow(img)# [N, C, H, W]img data_transform(img)# expand batch dimensionimg torch.unsqueeze(img, dim0)# read class_indictjson_path ./class_indices.jsonassert os.path.exists(json_path), file: {} dose not exist..format(json_path)with open(json_path, r) as f:class_indict json.load(f)# create modelmodel GoogLeNet(num_classes5, aux_logitsFalse).to(device)# load model weightsweights_path ./googleNet.pthassert os.path.exists(weights_path), file: {} dose not exist..format(weights_path)missing_keys, unexpected_keys model.load_state_dict(torch.load(weights_path, map_locationdevice),strictFalse)model.eval()with torch.no_grad():# predict classoutput torch.squeeze(model(img.to(device))).cpu()predict torch.softmax(output, dim0)predict_cla torch.argmax(predict).numpy()print_res class: {} prob: {:.3}.format(class_indict[str(predict_cla)],predict[predict_cla].numpy())plt.title(print_res)for i in range(len(predict)):print(class: {:10} prob: {:.3}.format(class_indict[str(i)],predict[i].numpy()))plt.show()if __name__ __main__:main()#train.py import os import sys import jsonimport torch import torch.nn as nn from torchvision import transforms, datasets import torch.optim as optim from tqdm import tqdmfrom model import GoogLeNetdef main():device torch.device(cuda:0 if torch.cuda.is_available() else cpu)print(using {} device..format(device))data_transform {train: transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]),val: transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])}data_root os.path.abspath(os.path.join(os.getcwd(), ../..)) # get data root pathimage_path os.path.join(data_root, data_set, flower_data) # flower data set pathassert os.path.exists(image_path), {} path does not exist..format(image_path)train_dataset datasets.ImageFolder(rootos.path.join(image_path, train),transformdata_transform[train])train_num len(train_dataset)# {daisy:0, dandelion:1, roses:2, sunflower:3, tulips:4}flower_list train_dataset.class_to_idxcla_dict dict((val, key) for key, val in flower_list.items())# write dict into json filejson_str json.dumps(cla_dict, indent4)with open(class_indices.json, w) as json_file:json_file.write(json_str)batch_size 32nw min([os.cpu_count(), batch_size if batch_size 1 else 0, 8]) # number of workersprint(Using {} dataloader workers every process.format(nw))train_loader torch.utils.data.DataLoader(train_dataset,batch_sizebatch_size, shuffleTrue,num_workersnw)validate_dataset datasets.ImageFolder(rootos.path.join(image_path, val),transformdata_transform[val])val_num len(validate_dataset)validate_loader torch.utils.data.DataLoader(validate_dataset,batch_sizebatch_size, shuffleFalse,num_workersnw)print(using {} images for training, {} images for validation..format(train_num,val_num))# test_data_iter iter(validate_loader)# test_image, test_label test_data_iter.next()net GoogLeNet(num_classes5, aux_logitsTrue, init_weightsTrue)# 如果要使用官方的预训练权重注意是将权重载入官方的模型不是我们自己实现的模型# 官方的模型中使用了bn层以及改了一些参数不能混用# import torchvision# net torchvision.models.googlenet(num_classes5)# model_dict net.state_dict()# # 预训练权重下载地址: https://download.pytorch.org/models/googlenet-1378be20.pth# pretrain_model torch.load(googlenet.pth)# del_list [aux1.fc2.weight, aux1.fc2.bias,# aux2.fc2.weight, aux2.fc2.bias,# fc.weight, fc.bias]# pretrain_dict {k: v for k, v in pretrain_model.items() if k not in del_list}# model_dict.update(pretrain_dict)# net.load_state_dict(model_dict)net.to(device)loss_function nn.CrossEntropyLoss()optimizer optim.Adam(net.parameters(), lr0.0003)epochs 30best_acc 0.0save_path ./googleNet.pthtrain_steps len(train_loader)for epoch in range(epochs):# trainnet.train()running_loss 0.0train_bar tqdm(train_loader, filesys.stdout)for step, data in enumerate(train_bar):images, labels dataoptimizer.zero_grad()logits, aux_logits2, aux_logits1 net(images.to(device))loss0 loss_function(logits, labels.to(device))loss1 loss_function(aux_logits1, labels.to(device))loss2 loss_function(aux_logits2, labels.to(device))loss loss0 loss1 * 0.3 loss2 * 0.3loss.backward()optimizer.step()# print statisticsrunning_loss loss.item()train_bar.desc train epoch[{}/{}] loss:{:.3f}.format(epoch 1,epochs,loss)# validatenet.eval()acc 0.0 # accumulate accurate number / epochwith torch.no_grad():val_bar tqdm(validate_loader, filesys.stdout)for val_data in val_bar:val_images, val_labels val_dataoutputs net(val_images.to(device)) # eval model only have last output layerpredict_y torch.max(outputs, dim1)[1]acc torch.eq(predict_y, val_labels.to(device)).sum().item()val_accurate acc / val_numprint([epoch %d] train_loss: %.3f val_accuracy: %.3f %(epoch 1, running_loss / train_steps, val_accurate))if val_accurate best_acc:best_acc val_accuratetorch.save(net.state_dict(), save_path)print(Finished Training)if __name__ __main__:main()6、总结 书山有路勤为径学海无涯苦作舟。 7、参考文章 7.1四卷积神经网络模型之——GoogLeNet 7.2 GoogLeNet网络详解与模型搭建 7.3 Google Inception Net论文细读 7.4 深度学习入门笔记之GoogLeNet网络
http://www.zqtcl.cn/news/754364/

相关文章:

  • 网站制作想法免费做效果图网站
  • 晓风彩票网站建设软件微信上发的链接网站怎么做的
  • 关键词有哪几种台州优秀关键词优化
  • 盐田区住房和建设局网站软件开发文档怎么编写
  • 网站响应式建设seo排名优化怎样
  • 山东 网站备案德清县建设局网站
  • 中英语双语网站咋做提供网站建设设计外包
  • 云网站功能江门网站seo关键词排名优化
  • 潍坊网站建设外贸制作html网站
  • 网站友情链接怎么添加定制酒营销方案
  • 目前最流行网站开发软件泰州市建设工程招标网
  • 福州网站优化me域名网站
  • 网站 案例互联网外包公司值得去吗
  • 做医疗护具网站浙江立鹏建设有限公司网站
  • 织梦制作手机网站c 网站开发需要学什么软件
  • 罗湖网站制作阿里巴巴开店网站怎么做
  • 深圳住房和建设局网站 招标怎样建设自己的视频网站
  • 网站建设的目的模板茶网站建设需要多少钱
  • 珠海市城乡住房建设局网站网站外链
  • 福田做网站需要多少钱做淘宝客网站性质
  • html网站怎么进入后台网站主题怎么写
  • wordpress怎么ftp建站高端网站建设域名注册
  • 我用织梦5.7做个网站应该把淘宝客店铺链接放到哪聊天软件开发需要多少钱
  • 站长工具爱站竞价单页网站制作
  • 网站分类目录大全购物网站大全棉鞋
  • 网站镜像做排名建立外贸英文网站应该怎么做
  • 上海做网站就用乐云seo手机网站cms 下载
  • 做网站需要固定ip么灵犀科技网站建设
  • 深圳高端做网站建设网站备案与不备案区别
  • 家居企业网站建设公司苏州高新区建设局网站管网