Tensor相关操作
- tensor转ndarray:
常用函数
expand
返回当前张量在某维扩展更大后的张量。扩展(expand)张量不会分配新的内存,只是在存在的张量上创建一个新的视图(view),一个大小(size)等于1的维度扩展到更大的尺寸。 ```python import torch 
x = torch.tensor([1, 2, 3]) x.expand(2, 3) tensor([[1, 2, 3], [1, 2, 3]])
<a name="XPBsI"></a>### repeat沿着特定的维度重复这个张量,和_expand()_不同的是,这个函数**拷贝**张量的数据。```pythonimport torchx = torch.tensor([1, 2, 3])x.repeat(3, 2)tensor([[1, 2, 3, 1, 2, 3],[1, 2, 3, 1, 2, 3],[1, 2, 3, 1, 2, 3]])sort
函数原型:
torch.sort(input, dim=None, descending=False, out=None) -> (Tensor, LongTensor)
import torchx = torch.randn(3,4)x #初始值,始终不变tensor([[-0.9950, -0.6175, -0.1253, 1.3536],[ 0.1208, -0.4237, -1.1313, 0.9022],[-1.1995, -0.0699, -0.4396, 0.8043]])sorted, indices = torch.sort(x) #按行从小到大排序sortedtensor([[-0.9950, -0.6175, -0.1253, 1.3536],[-1.1313, -0.4237, 0.1208, 0.9022],[-1.1995, -0.4396, -0.0699, 0.8043]])indicestensor([[0, 1, 2, 3],[2, 1, 0, 3],[0, 2, 1, 3]])veiw v.s. reshape
其实从功能上看,两个函数的功能基本上是完全一致的,都是把一个tensor的shape给进行改变,改变的规则事实上也是一样的。
view的存在比reshape要早一些,但是reshape也是从很古早的版本就存在了。
大多数的时候,二者是没有区别的,但是有如下几个细微差距:
- view一定返回的是tensor的一个视图,也就是说返回值和原来的tensor是共享内存的。而reshape大多数情况,能够返回视图,就会返回视图,但是在某些情况下,确实可能返回一个copy
 - view必须作用在内存空间连续的tensor上面,但是reshape没有这个限制。不过在一般的神经网络前向传递的过程中,应该不会出现内存不连续的情况吧。
网络(nn)
常用模块
nn.Dropout(p)
这个模块是按照一定概率将神经元失活(置零)。并不是说会一定保留一定比例的神经元,而是根据伯努利分布(二项分布),将每个神经元按照概率失活。
这个模块只在训练的时候起作用以降低过拟合。
在失活的同时,会对神经元的值进行改变value = value/(1-p)以保证不会因为 dropout 而导致梯度消失。 ```pythonimport torch.nn as nn import torch
 
a = torch.ones((10)) dropOut = torch.nn.Dropout(0.7) print(dropOut(a)) tensor([0.0000, 3.3333, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 3.3333]) ```
