【问题标题】:Pytorch What's the difference between define layer in __init__() and directly use in forward()?Pytorch 在 __init__() 中定义层和在 forward() 中直接使用有什么区别?
【发布时间】:2018-10-26 20:06:09
【问题描述】:

__init__()函数中定义层的方法,稍后在forward中调用层的方法和forward()函数中直接使用层的方法有什么区别?
在编写计算图之前,是否应该在构造函数中定义计算图中的每一层(例如__init__)?
我可以直接在forward() 中定义和使用它们吗?

【问题讨论】:

标签: python neural-network conv-neural-network pytorch


【解决方案1】:

所有包含您想要在训练过程中训练的权重的东西都应该在您的__init__ 方法中定义。

您不需要在__init__ 中定义softmaxReLUsigmoid 之类的激活函数,只需在forward 中调用它们即可。

例如 Dropout 层也不需要在 __init__ 中定义,它们也可以在 forward 中调用。 [但是在您的 __init__ 中定义它们的优点是在评估期间可以更轻松地关闭它们(通过在您的模型上调用 eval()。您可以查看两个版本的示例here

希望这很清楚。如果您有任何其他问题,请直接询问。

【讨论】:

  • 这意味着如果一个层有可训练的参数,我应该把它放到__init__函数中吗?我注意到 softmax、relu 和 sigmoid 没有任何可训练的参数,所以我得到了这个问题。
  • 是的,您需要在 __init__ 中使用可训练参数初始化所有内容 - 对于 softmax、relu 或 sigmoid 等激活,情况并非如此。
  • 谢谢,真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
相关资源
最近更新 更多