torch.nn. 和 torch.nn.function 中的函数区别
- 一般来说,在神经网络中,线性变换,卷积等操作需要保存参数,因此Linear,conv2d等一般需要使用torch.nn中的模块,并在_init_函数中提前新建;(torch.nn.function中的通常为单纯的函数,如果有参数需要自己维护)
- Relu等激活函数本身没有参数,因此可以在forward函数中直接使用;
-
那么F.conv2d和F.Linear有什么用呢?例如,在不同层参数共享时就需要用到:
Tensor 序列反转
-
为了实现双向LSTM, 因为pytorch原有的双向LSTM,当设置dropout>0时,不能保证实验的复现效果;
tensor维度操作
- torch.cat 对数据沿着某一维度进行拼接。cat后数据的总维数不变
- torch.stack 而stack会增加新的维度,如对两个1*2维的tensor在第0个维度上stack,则会变为2*1*2的tensor;在第1个维度上stack,则会变为1*2*2的tensor。
- transpose ,交换维度 例如x.transpose(0,1),交换x,y维度
- permute是更灵活的transpose,可以灵活的对原数据的维度进行调换,例如x_p = x.permute(1,0,2) # 将原来第1维变为0维
contiguous()
有些函数操作(例如view)依赖整块内存,因此,如果view之前使用了transpose和permute等操作,则需要在view之前执行contiguous(),但在0.4版本中,增加了torch.reshape()函数,相当于tensor.contiguous().view();