torch学习笔记

tensor加减之间的内存管理

  • 索引操作不会开辟新的内存,而进行y=x+y之类操作会重新开辟内存,将y指向新的内存

    # 利用python的id函数进行测试
    x = torch.tensor([1, 2])
    y = torch.tensor([3, 4])
    id_before = id(y)
    y = y + x
    print(id(y) == id_before) # False 
    
    # 输出结果
    False
  • 如果想指定结果到原来的y的内存,我们可以使用前面介绍的索引来进行替换操作

    # 利用python的id函数进行测试
    x = torch.tensor([1, 2])
    y = torch.tensor([3, 4])
    id_before = id(y)
    y[:] = y + x
    print(id(y) == id_before) # True
    
    # 输出结果
    True
  • 还可以利用torch.add_()、add(x,y,out=y)等实现上述效果

tensor与numpy转换

  • tensor转numpy

    # 使用numpy()将Tensor转换成NumPy数组
    a = torch.ones(5)
    b = a.numpy()
    print(a, b)
    
    a += 1
    print(a, b)
    b += 1
    print(a, b)
    
    # 输出结果
    tensor([1., 1., 1., 1., 1.]) [1. 1. 1. 1. 1.]
    tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]
    tensor([3., 3., 3., 3., 3.]) [3. 3. 3. 3. 3.]
  • numpy转tensor

    # 使用from_numpy()将NumPy数组转换成Tensor
    import numpy as np
    a = np.ones(5)
    b = torch.from_numpy(a)
    print(a, b)
    
    a += 1
    print(a, b)
    b += 1
    print(a, b)
    
    # 输出结果
    [1. 1. 1. 1. 1.] tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
    [2. 2. 2. 2. 2.] tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
    [3. 3. 3. 3. 3.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)
  • 所有在CPU上的Tensor(除了CharTensor)都支持与NumPy数组相互转换
  • 此外上面提到还有一个常用的方法就是直接用torch.tensor()将NumPy数组转换成Tensor,需要注意的是该方法总是会进行数据拷贝,返回的Tensor和原来的数据不再共享内存。

    c = torch.tensor(a)
    a += 1
    print(a, c)
    
    # 输出结果
    [4. 4. 4. 4. 4.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)
最后修改:2021 年 11 月 21 日
如果觉得我的文章对你有用,请随意赞赏