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()_不同的是,这个函数**拷贝**张量的数据。
```python
import torch
x = 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 torch
x = 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) #按行从小到大排序
sorted
tensor([[-0.9950, -0.6175, -0.1253, 1.3536],
[-1.1313, -0.4237, 0.1208, 0.9022],
[-1.1995, -0.4396, -0.0699, 0.8043]])
indices
tensor([[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]) ```