PyTorch 中的“inplace=True”激活是否仅对推理模式有意义?

spi*_*tor 8 python activation-function pytorch

根据PyTorch论坛的讨论:

\n\n

的目的是就地inplace=True修改输入,而不用此操作的结果为附加张量分配内存。

\n

这允许更有效地使用内存,但禁止进行向后传递的可能性,至少在操作减少信息量的情况下是如此。并且反向传播算法需要保存中间激活才能更新权重。

\n

是否可以说,只有在模型已经训练好并且不想再修改它的情况下才应该分层启用此模式?

\n

yak*_*hyo 10

nn.ReLU(inplace=True)在训练测试期间节省内存。

然而,我们在nn.ReLU(iplace=True)计算梯度时使用时可能会遇到一些问题。有时,计算梯度时需要原始值。因为inplace破坏了一些原始值,所以有些用法可能会出现问题:

def forward(self, x):
    skip = x
    x = self.relu(x)
    x += skip # inplace addition
    # Error!
Run Code Online (Sandbox Code Playgroud)

上述两个连续inplace操作将会产生错误。

但是,可以使用加法,然后使用激活函数inplace=True

def forward(self, x):
    skip = x
    x += skip # inplace addition
    x = self.relu(x)
    # No error!
Run Code Online (Sandbox Code Playgroud)