zoukankan      html  css  js  c++  java
  • 动手学深度学习_2.1_tensor

    数据操作

    1 import torch
    2 
    3 torch.manual_seed(0)
    4 torch.cuda.manual_seed(0)
    5 print(torch.__version__)  # 1.3.1

    创建tensor

    1 # 创建一个5x3的未初始化的tensor
    2 x = torch.empty(5, 3)
    3 print(x)
    4 
    5 # tensor([[1.3563e-19, 1.3563e-19, 7.9717e-10],
    6 #        [5.8270e-10, 5.8270e-10, 4.9153e-14],
    7 #        [1.3563e-19, 1.8578e-01, 3.9157e-02],
    8 #        [4.7429e+30, 2.2639e+35, 1.8971e+31],
    9 #        [1.4587e-19, 1.1703e-19, 1.5637e-01]])
    # 随机初始化的tensor
    x = torch.rand(5, 3)
    print(x)

    # tensor([[0.4963, 0.7682, 0.0885],
    #         [0.1320, 0.3074, 0.6341],
    #         [0.4901, 0.8964, 0.4556],
    #         [0.6323, 0.3489, 0.4017],
    #         [0.0223, 0.1689, 0.2939]])
    # 创建一个long型全0的tensor
    x = torch.zeros(5, 3, dtype=torch.long)
    print(x)
    # tensor([[0, 0, 0],
    #         [0, 0, 0],
    #         [0, 0, 0],
    #         [0, 0, 0],
    #         [0, 0, 0]])
    # 直接数据初始化
    x = torch.tensor([5.5, 3])
    print(x)

    # tensor([5.5000, 3.0000])
    # 通过现有的tensor来创建
    x = x.new_ones(5, 3, dtype=torch.float64) # 返回的tensor默认具有相同的torch.dtype和torch.device
    print(x)
    
    x = torch.randn_like(x, dtype=torch.float) # 指定新的数据类型
    print(x)

    # tensor([[1., 1., 1.],
    #         [1., 1., 1.],
    #         [1., 1., 1.],
    #         [1., 1., 1.],
    #         [1., 1., 1.]], dtype=torch.float64)
    # tensor([[ 0.6035,  0.8110, -0.0451],
    #         [ 0.8797,  1.0482, -0.0445],
    #         [-0.7229,  2.8663, -0.5655],
    #         [ 0.1604, -0.0254,  1.0739],
    #         [ 2.2628, -0.9175, -0.2251]])
    # 通过shape或size()来获取tensor形状
    print(x.size())
    print(x.shape)
    # torch.Size([5, 3])
    # torch.Size([5, 3])

    运算 

    # 加法1:
    y = torch.rand(5, 3)
    print(x + y)
    # 加法2:
    print(torch.add(x, y)) 
    # 指定输出
    result = torch.empty(5, 3)
    torch.add(x, y, out=result)
    print(result)
    # 加法3:inplace
    # adds x to y
    y.add_(x)
    print(y)

    索引

    attension:索引出来的结果与原数据共享内存,即修改一个,另一个也被修改了

    y = x[0, :] # 矩阵x的第一行
    y += 1
    print(y)
    print(x[0, :]) # 原tensor也被修改了
    # 改变形状 view()
    y = x.view(15)
    z = x.view(-1, 5)
    print(x.size(), y.size(), z.size())

    attension: view()返回的新tensor与原tensor共享内存

    # 若不想共享内存,先用clone创造一个副本,再用view
    x_cp = x.clone().view(15)
    x -= 1
    print(x)
    print(x_cp)
    # item()函数将一个标量tensor转换为一个Python number
    x = torch.randn(1)
    print(x)
    print(x.item())

    广播机制

    # 两个不同形状tensor可能会引起广播机制
    x = torch.arange(1, 3).view(1, 2)
    print(x)
    y = torch.arange(1, 4).view(3, 1)
    print(y)
    print(x + y)

    tensor和NumPy相互转换

     numpy()和from_numpy()产生的tensor和NumPy array实际使用的相同的内存

    # tensor --> numpy
    a = torch.ones(5)
    b = a.numpy()
    print(a, b)
    
    a += 1
    print(a, b)
    b += 1
    print(a, b)
    # 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)
    # 直接用torch.tensor()将NumPy数组转换成tensor,该方法是将数据拷贝,返回的tensor和原来的数据不再共享内存
    # 用torch.tensor()转换时不会共享内存
    c = torch.tensor(a)
    a += 1
    print(a, c)

    测试是否是GPU版的Pytorch

    # 只会在GPU版本运行
    if torch.cuda.is_available():
        device = torch.device("cuda")   # GPU
        y = torch.ones_like(x, device=device)  # 创建一个在GPU上的tensor
        x = x.to(device)    # 等价与x.to("cuda")
        z = x + y
        print(z)
        print(z.to("cpu", torch.double))
  • 相关阅读:
    [帮助文档] [SageMath Thematic Tutorial] Chapter 10 使用Sagemath进行数值计算
    [转]dd命令、cp命令详解+dd命令、cp命令对比 delong
    MBR内容解析
    记一个编译错误:命名冲突、宏定义、头文件包含顺序
    防止STL容器迭代器失效
    日历时间
    观点
    编码规范
    《转》impress.js页面PPT
    <转>Spring Test 整合 JUnit 4 使用总结
  • 原文地址:https://www.cnblogs.com/harbin-ho/p/11961947.html
Copyright © 2011-2022 走看看