• 动手学深度学习第二版——Day1(章节1——2.2)


    动手学深度学习第二版——Day1(章节1——2.2)

    1、简单介绍

    1)、整体内容

    • 深度学习基础——线性神经网络,多层感知机
    • 卷积神经网络——LeNet,AlexNet,VGG,Inception,ResNet
    • 循环神经网络——RNN。GRU,LSTM,seq2seq
    • 注意力机制——Attention, Transformer
    • 优化算法——SGD, Momentum, Adam
    • 高性能计算——并行,多GPU,分布式
    • 计算机视觉——目标检测,语义分割
    • 自然语言处理——词嵌入,BERT

    2)、深度学习介绍

    应用:

    • 图片分类
    • 物体检测和分割
    • 样式迁移(滤镜)
    • 人脸合成
    • 文字生成图片
    • 文字生成
    • 无人驾驶
    • 案例研究——广告点击

    2、预备知识(2.1-2.2)

    1)数据操作

    • N维数组样例

    image-20211029194838287

    image-20211029195009440

    • 创建数组

      • 形状:比如:3*4
      • 每个元素的数据类型
      • 每个元素的值
    • 访问元素

    下图第三个erro,应该是[:,1]

    [1:3, 1:] 第一行到第三行,左开右闭

    [::3, ::2] 全部元素,但是行每隔三个访问,列每隔俩个元素访问,比如首先访问了[1,1]->[1,2]->[3,1]->[3,2]

    image-20211029195148892

    2)动手实践

    1⃣️数据操作

    import torch
    
    # 张量(创建张量,也就用到了下面代码中的torch.tensor()):表示由一个数值组成的数组,一个轴的张量叫向量,二个轴的叫矩阵
    x = torch.arange(12)  # torch.arange()创建一个行向量
    print(x)
    print(x.shape)  # 可以使用shape属性来访问张量的形状和元素总数
    x.numel()  # 里面元素的种数,标量
    X = x.reshape(3, 4)  # 改变张量的形状,而不改变元素数量和元素值
    print(X.shape)
    print(torch.zeros((2, 3, 4)))  # 使用全0
    print(torch.ones((2, 3, 4)))  # 使用全1
    # 也可以提供包含数值的Python列表(or嵌套链接)来为所需张量中的每个元素赋予确定值
    print(torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]))
    
    x = torch.tensor([1.0, 2, 4, 8])
    y = torch.tensor([2, 2, 2, 2])
    print(x + y)
    print(x - y)
    print(x * y)
    print(x / y)
    print(x ** y)
    
    print(torch.exp(x))  # 为x的每个元素做e^x
    
    # 张量连结在一起 torch.cat
    X = torch.arange(12, dtype=torch.float32).reshape((3, 4))
    Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
    torch.cat((X, Y), dim=0)  # 第0维合并,行合并
    torch.cat((X, Y), dim=1)  # 第1维合并,列合并
    print(X == Y)  # 通过逻辑运算符构建二元张量
    print(X.sum())  # 求和
    
    # 即使形状不同,我们仍然可以通过调用 广播机制 来执行按元素操作(但维度必须是一样的)
    a = torch.arange(3).reshape((3, 1))  # 就是把低的变高,eg:(3, 1) -> (3, 2)
    b = torch.arange(2).reshape((1, 2))  # 这里就是把, eg:(1, 2) -> (3, 2),随后再相加
    print(a, b)
    print(a + b)
    
    # 元素访问,可用用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素
    print(X[-1], X[1:3])
    
    X[1, 2] = 9  # 行和列都是从0开始
    print(X)
    X[0:2, :] = 12  # 为多个元素赋值
    print(X)
    
    # 运行一些操作可能会导致为新结果分配内存
    before = id(Y)  # Y的id是在python中的一个标识号
    Y = Y + X  # 新的Y的id不等于以前的
    print(id(Y) == before)
    
    # 执行原地操作
    Z = torch.zeros_like(Y)  # Z和Y的shape和数据类型一样,但所有元素是0
    print("id(Z):", id(Z))
    Z[:] = X + Y
    print("id(Z):", id(Z))  # 俩次Z的id相同
    
    before = id(X)
    X += Y
    print(id(X) == before)  # True
    
    # 转换为NumPy张量
    A = X.numpy()
    B = torch.tensor(A)
    print(type(A), type(B))
    
    # 将大小唯一的张量转换为Python的标量
    a = torch.tensor([3.5])
    print(a, a.item(), float(a), int(a))
    

    2⃣️数据处理

    # 创建一个人工数据集, 并存储在csv(逗号分隔值)文件
    
    import os
    
    os.makedirs(os.path.join('..', 'data'), exist_ok=True)
    data_file = os.path.join('..', 'data', 'house_tiny.csv')
    with open(data_file, 'w') as f:
        f.write('NumRooms,Alley,Price
    ')
        f.write('NA,Pave,127500
    ')
        f.write('2,NA,106000
    ')
        f.write('4,NA,178100
    ')
        f.write('NA,NA,140000
    ')
    
    # 注意:在向文件里写入NA的时候要注意字符之间不可以使用空格,否则写入的是NA这个字符而不是NaNI类型的missing value
    

    3⃣️读取文件

    import pandas as pd
    import torch
    
    data = pd.read_csv('../data/house_tiny.csv')
    print(data)
    
    # 为了处理缺失的数据,典型的方法包括插值、删除
    inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
    inputs = inputs.fillna(inputs.mean())  # 将na(不是值)的地方填为均值
    print(inputs)
    
    # 对于inputs中的类别值和离散值,我们将"NA"视为一个类别
    inputs = pd.get_dummies(inputs, dummy_na=True)
    print(inputs)
    
    # 现在我们将inputs和outputs中的所有条目都是数值类型,它们可以转换为张量格式
    X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
    print(X, y)
    

    3、Qustion/Answer

    reshape和view的区别

    view只能作用在连续的张量上(张量中元素的内存地址是连续的)。而reshape连续或者非连续都可以。调用x.reshape时,如果x在内存中是连续的,那么x.reshape会返回一个view(原地修改,此时内存地址不变),否则就会返回一个新的张量(这时候内存地址就变了)。

    所以推荐,如果想要原地修改就直接view,否则就先clone()再修改

    image-20211029233558518

    这里的b,感觉就像是指针一样。

    快速区分维度

    a.shape

    tensor和array的区别

    tensor是一个张量,数学上确定的,多元数组

    array是计算机的概念,是一个数组,没有数学的定义

    参考:沐神B站视频

  • 相关阅读:
    使用JS实现图片轮播滚动跑马灯效果
    特殊字符和注释标签
    html常用标签总结
    html重点标签总结
    web常用开发工具
    标签分类和关系
    Web标准和骨架
    常用开浏览器内核
    常用浏览器介绍
    2019/08/20记
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/15484046.html
Copyright © 2020-2023  润新知