Encoder代码为:

  1. class Encoder(nn.Module): #输入图片的大小isize、噪声的维度nz=、输入图片的通道nc=、ndf=、
  2. def __init__(self,isize,nz,nc,ndf,ngpu,n_exter_layers=,add_final_conv=True):
  3. super(Encoder,self).__init__()
  4. self.ngpu=ngpu
  5. # 必须为16倍数
  6. assert isize % ==,"isize has to be a multiple of 16"
  7.  
  8. main=nn.Sequential()
  9. # 图片的高宽缩小一倍
  10. main.add_module('initial-conv-{0}-{1}'.format(nc,ndf),nn.Conv2d(nc,ndf,,,,bias=False))
  11. main.add_module('initial-relu-{0}'.format(ndf),nn.LeakyReLU(0.2,inplace=True))
  12. csize,cndf=isize/,ndf
  13.  
  14. for t in range(n_exter_layers): #在这里面特征宽高不变,通道数也不变
  15. main.add_module('extra-layers-{0}-{1}-conv'.format(t,cndf),nn.Conv2d(cndf,cndf,,,,bias=False))
  16. main.add_module('extra-layers-{0}-{1}-batchnorm'.format(t,cndf),nn.BatchNorm2d(cndf))
  17. main.add_module('extra-layers-{0}-{1}-relu'.format(t,cndf),nn.LeakyReLU(0.2,inplace=True))
  18.  
  19. # 在特征高宽仍大于4时,就添加缩小一倍高宽,通道增加一倍的卷积块
  20. while csize>:
  21. in_feat = cndf
  22.  
  23. out_feat = cndf *
  24.  
  25. main.add_module('pyramid-{0}-{1}-conv'.format(in_feat, out_feat),nn.Conv2d(in_feat, out_feat, , , , bias=False))
  26.  
  27. main.add_module('pyramid-{0}-batchnorm'.format(out_feat),nn.BatchNorm2d(out_feat))
  28.  
  29. main.add_module('pyramid-{0}-relu'.format(out_feat),nn.LeakyReLU(0.2, inplace=True))
  30.  
  31. cndf = cndf *
  32.  
  33. csize = csize /
  34.  
  35. # 最后一层卷积,将4*4变为1*,得到nz = 100的噪声
  36. if add_final_conv:
  37.  
  38. main.add_module('final-{0}-{1}-conv'.format(cndf, ),nn.Conv2d(cndf, nz, , , , bias=False))
  39. self.main=main
  40.  
  41. def forward(self,input):
  42. if self.ngpu>:
  43. output=nn.parallel.data_parallel(self.main,input,range(self.ngpu)) #在多个gpu上运行模型,并行计算
  44. else:
  45. output=self.main(input)
  46.  
  47. return output #如果输入的大小是3××,最后的输出是100××.

判别器为:

  1. #定义判别器D (编码器)
  2. class NetD(nn.Module):
  3. def __init__(self, opt):
  4. super(NetD, self).__init__()
  5.  
  6. # 第二个参数是1 因为判别器最后输出一个数
  7. # 不过编码器在生成器里的时候
  8. # 这个参数是100 因为它要把图片下采样成100××1的向量
  9. model = Encoder(opt.isize, , opt.nc, opt.ndf, opt.ngpu, opt.extralayers)
  10.  
  11. layers = list(model.main.children())
  12.  
  13. '''layers的输出如下:
  14. [
  15. Conv2d(, , kernel_size=(, ), stride=(, ), padding=(, ), bias=False),
  16.  
  17. LeakyReLU(negative_slope=0.2, inplace),
  18.  
  19. Conv2d(, , kernel_size=(, ), stride=(, ), padding=(, ), bias=False),
  20.  
  21. BatchNorm2d(, eps=1e-, momentum=0.1, affine=True, track_running_stats=True),
  22.  
  23. LeakyReLU(negative_slope=0.2, inplace),
  24.  
  25. Conv2d(, , kernel_size=(, ), stride=(, ), padding=(, ), bias=False),
  26.  
  27. BatchNorm2d(, eps=1e-, momentum=0.1, affine=True, track_running_stats=True),
  28.  
  29. LeakyReLU(negative_slope=0.2, inplace),
  30.  
  31. Conv2d(, , kernel_size=(, ), stride=(, ), bias=False)] 因为132行定义的nz参数是1,所以经过这层之后输出的大小是1××
  32. '''
  33.  
  34. self.features = nn.Sequential(*layers[:-])
  35. # self.features的内容为除了最后一层的前8层
    # nn.Sequential函数里面的参数一定是Module的子类,而list不是一个模块子类,所以不能当做参数
  36. # 当然model.children()也一样不是一个模块子类,只有他们里面的值才是
    # 这里的*就起了作用,将list或者children的内容迭代地一个一个的传进去。
  37.  
  38. #生成一个分类器模块
  39. self.classifier = nn.Sequential(layers[-])
  40. #self.classifier的内容为Conv2d(, , kernel_size=(, ), stride=(, ), bias=False)最后一层
  41. #并在后面添加子模块sigmoid
  42. self.classifier.add_module('Sigmoid', nn.Sigmoid())
  43.  
  44. def forward(self, x):
  45.  
  46. features = self.features(x) #图片通过前8层之后的结果256××,前提是输入的图片的大小是32
  47.  
  48. features = features
  49.  
  50. classifier = self.classifier(features)#此时的结果是1××,值在[,],因为经过了sigmoid
  51.  
  52. classifier = classifier.view(-, ).squeeze()
  53. #a=torch.ones([,,]) 即a=tensor([[[ .]]]) 再a.view(-,) 变成tensor([[ .]]) 再加一个squeeze就是
  54. # a.view(-,).squeeze() 结果是tensor([ .]),squeeze里的值是0是1随意,只要去掉一个维度上的就可以
  55.  
  56. # 因此返回得到一个判别值classifier 和一个大小为256××4的特征值
  57. return classifier, features

