这里面inplace的意思是将计算得到的值直接覆盖前面的值。
官网nn.ReLU介绍
类似于下面
# inplace False
y = x+1
x = x
#inplace True
x = x + 1
其中nn.ReLU作为一个层结构,必须添加到nn.Module容器中才能使用,而F.ReLU则作为一个函数调用,看上去作为一个函数调用更方便更简洁。具体使用哪种方式,取决于编程风格。在PyTorch中,nn.X都有对应的函数版本F.X,但是并不是所有的F.X均可以用于forward或其它代码段中,因为当网络模型训练完毕时,在存储model时,在forward中的F.X函数中的参数是无法保存的。也就是说,在forward中,使用的F.X函数一般均没有状态参数,比如F.ReLU,F.avg_pool2d等,均没有参数,它们可以用在任何代码片段中。
nn.ReLu里面其实就是调用了F.ReLU
class ReLU(Module):
r"""Applies the rectified linear unit function element-wise:
:math:`\text{ReLU}(x)= \max(0, x)`
Args:
inplace: can optionally do the operation in-place. Default: ``False``
Shape:
- Input: :math:`(N, *)` where `*` means, any number of additional
dimensions
- Output: :math:`(N, *)`, same shape as the input
.. image:: scripts/activation_images/ReLU.png
Examples::
>>> m = nn.ReLU()
>>> input = torch.randn(2)
>>> output = m(input)
An implementation of CReLU - https://arxiv.org/abs/1603.05201
>>> m = nn.ReLU()
>>> input = torch.randn(2).unsqueeze(0)
>>> output = torch.cat((m(input),m(-input)))
"""
__constants__ = ['inplace']
def __init__(self, inplace=False):
super(ReLU, self).__init__()
self.inplace = inplace
@weak_script_method
def forward(self, input):
# F 来自于 import nn.functional as F
return F.relu(input, inplace=self.inplace)
def extra_repr(self):
inplace_str = 'inplace' if self.inplace else ''
return inplace_str
这两个都可以对tensor做维度转换
区别:transpose只能在两个维度之间转换, permute可以一下转换好几个维度
多个transpose转换就相当于permute
该函数功能是把原来的tensor放到一个连续的空间,也就是一个在内存中连续存储的张量
放在transpose,permute之后,view之前。
测试过transpose之后直接view,报错
可能是view必须作用于内存连续的张量。
PS: reshape ≈ \approx ≈ tensor.contiguous().view