Pytorch 如何获取Unet的内部模块?

Pytorch 如何获取Unet的内部模块?,pytorch,Pytorch,我用创建了一个UNet。您可以找到结果结构 如何获取模块Conv2d(128256,内核大小=(4,4),跨步=(2,2),填充=(1,1)) 如何获取模块(5):ConvTranspose2d(256,64,内核大小=(4,4),步长=(2,2),填充=(1,1)) 我想让内部模块改变某些层的属性。 我尝试了类似于net.modules(I).modules(I)的方法,但不起作用。我查阅了文件,我还没有一个好主意去做 我最初的意图是在训练时更改某些层的属性。我可以添加一个自定义层myLaye

我用创建了一个
UNet
。您可以找到结果结构

  • 如何获取模块
    Conv2d(128256,内核大小=(4,4),跨步=(2,2),填充=(1,1))
  • 如何获取模块
    (5):ConvTranspose2d(256,64,内核大小=(4,4),步长=(2,2),填充=(1,1))
  • 我想让内部模块改变某些层的属性。 我尝试了类似于
    net.modules(I).modules(I)
    的方法,但不起作用。我查阅了文件,我还没有一个好主意去做


    我最初的意图是在训练时更改某些层的属性。我可以添加一个自定义层
    myLayer
    ,其中
    self.mode='normal'
    。在训练时,我希望我可以更改其属性myLayer.mode='capture',使其在训练中改变行为。

    nn.Module的所有子类都有一个名为children的属性。您可以使用下面的代码访问它

    unet = UnetGenerator(512,512,4)
    layers = list(unet.children())
    len(layers)
    
    对于使用上述代码创建的网络,我可以访问网络中的一个层,并更改如下属性

    l = layers[0]
    conv = list(l.children())[0][0]
    conv.kernel_size = (2,2)
    

    如果您在不使用任何预先训练的权重的情况下训练网络,则可以在创建网络对象之前在源代码中进行更改。

    要添加到毗湿奴的正确答案:

    如果要进行固定更改,最好在创建网络对象之前更改代码

    但是,关于
    pytorch
    需要提及的一件重要事情是,您可以动态更改属性:大多数深入学习库,如
    tensorflow
    出于性能原因使用静态图。这意味着网络图构建一次,并在每次向前传递时执行

    另一方面,
    pytorch
    使用动态计算图,这意味着对于每个向前传递,图都是动态构建的。这使您有机会根据一些不同的参数更改网络体系结构。 例如,如果您的损失低于某个值,或者您的历元是奇数,您可以减小内核大小(我并不暗示这些是合理的应用程序)。所有这些动态更改都应该发生在
    forward
    函数的实现中,您可以向该函数传递其他参数,例如:

    类MyNet(nn.Module):
    定义初始化(输入nc、输出nc):
    super()。\uuuu init\uuuuu()
    #定义图层
    # ...
    self.choice\u A=nn.Conv2d(输入\u nc、输出\u nc、内核\u size=3)
    self.choice\u B=nn.Conv2d(输入\u nc,输出\u nc,内核大小=4)
    #继续初始化
    def前进(自身、x、历元):
    #开始向前传球
    # ...
    如果历元%2==0:
    x=自我选择A(x)
    其他:
    x=自我选择(x)
    # ...
    返回x
    
    您能分享一下您用来创建UNet的代码吗。@McLawrence我还是不太明白,您到底想做什么。是否要修改某些图层中的某些参数?你能试着编辑你的问题并详细说明一下吗。@McLawrence我已经详细说明了它并改进了格式。如果你对其中一个答案感到满意,那么最好将该答案标记为正确,这样这个问题就不会再没有被接受的答案了。还有一个问题:因为频道在convsed2d。前半个通道是从瓶颈接收数据还是从后半个通道接收数据?谢谢您的回复。我想知道哪一半通道接受跳过连接的数据,似乎是前一部分?相关的行是:
    return torch.cat([self.model(x),x],1)
    。Cat按照您给定的顺序连接。因此,跳过连接的通道是后一个通道,因为x是您直接跳过到输出的输入。糟糕,现在看到您的评论已经晚了。我向该回购协议提出了一个请求,然而,所有者已将其合并。也许他犯了个错误。