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 输出中间层特征相关推荐

  1. 图像处理中提取中间特征是干什么_PyTorch提取中间层特征?

    点击上方"MLNLP",选择"星标"公众号 重磅干货,第一时间送达 编辑:忆臻 https://www.zhihu.com/question/68384370 ...

  2. Pytorch输出网络中间层特征可视化

    Pytorch输出网络中间层特征可视化 本文主要介绍了如何提取特定层的特征,然后对它进行可视化.最后给出了不同网络的应用案例. 推荐一个GITHUN实现可视化的工具地址 整体步骤 加载已经预训练好的模 ...

  3. keras提取网络中间层输出、中间层特征

    最近想用自编码网络降维一下数据,用堆叠自编码器SAE降维之后提取中间层特征 model = Sequential()model.add(Dense(1024, activation='relu', i ...

  4. keras、TensorFlow输出中间层结果的4种方法

    深度学习本质上是表示学习,它通过多层非线性神经网络模型从底层特征中学习出对具体任务而言更有效的高级抽象特征.针对一个具体的任务,我们往往会遇到这种情况:需要用一个针对特定任务已经被训练好的模型学习出特 ...

  5. 基于pytorch搭建多特征CNN-LSTM时间序列预测代码详细解读(附完整代码)

    系列文章目录 lstm系列文章目录 1.基于pytorch搭建多特征LSTM时间序列预测代码详细解读(附完整代码) 2.基于pytorch搭建多特征CNN-LSTM时间序列预测代码详细解读(附完整代码 ...

  6. 收藏 | PyTorch模型训练特征图可视化(TensorboardX)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨Pa ...

  7. Python以表格、可视化图像的形式输出模型特征重要度(feature importances)并进行重要度归一化及排序

    Python以表格.可视化图像的形式输出模型特征重要度(feature importances)并进行重要度归一化及排序 目录

  8. 【pytorch】自己实现精简版YOLOV3【二】,通过darknet_53输出的特征图:得到预测框位置、置信度以及目标类别

    接上篇博文: YOLOv3网络在三个特征图中预测出( 4 + 1 + c ) × k 个值,即特征图上每个点对应4个边界坐标(实际为偏移量),1个置信度值,C个类别值(C个类别置信度):数量k为特征图 ...

  9. pytorch 将模型作为特征提取器(提取中间层特征)

    目的 需要加载自己训练好的最好模型作为一个特征提取器,也就是说需要提取最后一层全连接层输出的内容. 解决方法 参考了两个方法(详见文末) 设参数直接提取 准备一个toy model来说明. class ...

最新文章

  1. python基础代码事例-数据科学Python基础(附示例代码和练习题目)
  2. [WebService] xml WebService学习1
  3. BZOJ-1012[JSOI2008]最大数maxnumber 线段树区间最值
  4. authentication list default is not defined for PPP
  5. HDOJ1016 素数环(DFS)
  6. java concurrent 框架,java.util.concurrent 包下的 Synchronizer 框架
  7. java-HashMap源码学习
  8. 手把手教你学Dapr - 4. 服务调用
  9. 如何设置计算机网共享文件夹,局域网内如何设置共享文件夹呢
  10. (30)System Verilog设计SPI发送
  11. 安卓使用MediaPlayer自定义音频视频播放器
  12. 使用feed,欢迎使用http://feed.feedsky.com/xu_fan_blog订阅
  13. linux编译ace tao,ACE_TAO的编译
  14. 哪里有日语50音图的发音啊?
  15. Feign实现RPC调用
  16. 计算机主板外频,笨鸟先飞 主板超频BIOS选项接触(图解)
  17. jdk版本特性一览(持续补充新版本)
  18. Unity的Windows游戏转Android平台的114514个坑
  19. 快速傅里叶变换的应用——快速卷积
  20. if(a)与if(a){ }

热门文章

  1. 教育部公布研考违规违法行为举报电话
  2. DODAB纳米脂质体囊泡/PANC-1细胞膜的PEG修饰的脂质体M-PEG-LIP的相关研究与制备
  3. c语言怎么输入一个字符串跳出循环,关于字符串:键入Quit退出C程序
  4. 高新技术企业认定指导
  5. 韩顺平主讲PHP从入门到精通掌握网站核心技术
  6. WineBottler:让苹果Mac OS照样用IE浏览器
  7. qt控制程序打开记事本_基于QT记事本源代码
  8. 【Bug】steam双方都是国区 礼物无法入库问题
  9. U盘插入电脑后,有提示音,但不能显示出来,如何解决?
  10. k8s搭建 rabbitmq集群