Pytorch学习

《动手学深度学习》(PyTorch版)

2.2 数据操作

在PyTorch中,torch.Tensor是存储和变换数据的主要工具。如果你之前用过NumPy,你会发现Tensor和NumPy的多维数组非常类似。然而,Tensor提供GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。

  • "tensor"这个单词一般可译作“张量”,张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是二维张量。

2.2.1 创建Tensor

Pytorch学习_第1张图片

2.2.4 运算的内存开销

前面说了,索引操作是不会开辟新内存的,而像y = x + y这样的运算是会新开内存的,然后将y指向新内存。为了演示这一点,我们可以使用Python自带的id函数:如果两个实例的ID一致,那么它们所对应的内存地址相同;反之则不同。

x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
y = y + x
print(id(y) == id_before) # False 

2.3.3 梯度

Pytorch学习_第2张图片
PyTorch中 tensor.detach() 和 tensor.data 的区别

leaf variable & with torch.no_grad & -=

index_select

t = torch.arange(20).reshape(10, 2) # 初始化一个tensor,从0到23,形状为(2,3,4)
print("t--->", t)
 
index = torch.tensor([1, 2]) # 要选取数据的位置
print("index--->", index)

index1 = torch.tensor([2, 1]) # 要选取数据的位置
print("index--->", index1)
 
data1 = t.index_select(0, index) # 第一个参数:从第1维挑选, 第二个参数:从该维中挑选的位置
print("data1--->", data1)
 
data2 = t.index_select(0, index1) # 第一个参数:从第2维挑选, 第二个参数:从该维中挑选的位置
print("data2--->", data2)

输出:

t---> tensor([[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7],
        [ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]])
index---> tensor([1, 2])
index---> tensor([2, 1])
data1---> tensor([[2, 3],
        [4, 5]])
data2---> tensor([[4, 5],
        [2, 3]])

torch.mul() 和 torch.mm() 的区别

  • torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1, 2),返回的仍是(1, 2)的矩阵

  • torch.mm(a, b)是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵

3.5 图像分类数据集(Fashion-MNIST)

Pytorch学习_第3张图片
这个非torch的官方库真把我搞晕了,pycharm和conda里都搜不到,反正暂时用不到这个,索性就去d2lzh_pytorch里把它注掉。这个库是一种为pytorch提供文本数据处理能力的库, 类似于图像处理库Torchvision。
在这里插入图片描述
ok!等以后用的时候再说吧,到时候试试自行下载安装

下载地址:https://github.com/text
安装:pip install text-master.zip
测试安装是否成功: import torchtext

torch.nn模块

实际上,“nn”是neural networks(神经网络)的缩写。顾名思义,该模块定义了大量神经网络的层。之前我们已经用过了autograd,而nn就是利用autograd来定义模型。nn的核心数据结构是Module,它是一个抽象概念,既可以表示神经网络中的某个层(layer),也可以表示一个包含很多层的神经网络。在实际使用中,最常见的做法是继承nn.Module,撰写自己的网络/层。一个nn.Module实例应该包含一些层以及返回输出的前向传播(forward)方法

num_inputs = 784
num_outputs = 10

class LinearNet(nn.Module):
    def __init__(self, num_inputs, num_outputs):
        super(LinearNet, self).__init__()
        self.linear = nn.Linear(num_inputs, num_outputs)
    def forward(self, x): # x shape: (batch, 1, 28, 28)
        y = self.linear(x.view(x.shape[0], -1))
        return y

net = LinearNet(num_inputs, num_outputs)

你可能感兴趣的:(python)