精华内容
参与话题
问答
  • 预训练模型

    千次阅读 2019-06-20 17:10:57
    1 预训练模型由来 预训练模型是深度学习架构,已经过训练以执行大量数据上的特定任务(例如,识别图片中的分类问题)。这种训练不容易执行,并且通常需要大量资源,超出许多可用于深度学习模型的人可用的资源,我就...

    1 预训练模型由来

    预训练模型是深度学习架构,已经过训练以执行大量数据上的特定任务(例如,识别图片中的分类问题)。这种训练不容易执行,并且通常需要大量资源,超出许多可用于深度学习模型的人可用的资源,我就没有大批次GPU。在谈论预训练模型时,通常指的是在Imagenet上训练的CNN(用于视觉相关任务的架构)。ImageNet数据集包含超过1400万个图像,其中120万个图像分为1000个类别(大约100万个图像含边界框和注释)。

    2 预训练模型定义

    那么什么是预训练模型?这是在训练结束时结果比较好的一组权重值,研究人员分享出来供其他人使用。我们可以在github上找到许多具有权重的库,但是获取预训练模型的最简单方法可能是直接来自您选择的深度学习库。

    现在,上面是预训练模型的规范定义。您还可以找到预训练的模型来执行其他任务,例如物体检测姿势估计

    此外,最近研究人员已开始突破预训练模型的界限。在自然语言处理(使用文本的模型)的上下文中,我们已经有一段时间使用嵌入层。Word嵌入是一组数字的表示,其中的想法是类似的单词将以某种有用的方式表达。例如,我们可能希望'鹰派','鹰','蓝杰伊'的表现形式有一些相似之处,并且在其他方​​面也有所不同。用矢量表示单词的开创性论文是word2vec,这篇嵌入层的论文是我最喜欢的论文之一,最早源于80年代,Geoffrey Hinton 的论文

    尽管通过对大型数据集进行训练获得的单词的表示非常有用(并且以与预训练模型类似的方式共享),但是将单词嵌入作为预训练模型会有点拉伸。然而,通过杰里米霍华德塞巴斯蒂安鲁德的工作,真正的预训练模型已经到达NLP世界。它们往往非常强大,围绕着首先训练语言模型(在某种意义上理解某种语言中的文本而不仅仅是单词之间的相似性)的概念,并将其作为更高级任务的基础。有一种非常好的方法可以在大量数据上训练语言模型,而不需要对数据集进行人工注释。这意味着我们可以在尽可能多的数据上训练语言模型,比如整个维基百科!然后我们可以为特定任务(例如,情感分析)构建分类器并对模型进行微调,其中获取数据的成本更高。要了解有关这项非常有趣的工作的更多信息,请参阅论文虽然我建议先看看随附的网站,了解全局。

    3 预训练模型最好结果

    2018年NLP领域取得最重大突破!谷歌AI团队新发布的BERT模型,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩。毋庸置疑,BERT模型开启了NLP的新时代!而谷歌提出的BERT就是在OpenAI的GPT的基础上对预训练的目标进行了修改,并用更大的模型以及更多的数据去进行预训练,从而得到了目前为止最好的效果。

    旁注:如何从头开始训练架构以获得预训练的重量?这根本不容易回答,而且相关信息相当稀少。从纸张到纸张需要大量的跳跃才能将训练的所有方面(增强,训练 - 测试分裂,重量衰减,时间表等)拼凑在一起。我试着破解其中一些我过去做过的实验,你可以在这里这里看看这些尝试。更有趣的是DAWNBench比赛网站。在这里,各个团队已经尝试将他们的神经网络训练到某种程度的准确性,同时提高资源使用效率和优化速度。这通常不是架构最初如何训练,而是一个非常有用的信息源(因为代码也可用)。

    4 预训练模型

    4.1 官方版本综合版本

    4.1.1 pytorch

    Network Top-1 error Top-5 error
    AlexNet 43.45 20.91
    VGG-11 30.98 11.37
    VGG-13 30.07 10.75
    VGG-16 28.41 9.62
    VGG-19 27.62 9.12
    VGG-11 with batch normalization 29.62 10.19
    VGG-13 with batch normalization 28.45 9.63
    VGG-16 with batch normalization 26.63 8.50
    VGG-19 with batch normalization 25.76 8.15
    ResNet-18 30.24 10.92
    ResNet-34 26.70 8.58
    ResNet-50 23.85 7.13
    ResNet-101 22.63 6.44
    ResNet-152 21.69 5.94
    SqueezeNet 1.0 41.90 19.58
    SqueezeNet 1.1 41.81 19.38
    Densenet-121 25.35 7.83
    Densenet-169 24.00 7.00
    Densenet-201 22.80 6.43
    Densenet-161 22.35 6.20
    Inception v3 22.55 6.44

    4.1.2 fastai

    4.1.3 tensorflow

    4.1.4 keras

    Model Size Top-1 Accuracy Top-5 Accuracy Parameters Depth
    Xception 88 MB 0.790 0.945 22,910,480 126
    VGG16 528 MB 0.713 0.901 138,357,544 23
    VGG19 549 MB 0.713 0.900 143,667,240 26
    ResNet50 99 MB 0.749 0.921 25,636,712 168
    InceptionV3 92 MB 0.779 0.937 23,851,784 159
    InceptionResNetV2 215 MB 0.803 0.953 55,873,736 572
    MobileNet 16 MB 0.704 0.895 4,253,864 88
    MobileNetV2 14 MB 0.713 0.901 3,538,984 88
    DenseNet121 33 MB 0.750 0.923 8,062,504 121
    DenseNet169 57 MB 0.762 0.932 14,307,880 169
    DenseNet201 80 MB 0.773 0.936 20,242,984 201
    NASNetMobile 23 MB 0.744 0.919 5,326,716 -
    NASNetLarge 343 MB 0.825 0.960 88,949,818 -

    4.1.5 ONNX

    4.2 图片分类

    Model Class Reference Description
    MobileNet Sandler et al. 顾名思义,MobileNet是为移动设备设计的架构。而搭建它的正是移动设备行业龙头谷歌。而我们之前附上链接的模型,带有对流行的 ImageNet(包含两万个类的数百万张图片的巨型数据库) 数据集的预训练权重。正如上文所提,MobileNet不止可以用于目标检测,同样它也适用于类似面部识别、地标识别、细致纹理分类等多种计算机视觉任务。.
    Top-5 error from paper - ~10%
    ResNet He et al., He et al. Very deep CNN model (up to 152 layers), won the ImageNet Challenge in 2015.
    Top-5 error from paper - ~6%
    SqueezeNet Iandola et al. A light-weight CNN providing Alexnet level accuracy with 50X fewer parameters.
    Top-5 error from paper - ~20%
    VGG Simonyan et al. Deep CNN model (upto 19 layers) which won the ImageNet Challenge in 2014.
    Top-5 error from paper - ~8%
    Bvlc_AlexNet Krizhevsky et al. Deep CNN model for Image Classification
    Bvlc_GoogleNet Szegedy et al. Deep CNN model for Image Classification
    Bvlc_reference_CaffeNet Krizhevsky et al. Deep CNN model for Image Classification
    Bvlc_reference_RCNN_ILSVRC13 Girshick et al. Deep CNN model for Image Classification
    DenseNet121 Huang et al. Deep CNN model for Image Classification
    Inception_v1 Szegedy et al. Deep CNN model for Image Classification
    Inception_v2 Szegedy et al. Deep CNN model for Image Classification
    ShuffleNet Zhang et al. Deep CNN model for Image Classification
    ZFNet512 Zeiler et al. Deep CNN model for Image Classification

    4.3 语义分割

    Model Class Reference Description
    DUC Wang et al. Deep CNN based model with >80% mIOU (mean Intersection Over Union) trained on urban street images
    FCN Long et al. contribute

    4.3.1 对象检测和分段

    Model Class Reference Description
    Tiny_YOLOv2 Redmon et al. Deep CNN model for Object Detection
    SSD Liu et al. contribute
    Faster-RCNN Ren et al.  
    Mask-RCNN He et al. Mask R-CNN 是为目标实例分割而开发的灵活框架。这个预训练模型是使用 Python 和 Keras 对 Mask R-CNN 技术的实现。它为给定图像中的目标的每个实例生成边界框和分割掩模,这个 GitHub 存储库提供了大量的资源来帮助新手入门。它包括 Mask R-CNN 的源代码,用于MS COCO 数据集的训练代码和预训练权重,Jupyter notebook 用于可视化检测流程的每个步骤。
    YOLO v2 Redmon et al. 说到 YOLO,这是一个广泛运用于深度学习的目标检测框架,这个库包含Keras 中的YOLOv2 实现。尽管开发者已经在各种目标图像上测试了这一框架,比如袋鼠检测、自动驾驶汽车,红细胞检测等等,他们依然发布了浣熊检测的预训练模型。这里你可以下载浣熊的数据集,并且开始训练这个预训练模型。这一数据集包含200个图片(160个训练集,40个测试集)。同样,你可以下载整个模型的预训练权重。而根据模型开发者所说,这些权重可以用于一类物体的目标检测。
    YOLO v3 Redmon et al. contribute
    VGG-Face 人脸识别模型 从头开始创建一个人脸识别模型其实是一个令人害怕的任务。为了最终构建出令人满意的模型,你需要去寻找搜集并且标注大量的图像。因此,在这个领域使用预训练模型是非常有道理的。VGG-Face是一个有超过2百万张人脸图像,包含2622个独立身份的数据集。预训练模型已经通过以下方法构建完成 vgg-face-keras: 将vgg-face模型直接转化成keras模型,vgg-face-keras-fc:首先将vgg-face Caffe模型转化成mxnet模型,再将其转化成keras模型
    Deeplabv3+ 语义图像分割 义图像分割是指将语义标签分配给图像的每个像素的任务。这些语义标签可以是‘天空’,‘汽车’,‘道路’,‘长颈鹿’等等。这项技术所要做的就是找到对象的边界因而需要对精度要求做出约束(这也就是与图像层面的分类任务的区别所在,分类任务对精度的要求更加宽松)。Deeplabv3 是Google最新的语义图像分割模型。 它最初是使用TensorFlow实现并且现在也已经通过keras实现了。这个GitHub仓库包含如何获取标签,如何使用自定义类别数的预训练模型的代码,当然也包含如何去追踪自己模型的代码。

    4.3.2 汽车识别

    Model Class Reference Description
    ArcFace 汽车识别 众所周知,对一辆车分门别类有很多方法:譬如车体设计风格、车门数量、是否敞篷、车座数量等等。对于这一问题,我们需要将车辆图片分门别类,比如考虑品牌、设计模式、年限等等的分类。2012年,Tesla Model S 使用了斯坦福大学的车辆数据集(其中包含196类汽车的16185张图片)正是为了开发这一模型。Tesla Model S使用预训练过的VGG16、VGG19、InceptionV3模型进行训练。由于仅仅使用 3*3的卷积层增加深度,VGG这一简单特点为人所知,这里16和19分别代表两种VGG网络的层数。由于数据量较少,最简单的模型——VGG16是最精确的。这一神经网络的训练,使得在交叉验证集上达到了66.11%的准确度。而由于偏差方差的问题,反而使得比较复杂的模型譬如InceptionV3得到的准确率较低。

    4.3.3 面部检测和识别

    Model Class Reference Description
    ArcFace Deng et al. ArcFace is a CNN based model for face recognition which learns discriminative features of faces and produces embeddings for input face images.
    CNN Cascade Li et al. contribute

    4.3.4 表情识别

    Model Class Reference Description
    Emotion FerPlus Barsoum et al. Deep CNN model for Emotion recognition

     


     

    4.3.5 性别区别

    Model Class Reference Description
    Age and Gender Classification using Convolutional Neural Networks Levi et al. contribute

     


     

    4.3.6 手写数字识别

    Model Class Reference Description
    MNIST- Hand Written Digit Recognition Convolutional Neural Network with MNIST Deep CNN model for hand written digit identification

     


     

    4.3.7 超分辨率

    Model Class Reference Description
    Image Super resolution using deep convolutional networks Dong et al. contribute

     


     

    4.3.8 风格迁移

    Model Class Reference Description
    Unpaired Image to Image Translation using Cycle consistent Adversarial Network Zhu et al. contribute

     


     

    4.3.9 生熟番茄分类

    Model Class Reference Description
    生熟番茄分类   假定我们有几百个数据集的番茄图片,现在考虑如何如何区分它们,比方说按是否瑕疵,或者按成熟与否区分。这里我们考虑使用深度学习模型,而解决这个问题的关键技术就是图像处理。应对于这一分类问题,我们可以利用在Keras上预训练好的 VGG16模型来区分给定图片的番茄是生是熟。通过在ImageNet数据集上抓取的390张或生或熟的番茄图像进行训练,并在18张不同的验证集上进行测试。这些验证集图像上的总体结果如下所示:

    4.4 机器翻译

    Model Class Reference Description
    Neural Machine Translation by jointly learning to align and translate Bahdanau et al. contribute
    Google's Neural Machine Translation System Wu et al. contribute

     


     

    4.4.1 语音处理

    Model Class Reference Description
    Speech recognition with deep recurrent neural networks Graves et al. contribute
    Deep voice: Real time neural text to speech Arik et al. contribute

    4.4.2 语言模型

    Model Class Reference Description
    Deep Neural Network Language Models Arisoy et al. contribute

    4.4.3 视觉问答

    Model Class Reference Description
    VQA: Visual Question Answering Agrawal et al. contribute
    Yin and Yang: Balancing and Answering Binary Visual Questions Zhang et al. contribute
    Making the V in VQA Matter Goyal et al. contribute
    Visual Dialog Das et al. contribute

    4.4.4 其他有意思的模型

    4.5 Model Visualization

    You can see visualizations of each model's network architecture by using Netron.

    4.6 CV

    名称 环境 精度 错误率
    物体检测 c cuda    
    姿势估计 keras    
    斯坦福CIFAR10 pytorch tensorflow 95.29%  
    斯坦福ImageNet pytorch tensorflow MXNet caffe 93.94%  

    4.7 NLP

    4.7.1 多用途模型

    多用途模型是自然语言处理领域的热门话题。这些模型为机器翻译、问答系统、聊天机器人、情绪分析等我们感兴趣的自然语言处理应用提供了动力。这些多用途自然语言处理模型的核心组件是语言建模的概念。

    4.7.1.1 ULMFiT

    https://github.com/fastai/fastai/tree/master/courses/dl2/imdb_scripts
    ULMFiT 由 fast.ai 的 Jeremy Howard 和 DeepMind 的 Sebastian Ruder 提出并设计。你可以说 ULMFiT 是去年启动迁移学习派对的发行版。
    正如我们在本文中所述,ULMFiT 使用新的自然语言生成技术实现了最先进的结果。该方法包括在 Wikitext 103 数据集上训练的预处理语言模型进行微调,使其不会忘记以前所学的内容,从而将其微调为一个新的数据集。

    4.7.1.2 Transformer

    GitHub 项目地址:https://github.com/tensorflow/models/tree/master/official/transformer

    Transformer 架构是自然语言处理领域最近几乎所有主要发展的核心,2017 年由 Google 推出。当时,RNN 递归神经网络被用于语言任务,如机器翻译和问答系统。

    这种 Transformer 架构的性能优于 RNN 和 CNN(卷积神经网络)。而且训练模型所需的计算资源也大为减少。对自然语言处理的每个人来讲,这种结果是双赢的局面。
    根据 Google 的说法,Transformer“应用了一种自注意力(self-attention)机制,可以直接模拟句子中所有单词之间的关系,无论这些单词的位置如何”。它使用固定大小的上下文(也就是前面的单词)来实现这一点。是不是觉得太复杂了?让我们举个例子来简化这个。
    “She found the shells on the bank of the river.”模型需要理解这里的“bank”是指河岸,而不是金融机构。Transformer 只需一步就能理解这一点。我建议你阅读下面给出链接的完整论文,以了解 Transformer 的工作原理。它会让你大吃一惊。
    Google 去年发布了一款 Universal Transformer 的改进版。还有一个更新、更直观的版本,叫做 Transformer-XL,我们将稍后予以介绍。

    有关 Transformer 的更多信息,请参阅以下资源:

    4.7.1.3 BERT

    GitHub 项目地址:https://github.com/google-research/bert

    自 Google 公布他们的结果以来,BERT 就一直在掀起波澜,然后 Google 开源了它背后的代码。我们可以讨论这是否标志着“自然语言处理领域的新时代”,但毫无疑问的是,BERT 是一个非常有用的框架,可以很好地推广到各种自然语言处理任务。
    BERT,是 Bidirectional Encoder Representations(双向编码器表示)的缩写,它从单词的两边(左边和右边)来考虑上下文。以前所有的努力方向,都是一次只考虑单词的一边,要么是左边,要么是右边。这种双向性有助于模型更好地理解使用单词的上下文。此外,BERT 的设计目标是能够进行多任务学习,也就是说,它可以同时执行不同的自然语言处理任务。

    BERT 是第一个无监督、深度双向的自然语言处理模型预训练系统。它只使用纯文本语料库进行训练。

    在发布的时候,BERT 在 11 个自然语言处理任务上取得了最先进的结果。这真是相当了不起的成就!你可以在短短几个小时内(在单个 GPU 上)使用 BERT 训练自己的自然语言处理模型(例如问答系统)。

    4.7.1.4 Google Transformer-XL

    GitHub 项目地址:https://github.com/kimiyoung/transformer-xl

    从长远来看,Google 的这一发行版对自然语言处理领域来说可能是一个非常重要的版本。如果你是一名菜鸟,这个概念可能会变得有点棘手,所以我建议你多读几遍来掌握它。我还会在这一节中提供一些资源,帮助你开始入门 Transformer-XL。

    想象一下,你正在读一本书,读到一半的时候,书中突然出现了某个单词或句子,而这些在这本书的开头都提到过。这时候,你我都能回忆起那些单词或句子指的是什么意思。但机器很难建立模拟长期依赖(long-term dependency)的模型,这是可以理解的。

    如上所述,实现这一点的一种方法是使用 Transformer。但它们是在固定长度的上下文实现的。换句话说,如果使用这种方法,就没有多少灵活性而言。

    而 Transformer-XL 很好地弥补了这一缺陷。它由 Google AI 团队开发,是一种新型的自然语言处理架构,可以帮助机器理解超出固定长度限制的上下文。Transformer-XL 比普通的 Transformer 要快上 1800 倍。
    如你现在所预测的,Transformer-XL 在各种语言建模基准 / 数据集上实现了最新的、最先进的结果。下面是他们网页上的一张表,展示了这一点:

    image

    上面的链接和下面提到的 Transformer-XL GitHub 存储库包含 PyTorch 和 TensorFlow 中的代码。

    有关 Transformer-XL 的更多信息,请参阅以下资源:

    4.7.1.5 OpenAI GPT-2

    GitHub 项目地址:https://github.com/openai/gpt-2

    目前这是一个颇有争议的条目。一些人可能会认为 GPT-2 的发布就是 OpenAI 的营销噱头。我当然理解他们的想法。然而,我还是认为,至少尝试一下 OpenAI 发布的代码还是很重要的。
    首先,我得为那些不知道我在说什么的人们提供一些背景信息。OpenAI 在 2 月份的时候发表了一篇博文,声称他们已经设计了一个自然语言处理模型,表现非常出色,以至于他们担心被恶意使用,而没有选择发布完整版本。这当然引起了社区的关注。

    GPT-2 经过训练后,可以预测 40GB 互联网文本数据的下一个出现的单词。这个框架也是基于 Transformer 的模型,该模型在 800 万个 Web 页面的数据集进行训练。他们在网站公布的结果令人震撼。这个模型能够根据我们输入的寥寥可数的句子就编织出一个完全清晰的故事,请看看下面的这个例子:

    4.7.2 词嵌入

    我们使用的大多数机器学习和深度学习算法都无法直接处理字符串和纯文本。这些技术要求我们必须先将文本数据转换为数字,然后才能执行任何任务(如回归和分类)。
    因此,简单来说,词嵌入就是为了将文本块转换为用于执行自然语言处理任务的数字。词嵌入格式通常尝试使用字典将单词映射到向量。
    你可以在下面的文章中,更深入地理解词嵌入、它的不同类型以及如何在数据集中使用它们。如果你不熟悉这个概念的话,我认为这份指南对你来说是必读的:

    《An Intuitive Understanding of Word Embeddings: From Count Vectors to Word2Vec》(《直观理解词嵌入:从计数向量到 Word2Vec》:https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/?utm_source=blog&utm_medium=top-pretrained-models-nlp-article

    在这一节中,我们将介绍自然语言处理领域中两个最先进的词嵌入。我还提供了教程的链接,这样你就可以对每个主题有实际的理解。

    4.7.2.1 ELMo

    GitHub 项目地址:https://github.com/allenai/allennlp/blob/master/tutorials/how_to/elmo.md
    不,这个 ELMo 可不是《Sesame Street》(《芝麻街》,美国芝麻街工作制坐坐的一档著名的儿童教育电视节目)的角色。但这个 ELMo(是 Embedding from Language Models 的缩写)在构建自然语言处理模的上下文非常有用。
    ELMo 词向量表示(word representations)考虑用于计算词嵌入的完整输入语句。因此“read”这个词在不同的上下文中有不同的 ELMo 向量。这点与旧词嵌入截然不同,对旧词嵌入而言,无论单词在什么上下文中使用,这个单词都会分配到相同的向量。
    有关 ELMo 更多的信息,请参阅以下资源:

    4.7.2.2 Flair

    Flair 并不完全是词嵌入,而是词嵌入的组合。我们可以称 Flair 更多的是一个自然语言处理程序库,它结合了 GloVe、BERT、EMLo 等嵌入。Zalando Research 的优秀人员开发并开源了 Flair。
    该团队已经为以下自然语言处理任务发布了几个预训练模型:

    • Name-Entity Recognition (NER,名称 - 实体识别)
    • Parts-of-Speech Tagging (PoS,词性标注)
    • 文本分类
    • 训练自定义模型

      <p>image.png</p>
      <br>
      “Flair Embedding”是封装在 Flair 库中的签名嵌入。它由上下文字符串嵌入提供支持。你应该自诩阅读这篇文章《Introduction to Flair for NLP: A Simple yet Powerful State-of-the-Art NLP Library》(《Flair 简介:简单而强大的,最先进的自然语言处理库》)来了解支持 Flair 的核心组件:<a href="https://links.jianshu.com/go?to=https%3A%2F%2Fwww.analyticsvidhya.com%2Fblog%2F2019%2F02%2Fflair-nlp-library-python%2F%3Futm_source%3Dblog%26utm_medium%3Dtop-pretrained-models-nlp-article" rel="nofollow" target="_blank">https://www.analyticsvidhya.com/blog/2019/02/flair-nlp-library-python/?utm_source=blog&amp;utm_medium=top-pretrained-models-nlp-article</a><br>
      我特别喜欢 Flair 的地方就是它能够支持多种语言。如此多的自然语言处理版本都只做英语方面的任务。如果自然语言处理想在全球范围内获得吸引力的话,我们就必须超越这一点!<br>
      有关 Flair 更多的信息,请参阅以下资源:</li>
      <li>《Introduction to Flair for NLP: A Simple yet Powerful State-of-the-Art NLP Library》(《Flair 简介:简单而强大的,最先进的自然语言处理库》):<a href="https://links.jianshu.com/go?to=https%3A%2F%2Fwww.analyticsvidhya.com%2Fblog%2F2019%2F02%2Fflair-nlp-library-python%2F%3Futm_source%3Dblog%26utm_medium%3Dtop-pretrained-models-nlp-article" rel="nofollow" target="_blank">https://www.analyticsvidhya.com/blog/2019/02/flair-nlp-library-python/?utm_source=blog&amp;utm_medium=top-pretrained-models-nlp-article</a><br>
      Flair 的预训练模型:<a href="https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fzalandoresearch%2Fflair" rel="nofollow" target="_blank">https://github.com/zalandoresearch/flair</a><br>
      还不确定?那么,看下面这张比较表就会让你明白:</li>
      <li>GitHub 项目地址:<a href="https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fzalandoresearch%2Fflair" rel="nofollow" target="_blank">https://github.com/zalandoresearch/flair</a></li>
      

    4.7.3 FairSeq Seq2Seq模型

    4.7.4

    4.7.5

    名称 环境 精度 错误率
    Thomas Wolf      
    Junseong Kim      

    4.7.5



    作者:readilen
    链接:https://www.jianshu.com/p/7e13a498bd63
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 什么是预训练模型

    千次阅读 2020-06-06 12:01:19
  • pytorch调用预训练模型

    万次阅读 2018-09-14 08:55:12
    最近刚开始入手pytorch,搭网络要比tensorflow更容易,有很多预训练好的模型,直接...#调用alexnet模型,pretrained=True表示读取网络结构和预训练模型,False表示只加载网络结构,不需要预训练模型 alexnet = m...

    最近刚开始入手pytorch,搭网络要比tensorflow更容易,有很多预训练好的模型,直接调用即可。
    参考链接

    import torch
    import torchvision.models as models #预训练模型都在这里面
    #调用alexnet模型,pretrained=True表示读取网络结构和预训练模型,False表示只加载网络结构,不需要预训练模型
    alexnet = models.alexnet(pretrained=False)  #只加载结构
    
    print(alexnet)  # 打印模型结构
    # 下面是两种加载模型参数的方式:
    model.load_state_dict(model_zoo.load_url(model_urls['alexnet'])) #下载网上的预训练模型
    alexnet.load_state_dict(torch.load('F:/DeepLearning/alexnet-owt-4df8aa71.pth'))#加载预先下载好的预训练参数到alexnet
    
    print(alexnet)  # 打印的还是模型结构
    pre_dict = alexnet.state_dict()  # 按键值对将模型参数加载到pre_dict
    print((k,v) for k ,v in pre_dict.items())  # 打印模型参数
    for k ,v in pre_dict.items():  #打印模型每层命名
        print(k)
    
    pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
    #note:model是自己定义好的模型,将pretrained_dict和model_dict中命名一致的层加入pretrained_dict(包括参数)
    

    VGG模型同理:

    vgg16 = models.vgg16(pretrained=True) #加载网络结构和预训练模型
    #static_dict()返回包含模块所有状态的字典
    pretrained_dict = vgg16.state_dict()  #返回内置预训练vgg模块的字典
    model_dict = model.state_dict()  #返回我们自己model的字典
    
    #------------------------最关键的三步------------------------------------------
    # 1. filter out unnecessary keys,也就是说从内置模块中删除掉我们不需要的字典
    pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
    
    # 2. overwrite entries in the existing state dict,利用pretrained_dict更新现有的model_dict
    model_dict.update(pretrained_dict)
    
    # 3. load the new state dict,更新模型,加载我们真正需要的state_dict
    model.load_state_dict(model_dict)
    

    保存和加载模型可以参考链接

    还有一个很好的博客 https://blog.csdn.net/u014380165/article/details/79119664

     
    ------2019.05.07更新----------
    加载inception-v3模型并重写fc层:

    import torch
    import torchvision.models as models
    class Model(nn.Module):
    	def __init__(self, args):
    		super(Model, self).__init__()
    		self.args = args		
    		if self.args.backbone == 'inception_v3':
    			self.model = models.inception_v3()
    			if self.args.pretrained:
    				self.model.load_state_dict(
    					torch.load(os.path.join(self.args.pretrained_models_dir + '.pth')))
    
    			# del self.model._modules['AuxLogits'] #删除AuxLogits模块
    			self.model.AuxLogits.fc = nn.Linear(self.model.AuxLogits.fc.in_features, self.args.n_classes) #将模型AuxLogits模块的fc输出通道数改成我们需要的分类数
    			print(self.model) #打印模型结构
    			print(self.model._modules.keys())  #可以打印出模型的所有模块名称
    			self.features = nn.Sequential(*list(self.model.children())[:-1], ) #去掉最后一层fc层,这句也可以写成# del self.model._modules['fc']
    			self.last_node_num = 2048
    			
    		self.avg_pool = nn.AdaptiveAvgPool2d(output_size=(1, 1))  #全局池化
    		self.classifier = nn.Linear(self.last_node_num, self.args.n_classes)  #最后加了一个全连接层
    		
    	def forward(self, x):  #重写forward函数,把几个模块组合起来
    		x = self.features(x)
    		x = self.avg_pool(x)
    		x = x.view(-1, x.shape[1] * x.shape[2] * x.shape[3])
    		x = self.classifier(x)
    		return x
    

    2019.6.18更新
    PyTorch学习:加载模型和参数 https://blog.csdn.net/lscelory/article/details/81482586

    Pytorch保存和加载参数有两种方式:(参考

    1. 只保存参数,不保存模型,对应的保存和加载方法分别是:
    ## 保存训练完的网络的各层参数,保存训练完的网络的各层参数(即weights和bias)
    torch.save(net.state_dict(),path)
    
    ##加载保存到path中的各层参数到神经网络net2,不可以直接为torch.load_state_dict(path),此函数不能直接接收字符串类型参数
    net2.load_state_dict(torch.load(path))
    
    1. 保存模型和参数,对应的保存和加载方法分别是:
    ## 保存训练完的整个网络模型(不止weights和bias,还有模型本身)
    torch.save(net,path)
    
    ## 加载保存到path中的整个神经网络
    net2=torch.load(path)
    

    官方推荐方式一,原因自然是保存的内容少,速度会更快。

    展开全文
  • 跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么? 贵。 尤其是当我们在尝试处理现实生活中诸如图像识别、声音...在这篇文章中,我将会讲述如何使用预训练模型来加速解决问题的过程。 注...

     

    跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么?

    贵。

    尤其是当我们在尝试处理现实生活中诸如图像识别、声音辨识等实际问题的时候。一旦你的模型中包含一些隐藏层时,增添多一层隐藏层将会花费巨大的计算资源。

    庆幸的是,有一种叫做“迁移学习”的方式,可以使我们在他人训练过的模型基础上进行小改动便可投入使用。在这篇文章中,我将会讲述如何使用预训练模型来加速解决问题的过程。

    注:这篇文章默认读者对于神经网络和深度学习有着一定的了解,如果你不了解深度学习,那么我强烈建议你先了解一下深度学习的基础概念:

     

    目录

    1.什么是迁移学习?

    2.什么是预训练模型?

    3.为什么我们使用预训练模型?-结合生活实例

    4.我们可以怎样运用预训练模型?

    提取特征(extract features)

    优化模型(fine tune the model)

    5.优化模型的方式

    6.在数字识别中使用预训练模型

    只针对输出密集层(output dense layer)的重新训练

    冻结初始几层网络的权重因子

    1. 什么是迁移学习?

    为了对迁移学习产生一个直观的认识,不妨拿老师与学生之间的关系做类比。

    一位老师通常在ta所教授的领域有着多年丰富的经验,在这些积累的基础上,老师们能够在课堂上教授给学生们该领域最简明扼要的内容。这个过程可以看做是老手与新手之间的“信息迁移”。

    这个过程在神经网络中也适用。

    我们知道,神经网络需要用数据来训练,它从数据中获得信息,进而把它们转换成相应的权重。这些权重能够被提取出来,迁移到其他的神经网络中,我们“迁移”了这些学来的特征,就不需要从零开始训练一个神经网络了 。

    现在,让我们从自身进化的角度来讨论这种迁移学习的重要性。这是Tim Urban最近在waitbutwhy.com上的一篇文章中提出的观点。

    Tim说,在语言发明之前,每一代人类都需要自身重新习得很多知识,这也是知识从上一代到下一代一增长缓慢的原因。

    随后,我们发明了语言,这为知识在世代间的传递提供了载体,下图是在语言发明后,同样时间尺度下知识增长速度的示意图。

    是不是看起来很牛逼?而通过权重的传递来进行迁移学习和人类在世代交替中通过语言传播知识,是一个道理。

    2. 什么是预训练模型?

    简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型。你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手。

    比如说,如果你想做一辆自动驾驶汽车,可以花数年时间从零开始构建一个性能优良的图像识别算法,也可以从Google在ImageNet数据集上训练得到的inception model(一个预训练模型)起步,来识别图像。

    一个预训练模型可能对于你的应用中并不是100%的准确对口,但是它可以为你节省大量功夫。

    接下来,我会举个例子来说明。

    3. 为什么我们要用预训练模型?

    上周我一直在尝试解决Crowdanalytix platform上的一个问题:从手机图片中分辨场景。

    这是一个图像分类的问题,训练数据集中有4591张图片,测试集中有1200张图片。我们的任务是将图片相应地分到16个类别中。在对图片进行一些预处理后,我首先采用一个简单的MLP(Multi-later Perceptron)模型,结构如下图所示:

    在对输入图片(224*224*3)平整化后,为了简化上述结构,我用了三个各含有500个神经元的隐藏层。在输出层中,共有16个神经元对应着十六个类别。

    我只能将训练的准确率控制在6.8%,这是个很不理想的结果。我尝试对隐藏层、隐层中神经元的数量以及drop out速率进行调整,但准确度都没有太大的提升。而如果增加隐藏层和其中神经元的数量,每个周期的运行时间则会增加20s以上。(我的开发环境是12GB VRAM,Titan X GPU)

    下面是我用上文所述结构的MLP模型训练输出的结果。

    可以看出,除非指数级地增加训练时长,MLP模型无法提供给我更好的结果。因此,我转而采用CNN(卷积神经网络),看看他们在这个数据集上的表现,以及是否能够提高训练的准确度。

    CNN的结构如下:

    我使用了3个卷积的模块,每个模块由以下部分组成:

    • 32个5*5的filter

    • 线性整流函数(ReLU)作为激活函数

    • 4*4的最大值池化层

    最后一个卷积模块输出的结果经过平整化后会被传递到一个拥有64的神经元的隐藏层上,随后通过一个drop out rate = 0.5处理后传递到输出层。

    最终训练的结果记录如下:

    准确率15.75%,尽管与MLP模型相比有所提升,但每个周期的运行时间也增加了。

    而更重要的是,数据集中最大类别所含图片数量约占总数17.6%左右。

    只要把所有的图片都归到最大的类别,我们就能够得到比MLP、CNN训练出来的模型更好的结果(ノへ ̄、)。

    此外,增加更多的卷积模块也会大大增加训练时长。

    于是,我转而去采用预训练模型,这样我不需要重新训练我的整个结构,只需要针对其中的几层进行训练即可。

    因此,我采用了在ImageNet数据集上预先训练好的VGG16模型,这个模型可以在Keras库中找到。

    模型的结构如下所示:

    在VGG16结构的基础上,我只将softmax层的1000个输出改为16个,从而适应我们这个问题的情景,随后重新训练了dense layer。

    跟MLP和CNN相比,这个结构的准确率能够达到70%。同时,使用VGG16最大的好处是大大减少了训练时间,只需要针对dense layer进行训练,所需时间基本可以忽略。

    4.怎样使用预训练模型?

    当在训练经网络的时候我们的目标是什么?我们希望网络能够在多次正向反向迭代的过程中,找到合适的权重。

    通过使用之前在大数据集上经过训练的预训练模型,我们可以直接使用相应的结构和权重,将它们应用到我们正在面对的问题上。这被称作是“迁移学习”,即将预训练的模型“迁移”到我们正在应对的特定问题中。

    在选择预训练模型的时候你需要非常仔细,如果你的问题与预训练模型训练情景下有很大的出入,那么模型所得到的预测结果将会非常不准确。

    举例来说,如果把一个原本用于语音识别的模型用来做用户识别,那结果肯定是不理想的。

    幸运的是,Keras库中有许多这类预训练的结构。

    ImageNet数据集已经被广泛用作训练集,因为它规模足够大(包括120万张图片),有助于训练普适模型。ImageNet的训练目标,是将所有的图片正确地划分到1000个分类条目下。这1000个分类基本上都来源于我们的日常生活,比如说猫猫狗狗的种类,各种家庭用品,日常通勤工具等等。

    在迁移学习中,这些预训练的网络对于ImageNet数据集外的图片也表现出了很好的泛化性能。

    既然预训练模型已经训练得很好,我们就不会在短时间内去修改过多的权重,在迁移学习中用到它的时候,往往只是进行微调(fine tune)。

    在修改模型的过程中,我们通过会采用比一般训练模型更低的学习速率。

    5. 微调模型的方法

    特征提取

    我们可以将预训练模型当做特征提取装置来使用。具体的做法是,将输出层去掉,然后将剩下的整个网络当做一个固定的特征提取机,从而应用到新的数据集中。

    采用预训练模型的结构

    我们还可以采用预训练模型的结构,但先将所有的权重随机化,然后依据自己的数据集进行训练。

    训练特定层,冻结其他层

    另一种使用预训练模型的方法是对它进行部分的训练。具体的做法是,将模型起始的一些层的权重保持不变,重新训练后面的层,得到新的权重。在这个过程中,我们可以多次进行尝试,从而能够依据结果找到frozen layers和retrain layers之间的最佳搭配。

    如何使用与训练模型,是由数据集大小和新旧数据集(预训练的数据集和我们要解决的数据集)之间数据的相似度来决定的。

    下图表展示了在各种情况下应该如何使用预训练模型:

    场景一:数据集小,数据相似度高(与pre-trained model的训练数据相比而言)

    在这种情况下,因为数据与预训练模型的训练数据相似度很高,因此我们不需要重新训练模型。我们只需要将输出层改制成符合问题情境下的结构就好。

    我们使用预处理模型作为模式提取器。

    比如说我们使用在ImageNet上训练的模型来辨认一组新照片中的小猫小狗。在这里,需要被辨认的图片与ImageNet库中的图片类似,但是我们的输出结果中只需要两项——猫或者狗。

    在这个例子中,我们需要做的就是把dense layer和最终softmax layer的输出从1000个类别改为2个类别。

    场景二:数据集小,数据相似度不高

    在这种情况下,我们可以冻结预训练模型中的前k个层中的权重,然后重新训练后面的n-k个层,当然最后一层也需要根据相应的输出格式来进行修改。

    因为数据的相似度不高,重新训练的过程就变得非常关键。而新数据集大小的不足,则是通过冻结预训练模型的前k层进行弥补。

    场景三:数据集大,数据相似度不高

    在这种情况下,因为我们有一个很大的数据集,所以神经网络的训练过程将会比较有效率。然而,因为实际数据与预训练模型的训练数据之间存在很大差异,采用预训练模型将不会是一种高效的方式。

    因此最好的方法还是将预处理模型中的权重全都初始化后在新数据集的基础上重头开始训练。

    场景四:数据集大,数据相似度高

    这就是最理想的情况,采用预训练模型会变得非常高效。最好的运用方式是保持模型原有的结构和初始权重不变,随后在新数据集的基础上重新训练。

    6. 在手写数字识别中使用预训练模型

    现在,让我们尝试来用预训练模型去解决一个简单的问题。

    我曾经使用vgg16作为预训练的模型结构,并把它应用到手写数字识别上。

    让我们先来看看这个问题对应着之前四种场景中的哪一种。我们的训练集(MNIST)有大约60,000张左右的手写数字图片,这样的数据集显然是偏小的。所以这个问题应该属于场景一或场景二。

    我们可以尝试把两种对应的方法都用一下,看看最终的效果。

    只重新训练输出层 & dense layer

    这里我们采用vgg16作为特征提取器。随后这些特征,会被传递到依据我们数据集训练的dense layer上。输出层同样由与我们问题相对应的softmax层函数所取代。

    在vgg16中,输出层是一个拥有1000个类别的softmax层。我们把这层去掉,换上一层只有10个类别的softmax层。我们只训练这些层,然后就进行数字识别的尝试。

    # importing required librariesfromkeras.models importSequential fromscipy.misc importimreadget_ipython().magic( 'matplotlib inline') importmatplotlib.pyplot asplt importnumpy asnp importkeras fromkeras.layers importDense importpandas aspd fromkeras.applications.vgg16 importVGG16 fromkeras.preprocessing importimage fromkeras.applications.vgg16 importpreprocess_input importnumpy asnp fromkeras.applications.vgg16 importdecode_predictionstrain=pd.read_csv( "R/Data/Train/train.csv")test=pd.read_csv( "R/Data/test.csv")train_path= "R/Data/Train/Images/train/"test_path= "R/Data/Train/Images/test/"fromscipy.misc importimresize # preparing the train datasettrain_img=[] fori inrange(len(train)): temp_img=image.load_img(train_path+train[ 'filename'][i],target_size=( 224, 224)) temp_img=image.img_to_array(temp_img) train_img.append(temp_img) #converting train images to array and applying mean subtraction processingtrain_img=np.array(train_img) train_img=preprocess_input(train_img) # applying the same procedure with the test datasettest_img=[] fori inrange(len(test)): temp_img=image.load_img(test_path+test[ 'filename'][i],target_size=( 224, 224)) temp_img=image.img_to_array(temp_img) test_img.append(temp_img)test_img=np.array(test_img) test_img=preprocess_input(test_img) # loading VGG16 model weightsmodel = VGG16(weights= 'imagenet', include_top= False) # Extracting features from the train dataset using the VGG16 pre-trained modelfeatures_train=model.predict(train_img) # Extracting features from the train dataset using the VGG16 pre-trained modelfeatures_test=model.predict(test_img) # flattening the layers to conform to MLP inputtrain_x=features_train.reshape( 49000, 25088) # converting target variable to arraytrain_y=np.asarray(train[ 'label']) # performing one-hot encoding for the target variabletrain_y=pd.get_dummies(train_y)train_y=np.array(train_y) # creating training and validation setfromsklearn.model_selection importtrain_test_splitX_train, X_valid, Y_train, Y_valid=train_test_split(train_x,train_y,test_size= 0.3, random_state= 42) # creating a mlp modelfromkeras.layers importDense, Activationmodel=Sequential()model.add(Dense( 1000, input_dim= 25088, activation= 'relu',kernel_initializer= 'uniform'))keras.layers.core.Dropout( 0.3, noise_shape= None, seed= None)model.add(Dense( 500,input_dim= 1000,activation= 'sigmoid'))keras.layers.core.Dropout( 0.4, noise_shape= None, seed= None)model.add(Dense( 150,input_dim= 500,activation= 'sigmoid'))keras.layers.core.Dropout( 0.2, noise_shape= None, seed= None)model.add(Dense(units= 10))model.add(Activation( 'softmax'))model.compile(loss= 'categorical_crossentropy', optimizer= "adam", metrics=[ 'accuracy']) # fitting the model model.fit(X_train, Y_train, epochs= 20, batch_size= 128,validation_data=(X_valid,Y_valid))

    冻结最初几层网络的权重

    这里我们将会把vgg16网络的前8层进行冻结,然后对后面的网络重新进行训练。这么做是因为最初的几层网络捕获的是曲线、边缘这种普遍的特征,这跟我们的问题是相关的。我们想要保证这些权重不变,让网络在学习过程中重点关注这个数据集特有的一些特征,从而对后面的网络进行调整。

    fromkeras.models importSequential fromscipy.misc importimreadget_ipython().magic( 'matplotlib inline') importmatplotlib.pyplot asplt importnumpy asnp importkeras fromkeras.layers importDense importpandas aspd fromkeras.applications.vgg16 importVGG16 fromkeras.preprocessing importimage fromkeras.applications.vgg16 importpreprocess_input importnumpy asnp fromkeras.applications.vgg16 importdecode_predictions fromkeras.utils.np_utils importto_categorical fromsklearn.preprocessing importLabelEncoder fromkeras.models importSequential fromkeras.optimizers importSGD fromkeras.layers importInput, Dense, Convolution2D, MaxPooling2D, AveragePooling2D, ZeroPadding2D, Dropout, Flatten, merge, Reshape, Activation fromsklearn.metrics importlog_losstrain=pd.read_csv( "R/Data/Train/train.csv")test=pd.read_csv( "R/Data/test.csv")train_path= "R/Data/Train/Images/train/"test_path= "R/Data/Train/Images/test/"fromscipy.misc importimresizetrain_img=[] fori inrange(len(train)): temp_img=image.load_img(train_path+train[ 'filename'][i],target_size=( 224, 224)) temp_img=image.img_to_array(temp_img) train_img.append(temp_img)train_img=np.array(train_img) train_img=preprocess_input(train_img)test_img=[] fori inrange(len(test)):temp_img=image.load_img(test_path+test[ 'filename'][i],target_size=( 224, 224)) temp_img=image.img_to_array(temp_img) test_img.append(temp_img)test_img=np.array(test_img) test_img=preprocess_input(test_img) fromkeras.models importModel defvgg16_model(img_rows, img_cols, channel=1, num_classes=None):model = VGG16(weights= 'imagenet', include_top= True) model.layers.pop() model.outputs = [model.layers[- 1].output] model.layers[- 1].outbound_nodes = [] x=Dense(num_classes, activation= 'softmax')(model.output) model=Model(model.input,x) #To set the first 8 layers to non-trainable (weights will not be updated)forlayer inmodel.layers[: 8]: layer.trainable = False# Learning rate is changed to 0.001sgd = SGD(lr= 1e-3, decay= 1e-6, momentum= 0.9, nesterov= True) model.compile(optimizer=sgd, loss= 'categorical_crossentropy', metrics=[ 'accuracy']) returnmodeltrain_y=np.asarray(train[ 'label'])le = LabelEncoder()train_y = le.fit_transform(train_y)train_y=to_categorical(train_y)train_y=np.array(train_y) fromsklearn.model_selection importtrain_test_splitX_train, X_valid, Y_train, Y_valid=train_test_split(train_img,train_y,test_size= 0.2, random_state= 42) # Example to fine-tune on 3000 samples from Cifar10img_rows, img_cols = 224, 224# Resolution of inputschannel = 3num_classes = 10batch_size = 16nb_epoch = 10# Load our modelmodel = vgg16_model(img_rows, img_cols, channel, num_classes)model.summary() # Start Fine-tuningmodel.fit(X_train, Y_train,batch_size=batch_size,epochs=nb_epoch,shuffle= True,verbose= 1,validation_data=(X_valid, Y_valid)) # Make predictionspredictions_valid = model.predict(X_valid, batch_size=batch_size, verbose= 1) # Cross-entropy loss scorescore = log_loss(Y_valid, predictions_valid) 相关资源

    原文:

    https://www.analyticsvidhya.com/blog/2017/06/transfer-learning-the-art-of-fine-tuning-a-pre-trained-model/

    VGG-16:

    https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3

    Keras库中的ImageNet预训练模型:

    https://keras.io/applications/

    手写数字数据集MNIST:

    http://yann.lecun.com/exdb/mnist/

    展开全文
  • 预训练模型的现状及分析预训练方法发展基于词嵌入的预训练方法基于语言模型的预训练方法 首先通过上图大家可以清楚的了解到预训练模型之间的前世今生。 前面已经介绍了很多预训练模型,本文就前面的内容做一个总结...
  • 使用||微调预训练模型||迁移学习

    千次阅读 2019-05-07 20:55:47
    元学习论文总结||小样本学习论文总结 ...怎样使用预训练模型? 当在训练经网络的时候我们的目标是什么?我们希望网络能够在多次正向反向迭代的过程中,找到合适的权重。 通过使用之前在大数据集上经过训...
  • 预训练模型迁移学习

    2019-04-16 09:19:00
    本文通过使用Keras及一个预训练模型的实例,教你如何通过迁移学习来解决这个问题。 深度学习正在迅速成为人工智能应用开发的主要工具。在计算机视觉、自然语言处理和语音识别等领域都已有成功的案例。 深度学习...
  • 转载 CameraZhangALin   跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么? 贵。 尤其是当我们在尝试处理现实生活中诸如图像识别、声音...在这篇文章中,我将会讲述如何使用预训练
  • from tensorflow.python.keras.applications import ResNet50 from tensorflow.python.keras.models import Sequential from tensorflow.python.keras.layers import Dense, Flatten, GlobalAveragePooling2D ...
  • 文章 " Deep Learning-...所以我想尝试微调在ImageNet上预训练的ResNet模型进行虹膜识别 两种迁移学习方法 pytorch在resnet18上进行迁移学习的两种常用方式 预训练的网络参数初始化网络,而不是随机初始化网络参数
  • 预训练模型综述

    2020-09-16 10:00:00
    预训练模型综述摘要:近年来,预训练模型的出现将自然语言处理带入了一个新的时代。本文概述了面向自然语言处理领域的预训练模型技术。我们首先概述了预训练模型及其发展历史。并详细介绍自然语言处理...
  • 【深度学习】使用预训练模型

    千次阅读 2018-12-22 20:26:12
    微调模型 特征提取 特征提取就是使用已经训练好的网络在新的样本上提取特征,然后将这些特征输入到新的分类器,从头开始训练的过程。 卷积神经网络分为两个部分: 一系列池化层+卷积层,也叫卷积基 全连接层 特征...
  • 怎样用预训练模型搞定深度学习?

    万次阅读 多人点赞 2018-05-14 15:55:26
    引言 跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么?贵!尤其是当我们在尝试处理现实生活中诸如图像...在这篇文章中,我将会讲述如何使用预训练模型来加速解决问题的过程。注:这篇文章...
  • 通常来说,由于时间限制或硬件水平限制大家往往并不会从头开始构建并训练模型,这也就是预训练模型存在的意义。大家可以使用预训练模型作为基准来改进现有模型,或者针对它测试自己的模型: 图片来源:Facebook ...
  • 加载预训练模型解密

    万次阅读 2020-04-21 14:18:23
    net = slowfastnet.resnet50(class_num=params['num_classes'...#加载预训练模型 net_dict = torch.load( "D:\\SlowFastNetworks-master\\UCF101\\2020-04-20-18-04-06\\clip_len_64frame_sample_rate_1_checkpoint...
  • 如何只使用预训练模型的卷积层

    万次阅读 2020-04-21 16:43:49
    通过向FilterPrunner(这个实现了跳过全连接层)这个类中传入ModifiedVGG16Model(这个网络固化了所有参数,就是不可导)这个网络达目的 import torch from torch.autograd import Variable from torchvision import...
  • 如何固化预训练模型的参数

    万次阅读 2020-04-21 16:29:13
    # 自定义全连接层加载VGG16作为预训练模型 class ModifiedVGG16Model(torch.nn.Module): def __init__(self): super(ModifiedVGG16Model, self).__init__() # 加载预训练模型 model = models.vgg16(pretrained=....
  • Tensorflow加载预训练模型和保存模型

    万次阅读 多人点赞 2017-11-10 19:07:16
    使用tensorflow过程中,训练结束后我们需要用到模型文件。有时候,我们可能也需要用到别人训练好的模型,并在这个基础上再次训练。这时候我们需要掌握如何操作这些模型数据。看完本文,相信你一定会有收获!
  • 预训练模型优缺点

    千次阅读 2019-12-16 19:38:26
    此处预训练模型指分类模型,将预训练模型作为检测模型主干网络 优点: 1、开源模型多,可以直接用于目标检测 2、可以快速地得到最终模型,需要的训练数据少 缺点: 1、预训练模型大、参数多、模型结构灵活性差、难以...
  • 大纲1 语言模型2 XLNetXLNET好处XLNet 创新点应用3 Transformer-xl3.1 segment-level recurrence mechanism3.2 relative positional encoding4 Bert阶段1:语言模型阶段2:fine-tune5 GPT6 ELMo7 其他7.1 迁移的2种...

空空如也

1 2 3 4 5 ... 20
收藏数 67,801
精华内容 27,120
关键字:

预训练模型