精华内容
下载资源
问答
  • 今天小编就为大家分享一篇pytorch 输出中间层特征的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • pytorch 输出中间层特征

    万次阅读 2018-05-21 11:20:57
    pytorch 输出中间层特征:tensorflow输出中间特征,2种方式:1. 保存全部模型(包括结构)时,需要之前先add_to_collection 或者 用slim模块下的end_points2. 只保存模型参数时,可以读取网络结构,然后按照对应的中间...

    pytorch 输出中间层特征:

    tensorflow输出中间特征,2种方式:

    1. 保存全部模型(包括结构)时,需要之前先add_to_collection 或者 用slim模块下的end_points

    2. 只保存模型参数时,可以读取网络结构,然后按照对应的中间层输出即可。

    but:Pytorch 论坛给出的答案并不好用,无论是hooks,还是重建网络并去掉某些层,这些方法都不好用(在我看来)。

    我们可以在创建网络class时,在forward时加入一个dict 或者 list,dict是将中间层名字与中间层输出分别作为key:value,然后作为第二个值返回。前提是:运行创建自己的网络(无论fine-tune),只保存网络参数。

    个人理解:虽然每次运行都返回2个值,但是运行效率基本没有变化。

    附上代码例子:

    import torch
    import torchvision
    import numpy as np
    from torch import nn
    from torch.nn import init
    from torch.autograd import Variable
    from torch.utils import data

    EPOCH=20
    BATCH_SIZE=64
    LR=1e-2

    train_data=torchvision.datasets.MNIST(root='./mnist',train=True,
                                          transform=torchvision.transforms.ToTensor(),download=False)
    train_loader=data.DataLoader(train_data,batch_size=BATCH_SIZE,shuffle=True)

    test_data=torchvision.datasets.MNIST(root='./mnist',train=False)

    test_x=Variable(torch.unsqueeze(test_data.test_data,dim=1).type(torch.FloatTensor)).cuda()/255
    test_y=test_data.test_labels.cuda()

    class CNN(nn.Module):
        def __init__(self):
            super().__init__()
            self.conv1=nn.Sequential(
                    nn.Conv2d(in_channels=1,out_channels=16,kernel_size=4,stride=1,padding=2),
                    nn.ReLU(),
                    nn.MaxPool2d(kernel_size=2,stride=2))
            self.conv2=nn.Sequential(nn.Conv2d(16,32,4,1,2),nn.ReLU(),nn.MaxPool2d(2,2))
            self.out=nn.Linear(32*7*7,10)
            
        def forward(self,x):
            per_out=[] ############修改处##############
            x=self.conv1(x)
            per_out.append(x) # conv1
            x=self.conv2(x)
            per_out.append(x) # conv2
            x=x.view(x.size(0),-1)
            output=self.out(x)
            return output,per_out
        
    cnn=CNN().cuda() # or cnn.cuda()

    optimizer=torch.optim.Adam(cnn.parameters(),lr=LR)
    loss_func=nn.CrossEntropyLoss().cuda()############################

    for epoch in range(EPOCH):
        for step,(x,y) in enumerate(train_loader):
            b_x=Variable(x).cuda()# if channel==1 auto add c=1
            b_y=Variable(y).cuda()
    #        print(b_x.data.shape)
            optimizer.zero_grad()
            output=cnn(b_x)[0] ##原先只需要cnn(b_x) 但是现在需要用到第一个返回值##
            loss=loss_func(output,b_y)# Variable need to get .data
            loss.backward()
            optimizer.step()
            
            if step%50==0:
                test_output=cnn(test_x)[0]
                pred_y=torch.max(test_output,1)[1].cuda().data.squeeze()
                '''
                why data ,because Variable .data to Tensor;and cuda() not to numpy() ,must to cpu and to numpy
                and .float compute decimal
                '''
                accuracy=torch.sum(pred_y==test_y).data.float()/test_y.size(0)
                print('EPOCH: ',epoch,'| train_loss:%.4f'%loss.data[0],'| test accuracy:%.2f'%accuracy)
            #                                             loss.data.cpu().numpy().item() get one value

        torch.save(cnn.state_dict(),'./model/model.pth')

    ##输出中间层特征,根据索引调用##

    conv1: conv1=cnn(b_x)[1][0]

    conv2: conv2=cnn(b_x)[1][1]


    ##########################

    hook使用:

    res=torchvision.models.resnet18()

    def get_features_hook(self, input, output):# self 代表类模块本身
        print(output.data.cpu().numpy().shape)

    handle=res.layer2.register_forward_hook(get_features_hook)

    a=torch.ones([1,3,224,224])

    b=res(a) 直接打印出 layer2的输出形状,但是不好用。因为,实际中,我们需要return,而hook明确指出 不可以return 只能print。

    所以,不建议使用hook。


    展开全文
  • PyTorch提取中间层特征(Resnet)

    万次阅读 2019-03-11 22:22:27
    特征提取在深度学习的训练中是经常要做的事情,之前的一篇blog有写到使用pytorch提取Vgg、Resnet、Densenet三种模型下的特征,这里所述的是提取全连接层(FC层)的特征,详情可见:... 在本文中,主要是介绍提取中间层...

         特征提取在深度学习的训练中是经常要做的事情,之前的一篇blog有写到使用pytorch提取Vgg、Resnet、Densenet三种模型下的特征,这里所述的是提取全连接层(FC层)的特征,详情可见:https://blog.csdn.net/qq_34611579/article/details/84330968

         在本文中,主要是介绍提取中间层的特征,对于特征的提取,可以先把模型的结构输出,不同的模型结构是不一样的;下面拿resnet作为示例;由于pytorch模型很多用到nn.sequential,所以对各层的特征提取要自己去修改forward函数。

    # 中间层特征提取
    class FeatureExtractor(nn.Module):
        def __init__(self, submodule, extracted_layers):
            super(FeatureExtractor, self).__init__()
            self.submodule = submodule
            self.extracted_layers = extracted_layers
    
        # 自己修改forward函数
        def forward(self, x):
            outputs = []
            for name, module in self.submodule._modules.items():
                if name is "fc": x = x.view(x.size(0), -1)
                x = module(x)
                if name in self.extracted_layers:
                    outputs.append(x)
            return outputs

        这里可以看到,我们自定义了forward函数,由此可以选择在哪一层提取特征。

    extract_list = ["conv1", "maxpool", "layer1", "avgpool", "fc"]
    img_path = "./1_00001.jpg"
    saved_path = "./1_00001.txt"
    resnet = models.resnet50(pretrained=True)
    # print(resnet) 可以打印看模型结构
    
    transform = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor()]
    )
    
    img = Image.open(img_path)
    img = transform(img)
    
    x = Variable(torch.unsqueeze(img, dim=0).float(), requires_grad=False)
    
    if use_gpu:
        x = x.cuda()
        resnet = resnet.cuda()
    
    extract_result = FeatureExtractor(resnet, extract_list)
    print(extract_result(x)[4])  # [0]:conv1  [1]:maxpool  [2]:layer1  [3]:avgpool  [4]:fc

      对于模型的结构我们可以打印出来看看,这里是采用的Resnet,此时forward函数也是针对该模型进行了修改;若比如其他的VGG,DenseNet也可以用类似的方法进行修改。

    参考这里所说:https://blog.csdn.net/qq_24306353/article/details/82995320.

    还有一些比如可视化,可参考:https://blog.csdn.net/xz1308579340/article/details/85622579.

    源代码:https://github.com/Messi-Q/Pytorch-extract-feature/blob/master/feature_extract.py.

    展开全文
  • pytorch模型中间层特征提取

    万次阅读 热门讨论 2018-04-28 14:14:24
    参考pytorch论坛:How to extract features of an image from a trained model ...#中间特征提取 class FeatureExtractor(nn.Module): def __init__(self, submodule, extracted_layers): super(Featur...

    参考pytorch论坛:How to extract features of an image from a trained model

    定义一个特征提取的类:

    #中间特征提取
    class FeatureExtractor(nn.Module):
        def __init__(self, submodule, extracted_layers):
            super(FeatureExtractor,self).__init__()
            self.submodule = submodule
            self.extracted_layers= extracted_layers
    
        def forward(self, x):
            outputs = []
            for name, module in self.submodule._modules.items():
                if name is "fc": x = x.view(x.size(0), -1)
                x = module(x)
                print(name)
                if name in self.extracted_layers:
                    outputs.append(x)
            return outputs
    
    #输入数据
    test_loader=DataLoader(test_dataset,batch_size=1)
    img,label=iter(test_loader).next()
    img, label = Variable(img, volatile=True), Variable(label, volatile=True)
    #特征输出
    myresnet=resnet18(pretrained=False)
    myresnet.load_state_dict(torch.load('cafir_resnet18_1.pkl')) 
    exact_list=["conv1","layer1","avgpool"]
    myexactor=FeatureExtractor(myresnet,exact_list)
    x=myexactor(img)
    #特征输出可视化
    import matplotlib.pyplot as plt
    for i in range(64):
        ax = plt.subplot(8, 8, i + 1)
        ax.set_title('Sample #{}'.format(i))
        ax.axis('off')
        plt.imshow(x[0].data.numpy()[0,i,:,:],cmap='jet')
        plt.show()

    整体代码(还未测试)

     

    # -*- coding: utf-8 -*-
    
    import torch
    import torchvision
    import torchvision.transforms as transforms
    import torchvision.models as models
    import matplotlib.pyplot as plt
    import numpy as np
    import torch.nn as nn
    import torch.nn.functional as F
    
    transform = transforms.Compose(
        [transforms.ToTensor(),
         transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
    
    '''trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                            download=True, transform=transform)
    trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                              shuffle=True, num_workers=2)'''
    
    testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                           download=True, transform=transform)
    testloader = torch.utils.data.DataLoader(testset, batch_size=1,
                                             shuffle=False, num_workers=0)
    
    classes = ('plane', 'car', 'bird', 'cat',
               'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
    
    
    
    class FeatureExtractor(nn.Module):
        def __init__(self, submodule, extracted_layers):
            super(FeatureExtractor,self).__init__()
            self.submodule = submodule
            self.extracted_layers= extracted_layers
     
        def forward(self, x):
            outputs = []
            for name, module in self.submodule._modules.items():
                if name is "fc": x = x.view(x.size(0), -1)
                x = module(x)
                print(name)
                if name in self.extracted_layers:
                    outputs.append(x)
    
    
    net=models.resnet18(pretrained=True).eval()
    inputs, labels = iter(testloader).next()
    exact_list=["conv1","layer1","avgpool"]
    myexactor=FeatureExtractor(net,exact_list)
    x=myexactor(inputs)
    for i in range(64):
        ax = plt.subplot(8, 8, i + 1)
        ax.set_title('Sample #{}'.format(i))
        ax.axis('off')
        plt.imshow(x[0].data.numpy()[0,i,:,:],cmap='jet')
        plt.show()
    

     

     

     

     

     

     

    展开全文
  • 告别代码复制粘贴,傻瓜式提取 PyTorch 中间层特征

    千次阅读 热门讨论 2021-03-16 12:03:57
    在使用 PyTorch 进行模型训练的过程中,经常需要提取模型中间层特征。解决这个问题可以用到 3 种方法。 对中间层进行特征提取的 3 大方法 1、借助模型类的属性传递 方法: 修改 forward 函数,通.

    内容导读:特征提取是图像处理过程中常需要用到的一种方法,其效果好坏对模型的泛化能力有至关重要的影响。

    特征提取(Feature extraction)在机器学习、模式识别和图像处理中应用广泛。

    它从初始的一组测量数据开始,建构出提供信息且不冗余的派生值,即特征值,从而促进后续的学习和泛化步骤。

    在使用 PyTorch 进行模型训练的过程中,经常需要提取模型中间层的特征。解决这个问题可以用到 3 种方法。

    对中间层进行特征提取的 3 大方法

    1、借助模型类的属性传递

    方法: 修改 forward 函数,通过添加一行代码将 feature 赋值给 self 变量,即 self.feature_map = feature,然后打印输出即可。

    备注: 适用于仅提取中间层特征,不需要提取梯度的情况。

    代码示例:

    # Define a Convolutional Neural Network
    class 
    Net(nn.Module):
        
        def __init__(self, kernel_size=5, n_filters=16, n_layers=3):
            xxx
        def forward(self, x): 
            x = self.body(self.head(x))
    
    
            self.featuremap1 = x.detach() # 核心代码
    
    
            return F.relu(self.fc(x))
    
    
    model_ft = Net()
    train_model(model_ft)
    feature_output1 = model_ft.featuremap1.transpose(1,0).cpu()
    

    2、借助 hook 机制

    hook 是一个可调用对象,它可以在不修改主代码的前提下插入业务。 PyTorch 中的 hook 包括三种:

    torch.autograd.Variable.register_hook

    torch.nn.Module.register_backward_hook

    torch.nn.Module.register_forward_hook

    第一个是针对 Variable 对象的,后两个是针对 nn.Module 对象的。

    方法: 在调用阶段对 Module 使用 forward_hook 函数,可以获得所需梯度或特征。

    备注: 较为复杂、功能完善,需要对 PyTorch 有一定程度的了解。

    3、借助 torchextractor

    torchextractor 是一个独立 Python 包,具有跟 nn.Module 功能类似的提取器,只需提供模块名称, 就可以在 PyTorch 中对中间层进行特征提取。

    与使用 forward_hook 进行中间层特征提取相比,torchextractor 更像是一个包装程序(wrapper),不像 torchvision IntermediateLayerGetter 有那么多的 assumption

    在功能方面 torchextractor 主要优势在于支持嵌套模块(nested module)、自定义缓存操作,而且与 ONNX 兼容。

    torchextractor 极大简化了在 PyTorch 中进行特征提取的流程,这避免了大量代码的粘贴复制,也不需要重写 forward 函数, 它对初学者更友好,可用性也更强。

    torchextractor 上手实践

    安装

    pip install torchextractor  # stable
    pip install git+https://github.com/antoinebrl/torchextractor.git  # latest
    

    要求

    Python 3.6 及以上版本

    Torch 1.4.0 及以上版本

    用法

    import torch
    import torchvision
    import torchextractor as tx
    
    
    model = torchvision.models.resnet18(pretrained=True)
    model = tx.Extractor(model, ["layer1", "layer2", "layer3", "layer4"])
    dummy_input = torch.rand(7, 3, 224, 224)
    model_output, features = model(dummy_input)
    feature_shapes = {name: f.shape for name, f in features.items()}
    print(feature_shapes)
    
    
    # {
    #   'layer1': torch.Size([1, 64, 56, 56]),
    #   'layer2': torch.Size([1, 128, 28, 28]),
    #   'layer3': torch.Size([1, 256, 14, 14]),
    #   'layer4': torch.Size([1, 512, 7, 7]),
    # }
    

    完整文档请查看:

    https://github.com/antoinebrl/torchextractor

    以上就是本期汇总的 3 个对中间层进行特征提取的方法,如果你有更好的解决思路,或者其他想要了解的 Pytorch 相关问题,欢迎在下方留言或发私信。

    参考:

    https://www.reddit.com/r/MachineLearning/comments/m2vwf9/p_pytorch_intermediate_feature_extraction/

    https://www.zhihu.com/question/68384370

    在这里插入图片描述

    展开全文
  • Pytorch获取中间层信息-hook函数

    千次阅读 多人点赞 2019-09-10 12:38:20
    由于pytorch会自动舍弃图计算的中间结果,所以想要获取这些数值就需要使用hook函数。hook函数包括tensor的hook和nn.Module的hook,用法相似。hook函数在使用后应及时删除,以避免每次都运行钩子增加运行负载。hook...
  • 【使用pytorch查看中间层特征矩阵以及卷积核参数】一级目录涉及文件脚本三级目录 一级目录 可视化工具tensorboard推荐,tensorflow和pytorch都可以用 涉及文件脚本 网络模型 (模型定义的区别主要在正向传播过程...
  • 今天小编就为大家分享一篇pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • pytorch提取某一网络特征

    万次阅读 2018-10-10 12:44:23
    pytorch提取某一网络特征图 由于pytorch的原模型很多用到了nn.Sequential,因此中间特征图难提取。 解决办法:自己写一个forward函数,然后索引需要的那一。 def resnet_cifar(net,input_data): x = ...
  • 今天小编就为大家分享一篇获取Pytorch中间某一权重或者特征的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 获取Pytorch中间某一权重或者特征

    万次阅读 多人点赞 2019-04-02 16:06:20
    获取Pytorch中间某一权重或者特征 问题:训练好的网络模型想知道中间某一的权重或者看看中间某一特征,如何处理呢? 1.获取某一权重,并保存到excel中; 以resnet18为例说明: import torch import pandas as pd...
  • 接上一篇文章,在得到训练模型后,进行加载模型后,对模型中间层特征进行提取并输出预测精度: 方法 参考《pytorch 提取卷积神经网络的特征图可视化》 class FeatureExtractor(nn.Module): def __init__(self,...
  • pytorch提取网络任意输出的特征

    千次阅读 2020-06-28 16:07:52
    原理很简单,对于我们自己写的网络其实很容易,我们只要在return 的时候返回我们想要的特征就可以了,但是对于一些别人写好的,我们又不方便改原代码的网络,提取特定的feature map就有点麻烦了。 下面我以...
  • 获取VGG中间层的输出结果 VGG结构 VGG的结构根据其网络层数的深度,分为四种,分别为11,13,16,19.这四种对应的网络结构的配置的声明见下。 defaultcfg = { 11 : [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, ...
  • # 提取vgg模型的中间层输出 # coding:utf8 import torch import torch.nn as nn from torchvision.models import vgg16 from collections import namedtuple class Vgg16 (torch.nn.Module) :...
  • Pytorch—可视化特征

    2021-07-16 23:09:58
    文章目录准备可视化中间特征层导入所需的库加载训练好模型加载一张图片定义钩子函数可视化浅层特征可视化深层特征可视化图像的类激活热力图重新定义一个新的模型定义获取热力图函数在原图上显示热力图尝试其他的图片...
  • Pytorch 可视化CNN中间层的输出

    万次阅读 多人点赞 2019-08-20 13:09:28
    可视化中间层的输出有助于理解输入图像如何在不同层之间进行转换。 PyTorch 提供了一个名为register_forward_hook的方法,它允许传入一个可以提取特定层输出的函数。 以下例子,使用VGG-16网络和猫狗图像分类,...
  • pytorch获取模型的中间层输出结果

    千次阅读 2020-09-08 18:36:25
    如果想要获取模型的中间层输出,则需要在计算前标定目标层位置(通过forward返回),或者把模型在那层截断(当作一个小模型)输出。本文介绍2种获取模型中间层输出结果的方法: 1. 标定目标层位置 def forward(self, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,026
精华内容 1,210
关键字:

pytorch提取中间层特征