【问题标题】:Extending PyTorch nn.Sequential class扩展 PyTorch nn.Sequential 类
【发布时间】:2020-10-07 20:32:37
【问题描述】:

我对 Python 中的 OOP 还很陌生,而且总体上很生疏。我想扩展 PyTorch 的 'nn.Sequential' 对象,使其传递一个包含每层中节点数的元组,根据这些节点自动生成一个OrderedDict。对于一个功能示例:

layers = (784, 392, 196, 98, 10)
n_layers = len(layers)
modules = OrderedDict()

# Layer definitions for inner layers:
for i in range(n_layers - 2):
    modules[f'fc{i}']   = nn.Linear(layers[i], layers[i+1])
    modules[f'relu{i}'] = nn.ReLU()

# Definition for output layer:
modules['fc_out'] = nn.Linear(layers[-2], layers[-1])
modules['smax_out'] = nn.LogSoftmax(dim=1)

# Define model and check attributes:
model = nn.Sequential(modules)

因此,我希望我的班级在初始化 nn.Sequential 时不传递“OrderedDict”对象,而是采用元组。

class Network(nn.Sequential):
   def__init__(self, n_nodes):
      super().__init__()

      **** INSERT LOGIC FROM LAST SNIPPET ***

所以这似乎行不通,因为当我的Network 类调用super().__init__() 时,它会想要查看层激活字典。我如何编写自己的网络以绕过这个问题,但仍然具有 PyTorche 的顺序对象的所有功能?

我的想法是这样的:

class Network(nn.Sequential):
    def __init__(self, layers):
        super().__init__(self.init_modules(layers))


    def init_modules(self, layers):
        n_layers = len(layers)
        modules = OrderedDict()

        # Layer definitions for inner layers:
        for i in range(n_layers - 2):
            modules[f'fc{i}']   = nn.Linear(layers[i], layers[i+1])
            modules[f'relu{i}'] = nn.ReLU()

        # Definition for output layer:
        modules['fc_out'] = nn.Linear(layers[-2], layers[-1])
        modules['smax_out'] = nn.LogSoftmax(dim=1)

        return modules

我不确定这种事情在 Python 中是否允许和/或良好做法。

【问题讨论】:

    标签: python oop neural-network pytorch


    【解决方案1】:

    你的实现是允许的并且很好。

    而且,您还可以初始化super().__init__() 空置,然后在循环中使用self.add_module(key, module) 附加LinearRelu 或随后的其他任何内容。这样__init__函数就可以覆盖init_modules的工作。

    【讨论】:

      猜你喜欢
      • 2019-05-25
      • 1970-01-01
      • 2022-11-26
      • 2021-01-12
      • 2017-11-01
      • 2019-10-19
      • 2019-03-12
      • 2020-12-20
      • 2021-05-11
      相关资源
      最近更新 更多