重点在:

  • layers = list(model.main.children())
  • self.features = nn.Sequential(*layers[:-1]) :使用除了最后一层的前面所有层
  • self.classifier = nn.Sequential(layers[-1]):仅使用最后一层

这里可见同样的模型结构我们在Encoder.py中已经定义过一遍了,在判别其中实在不想再定义一遍,那我们就能够使用model.main.children()来获得模块中的子模块,然后将其转成列表形式,然后就能够根据想要的部分来进行处理了

pytorch怎么使用定义好的模型的一部分的更多相关文章

  1. 详解Pytorch中的网络构造,模型save和load,.pth权重文件解析

    转载:https://zhuanlan.zhihu.com/p/53927068 https://blog.csdn.net/wangdongwei0/article/details/88956527 ...

  2. pytorch入门2.2构建回归模型初体验(开始训练)

    pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...

  3. pytorch入门2.1构建回归模型初体验(模型构建)

    pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...

  4. pytorch入门2.0构建回归模型初体验(数据生成)

    pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...

  5. 【小白学PyTorch】18 TF2构建自定义模型

    [机器学习炼丹术]的炼丹总群已经快满了,要加入的快联系炼丹兄WX:cyx645016617 参考目录: 目录 1 创建自定义网络层 2 创建一个完整的CNN 2.1 keras.Model vs ke ...

  6. 1、pytorch写的第一个Linear模型(原始版,不调用nn.Modules模块)

    参考: https://github.com/Iallen520/lhy_DL_Hw/blob/master/PyTorch_Introduction.ipynb 模拟一个回归模型,y = X * w ...

  7. 重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

    作者: OAM 项目负责人 导读:2019 年 10 月 17 日,阿里巴巴合伙人.阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Op ...

  8. 开放应用模型(OAM):全球首个云原生应用标准定义与架构模型

    Kubernetes 项目作为容器编排领域的事实标准, 成功推动了诸如阿里云 Kubernetes (ACK)等云原生服务的迅速增长.但同时我们也关注到,Kubernetes 的核心 API 资源比如 ...

  9. [Pytorch]基于混和精度的模型加速

    这篇博客是在pytorch中基于apex使用混合精度加速的一个偏工程的描述,原理层面的解释并不是这篇博客的目的,不过在参考部分提供了非常有价值的资料,可以进一步研究. 一个关键原则:“仅仅在权重更新的 ...

随机推荐

  1. 安装k8s,使用root帐号的初始化脚本

    现在稳定性差不多了.可以总结一下了. 真正使用时,有几个地方,还是确认一下,再正式运行吧. #!/bin/bash # Version V0. ---: ;fi K8S_VERSION="1 ...

  2. bcb中TParamter传NULL值

    if (status_Desc.IsEmpty()) Queue_Status->Value = Null(); else Queue_Status->Value = status_Des ...

  3. javaWeb的HttpServletRequest和HttpServletResponse

    HttpServletRequest HttpServletRequest对象是封装了用户的请求信息,包括请求参数去,请求头等信息,service()f方法中的两个HttpServletRequest ...

  4. P1559 运动员最佳匹配问题[最大费用最大流]

    题目描述 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势 ...

  5. vscode——设置自动保存

    前言 懒就一个字 步骤 打开设置第一项就是,选择焦点改变自动保存即可

  6. 十七.protobuf在rpc中的使用

    关于protobuf在rpc中的使用,设计到gRPC,相关内容待续....

  7. IntelliJ IDEA12的解决占用C盘C:\Users\Administrator

    在安装完IntelliJ IDEA之后,默认会在windows的系统盘用户文件夹中创建配置等文件.在我只有32G的SSD盘中,怎么能让它如此,不爽呀..占用到现在都快1G了.好吧.今天把她解决了. 找 ...

  8. Hadoop 格式化namenode时报错警告:WARN common.Util: Path /data/dfs/name should be specified as a URI in configuration

    格式化namenode时报错警告:WARN common.Util: Path /data/dfs/name should be specified as a URI in configuration ...

  9. WSAStartup() - 使用方法

    当一个应用程序调用WSAStartup函数时, 操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中. 以后应用程序就可以调用所请求的Socket库 ...

  10. D. Vasya and Triangle(思维, 三角形)

    传送门 题意: 给你 n, m, k, 问你是否存在一个三角形, 满足三角形的面积等于 n * m / k: 若存在, 输出YES, 且输出满足条件的三角形的三个坐标(答案有多种,则输出任意一种)   ...