只是想知道,为什么我在torch.nn?nn中找不到subj。顺序是非常方便的,它允许在一个地方定义网络,清晰和直观,但限于非常简单的!与并行模拟(和“身份”节点的残余连接的一点帮助),它形成了一个完整的方法来构建任何前馈网络组合方式。我错过了什么吗?
torch.nn
zbdgwd5y1#
嗯,也许它不应该在标准模块集合中,只是因为它的定义非常简单:
class ParallelModule(nn.Sequential): def __init__(self, *args): super(ParallelModule, self).__init__( *args ) def forward(self, input): output = [] for module in self: output.append( module(input) ) return torch.cat( output, dim=1 )
从“顺序”继承“并行”在意识形态上是不好的,但效果很好。现在我们可以用下面的代码定义如图所示的网络:
class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.net = nn.Sequential( nn.Conv2d( 1, 32, 3, padding=1 ), nn.ReLU(), nn.Conv2d( 32, 64, 3, padding=1 ), nn.ReLU(), nn.MaxPool2d( 3, stride=2 ), nn.Dropout2d( 0.25 ), ParallelModule( nn.Conv2d( 64, 64, 1 ), nn.Sequential( nn.Conv2d( 64, 64, 1 ), nn.ReLU(), ParallelModule( nn.Conv2d( 64, 32, (3,1), padding=(1,0) ), nn.Conv2d( 64, 32, (1,3), padding=(0,1) ), ), ), nn.Sequential( nn.Conv2d( 64, 64, 1 ), nn.ReLU(), nn.Conv2d( 64, 64, 3, padding=1 ), nn.ReLU(), ParallelModule( nn.Conv2d( 64, 32, (3,1), padding=(1,0) ), nn.Conv2d( 64, 32, (1,3), padding=(0,1) ), ), ), nn.Sequential( #PrinterModule(), nn.AvgPool2d( 3, stride=1, padding=1 ), nn.Conv2d( 64, 64, 1 ), ), ), nn.ReLU(), nn.Conv2d( 256, 64, 1 ), nn.ReLU(), nn.Conv2d( 64, 128, 3, padding=1 ), nn.ReLU(), nn.MaxPool2d( 3, stride=2 ), nn.Dropout2d( 0.5 ), nn.Flatten(), nn.Linear( 4608, 128 ), nn.ReLU(), nn.Linear( 128, 10 ), nn.LogSoftmax( dim=1 ), ) def forward(self, x): return self.net.forward( x )
wgx48brx2#
很抱歉回复了一个老问题。找到了this github线程,看起来他们近期不会添加nn.Parallel。如果你感兴趣,我为此做了一个tiny pip-installable library,里面有一小部分类似于functool的图层(Map,Filter,Reduce)。希望这对你有帮助!
2条答案
按热度按时间zbdgwd5y1#
嗯,也许它不应该在标准模块集合中,只是因为它的定义非常简单:
从“顺序”继承“并行”在意识形态上是不好的,但效果很好。现在我们可以用下面的代码定义如图所示的网络:
wgx48brx2#
很抱歉回复了一个老问题。找到了this github线程,看起来他们近期不会添加nn.Parallel。如果你感兴趣,我为此做了一个tiny pip-installable library,里面有一小部分类似于functool的图层(Map,Filter,Reduce)。希望这对你有帮助!