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]])

  1. <a name="XPBsI"></a>
  2. ### repeat
  3. 沿着特定的维度重复这个张量,和_expand()_不同的是,这个函数**拷贝**张量的数据。
  4. ```python
  5. import torch
  6. x = torch.tensor([1, 2, 3])
  7. x.repeat(3, 2)
  8. tensor([[1, 2, 3, 1, 2, 3],
  9. [1, 2, 3, 1, 2, 3],
  10. [1, 2, 3, 1, 2, 3]])

sort

函数原型:torch.sort(input, dim=None, descending=False, out=None) -> (Tensor, LongTensor)

  1. import torch
  2. x = torch.randn(3,4)
  3. x #初始值,始终不变
  4. tensor([[-0.9950, -0.6175, -0.1253, 1.3536],
  5. [ 0.1208, -0.4237, -1.1313, 0.9022],
  6. [-1.1995, -0.0699, -0.4396, 0.8043]])
  7. sorted, indices = torch.sort(x) #按行从小到大排序
  8. sorted
  9. tensor([[-0.9950, -0.6175, -0.1253, 1.3536],
  10. [-1.1313, -0.4237, 0.1208, 0.9022],
  11. [-1.1995, -0.4396, -0.0699, 0.8043]])
  12. indices
  13. tensor([[0, 1, 2, 3],
  14. [2, 1, 0, 3],
  15. [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 而导致梯度消失。 ```python

    import 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]) ```