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是您直接跳过到输出的输入。糟糕,现在看到您的评论已经晚了。我向该回购协议提出了一个请求,然而,所有者已将其合并。也许他犯了个错误。