• 动手学深度学习——数据操作笔记


    1. 张量概念

     张量本质上是一个n维数组,它在numpy中为ndarray,  在pytorch中称为tensor , 两者的区别在于:

    • numpy仅支持CPU计算
    • tensor能支持GPU运算,并且支持自动微分,更适合深度学习

    2. 张量的访问

    一个二维矩阵a,可以使用切片的方式灵活访问:

    • 访问指定元素:a [1,2]
    • 访问一整行元素:a [1,:]
    • 访问一整列元素:a[:,1]
    • 访问1到3行之间、第1列以后的矩形区域:a[1:3, 1:],切片统一是左闭右开
    • 跳跃访问:a[::3, ::2] 表示每3行取一行(0,3,6……)、每2列取一列(0,2,4……)的方式访问

    3. 张量的初始化

    • x = torch.arrange(12) : 初始化元素数量为12的一维张量(tensor), 元素值分别为从0开始的前12个整数。
    • x.shape:张量的形状,即张量的维度信息,例如:1维12列。
    • x.numel:元素数量,类似于数组的len函数。
    • y = x.reshape(3,4): 修改张量的形状为3行4列,元素数量及值不变,y只是x的一个view。
    • torch.zeros((2,3,4)) 和torch.ones((2,3,4)),torch.randn(2,3,4): 创建指定形状的张量,并初始化为全0或全1或全随机数。
    • torch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) : 创建一个张量并为每个元素赋确定值。

    4. 运算

    标准运算:直接使用算术运算符+、-、*、/对具有相同形状的张量进行操作,它将对每个位置的元素分别使用运算符进行操作。

    1. x = torch.tensor([1.0, 2, 4, 8])
    2. y = torch.tensor([2, 2, 2, 2])
    3. x + y, x - y, x * y, x / y, x ** y # **运算符是求幂运算
    4. # 输出
    5. (tensor([ 3., 4., 6., 10.]),
    6. tensor([-1., 0., 2., 6.]),
    7. tensor([ 2., 4., 8., 16.]),
    8. tensor([0.5000, 1.0000, 2.0000, 4.0000]),
    9. tensor([ 1., 4., 16., 64.]))

    求冥运算:

    1. torch.exp(x)
    2. # 输出
    3. tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

     多个张量连接:

    1. # dtype可以指定初始元素值的类型为float,而不是默认的整数。
    2. X = torch.arange(12, dtype=torch.float32).reshape((3,4))
    3. Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
    4. # X
    5. (tensor([[ 0., 1., 2., 3.],
    6. [ 4., 5., 6., 7.],
    7. [ 8., 9., 10., 11.]]),
    8. # Y
    9. (tensor([[ 2., 1., 4., 3.],
    10. [ 1., 2., 3., 4.],
    11. [ 4., 3., 2., 1.]]),
    12. # dim=0表示按照第1维(即行)进行数据连接,将Y矩阵每一行连接到X矩阵每一行的后面,
    13. # dim=1则表示按照第二维(即列)进行数据列表
    14. torch.cat((X, Y), dim=0),
    15. # 输出
    16. tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.],
    17. [ 4., 5., 6., 7., 1., 2., 3., 4.],
    18. [ 8., 9., 10., 11., 4., 3., 2., 1.]]))

    等值判断:等于每个位置的元素分别进行等值判断

    1. X == Y
    2. # 输出
    3. tensor([[False, True, False, True],
    4. [False, False, False, False],
    5. [False, False, False, False]])

    求和:对张量中所有元素求和,产生一个单元素张量

    X.sum()

    5. 广播机制

    用于对形状不同的矩阵执行按元素操作,工作机制为:

    • 通过复制元素来扩展矩阵,以便两个张量具有相同的形状。
    • 对扩展后相同形状的矩阵执行上述操作。

    两个张量:a 为3行1列,b为1行2列

    1. a = torch.arange(3).reshape((3, 1))
    2. b = torch.arange(2).reshape((1, 2))
    3. a, b
    4. # 输出
    5. (tensor([[0],
    6. [1],
    7. [2]]),
    8. tensor([[0, 1]]))

    形状不同的张量进行算术运算时,会自动扩展为相同的形状后再进行运算。

    1. a + b
    2. tensor([[0, 1],
    3. [1, 2],
    4. [2, 3]])

    6. 切片赋值

    • 指定元素赋值
    X[1, 2] = 9
    • 多个元素赋相同的值
    1. # 矩阵前两行的每个元素都赋值12
    2. X[0:2, :] = 12 
    3. # 输出X
    4. tensor([[12., 12., 12., 12.],
    5. [12., 12., 12., 12.],
    6. [ 8., 9., 10., 11.]])

    7. 原地操作

      有些操作会引起新分配内存,例如:

    1. before = id(Y)
    2. # 这一步运算后,Y已经指向了另一个地址
    3. Y = Y + X
    4. id(Y) == before
    5. # 输出
    6. False

    这会带来的问题是:在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新。

     原地操作的方法:

    1. # 原地操作写法-1
    2. Y[:] = X + Y
    3. # 原地操作写法-2
    4. X += Y

    8. 张量与numpy的转换

    • A = X.numpy()     # 张量转换为numpy数组
    • B = torch.tensor(A)   # numpy数组转换为张量
    • a.item()           # 将只有一个元素的张量转换为普通的python变量
  • 相关阅读:
    PHP语言之正则表达式
    虚拟机Ubuntu扩展磁盘大小
    python爬取深交所各行业前三上市公司市值
    深度学习(PyTorch)——生成对抗网络(GAN)
    01背包学习笔记-二维dp数组问题
    Gartner:2022年全球IT支出将超4万亿美元,软件增速最高
    Spring源码中的命名风格总结
    并发工具类库使用的常见问题
    酒店管理系统
    go语言之内存对齐
  • 原文地址:https://blog.csdn.net/xiaojia1001/article/details/138105233