Pytorch 深度学习笔记

标量,向量,矩阵与张量

1、标量
一个标量就是一个单独的数,一般用小写的的变量名称表示。

2、向量
一个向量就是一列数,这些数是有序排列的。通常会赋予向量粗体的小写名称
我们可以把向量看作空间中的点,每个元素是不同的坐标轴上的坐标。
计算机中一般把向量视为行向量,shape为(n),列向量为矩阵,shape为(n,1)

3、矩阵
矩阵是二维数组,其中的每一个元素被两个索引而非一个所确定。
我们通常会赋予矩阵粗体的大写变量名称,比如A。

4、张量

几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量矢量视为一阶张量,那么矩阵就是二阶张量。 例如,可以将任意一张彩色图片表示成一个三阶张量,三个维度分别是图片的高度、宽度和色彩数据。

基础

PyTorch简明笔记[1]-Tensor的初始化和基本操作

视频笔记

Tensor与tensor深入分析与异同
常用torch.Tensor()
Tensor 是多维矩阵,矩阵的元素都是同一种数据类型。
tensor 需要确切的数据对它进行赋值。
torch.Tensor是torch.FloatTensor的别名。

Tensor()如果值传递一个整数,则会生成一个随机的张量:
import torch
torch.Tensor(1)
输出:tensor([一个随机值])
如果传递一个可迭代的对象,则输出就是这个可迭代的对象
torch.Tensor([1,2])
输出:tensor([1.,2.])

在这里插入图片描述
tensor.detach()
返回一个新的tensor,从当前计算图中分离下来。

mport torch
a=torch.tensor([1.,2.,3.])
b=torch.tensor([4.,5.,6.],requires_grad=True)

a
a.data
b
b.data

tensor([1., 2., 3.])
tensor([1., 2., 3.])
tensor([4., 5., 6.], requires_grad=True)
tensor([4., 5., 6.])

b.detach().numpy()

array([4., 5., 6.], dtype=float32)

optimizer

理解optimizer.zero_grad(), loss.backward(), optimizer.step()的作用及原理

model = MyModel()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9, weight_decay=1e-4)
 
for epoch in range(1, epochs):
    for i, (inputs, labels) in enumerate(train_loader):
        output= model(inputs)
        loss = criterion(output, labels)
        
        # compute gradient and do SGD step
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

torch.nn.init

官网:https://pytorch.org/docs/stable/nn.init.html

【细聊】torch.nn.init 初始化

自动求导

PyTorch学习笔记(三):自动求导Autograd

如果用 非标量y 进行求导,函数需要额外指定grad_tensors
且grad_tensors的shape必须和y的相同

torch.tensor加参数requires_grad=True时数据必须为浮点数 如1.0 简写1.

>>> x = torch.ones(2, 2) # x.is_leaf= True 叶子节点
>>> w = torch.rand(2, 2, requires_grad=True)
>>> b = torch.rand(2, 2, requires_grad=True)
>>> y = w * x + b # 标量

>>> weights = torch.ones(2, 2)
>>> y.backward(weights) # 这里要加上相同shape的tensors
>>> w.grad  
tensor([[1., 1.],
        [1., 1.]])

此外,PyTorch中梯度是累加的,每次反向传播之后,当前的梯度值会累加到旧的梯度值上。

在这里插入图片描述

在这里插入图片描述

PyTorch简明笔记[2]-Tensor的自动求导(AoutoGrad)

PyTorch里面,求导是调用.backward()方法。直接调用backward()方法,会计算对计算图叶节点的导数。
获取求得的导数,用.grad方法。

自动求导,只能是【标量】对标量,或者【标量】对向量/矩阵求导!

x = torch.tensor([[1.,2.,3.],[4.,5.,6.]],requires_grad=True)
y = x+1
z = 2*y*y
J = torch.mean(z) 
x # 矩阵
y # 矩阵
z # 矩阵
J # 标量
>>>
tensor([[1., 2., 3.],
        [4., 5., 6.]], requires_grad=True)
tensor([[2., 3., 4.],
        [5., 6., 7.]], grad_fn=<AddBackward0>)
tensor([[ 8., 18., 32.],
        [50., 72., 98.]], grad_fn=<MulBackward0>)
tensor(46.3333, grad_fn=<MeanBackward0>)

求导

z.backward() # z是标量 
RuntimeError: grad can be implicitly created only for scalar outputs

z.backward(torch.ones(2,3))
x.grad
>>>
tensor([[ 8., 12., 16.],
        [20., 24., 28.]])


J.backward() # J对x求导  x是叶子节点
x.grad
>>>
tensor([[1.3333, 2.0000, 2.6667],
        [3.3333, 4.0000, 4.6667]])

一个计算图只能backward一次
一个计算图在进行反向求导之后,为了节省内存,这个计算图就销毁了。
如果你想再次求导,就会报错。

数据预处理

求和

总结:axis=0 跨行(默认)上下压扁
axis=1 跨列 左右压扁

例子:
A.shape():(2,3,4)
A.sum(axis=2) 就是把 第二个轴消掉 即变为 (2,4)

A.sum(axis=2, keepdims=True) shape为(2,1,4)

A = torch.randint(10,size=(2,4))
A
>>>
tensor([[4, 1, 8, 5],
        [2, 9, 1, 7]])
        
A.sum()
>>>
tensor(37)

A.sum(axis=0) # 输入矩阵沿0轴(行)降维以生成输出向量,因此输入的轴0的维数在输出形状中丢失。行数降为1
>>>
tensor([ 6, 10,  9, 12])

A.sum(axis=1) # 汇总所有列的元素降维(轴1)。因此,输入的轴1的维数在输出形状中消失。
>>>
tensor([18, 19])
'''
[[18],
 [19]]
然后转化为一维行向量
'''

线性模型

在这里插入图片描述

神经网络

Pytorch神经网络工具箱 ***在这里插入图片描述

视频笔记

https://www.bilibili.com/video/BV1R44y1v7tJ?p=28

文档笔记

非常推荐:NLP学习笔记-Pytorch框架(一)

非常推荐:Tensor入门使用

全连接层:当前一层和前一层每个神经元相互链接,我们称当前这一层为全连接层。

词嵌入

word embedding 词嵌入:又叫词向量

  • num_embeddings : 词嵌入字典大小,即一个字典里要有多少个词。
  • embedding_dim:词向量的维度,即用多少长度的向量来表示一个词
nn.embedding (num_embeddings,embedding_dim)

seq_len就是输入的sequence_length(序列长度
举例:每条评论取前20个词 seq_len=20
既然LSTM是处理序列数据的,那么序列就需要一个长度。虽然LSTM处理的序列长度通常是不固定的,但是Pytorch和TensorFlow的集成实现还是固定了input的序列长度,在处理不固定长度的数据(如机器翻译),通常加入开始和结束符号并采用序列的最大长度MAX_LEN作为seq_len

RNN模型与NLP应用(2/9):文本处理与词嵌入

在这里插入图片描述

在这里插入图片描述
词典p^T:每一列对应一个词
d:词向量的维度(用户决定)
v:字典的长度
在这里插入图片描述
d=2 就是二维的
在这里插入图片描述
词典 vocabulary 有一万条数据
word_num=20:每个序列只取20个词(即每条电影评论取20个单词)即seq_len
embedding_dim=8:每个单词用一个8维的词向量来表示
在这里插入图片描述

simple RNN

https://www.bilibili.com/video/BV1dq4y1f7ep

A是模型参数
A中紫色的是h_t-1的参数矩阵 蓝色的是x_t的参数矩阵
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
训练参数A
在这里插入图片描述

LSTM模型

图解:https://blog.csdn.net/baidu_38963740/article/details/117197619
在这里插入图片描述

RNN输入输出参数理解

在这里插入图片描述

pytorch中实现循环神经网络的基本单元RNN、LSTM、GRU的输入、输出、参数详细理解

pytorch中RNN参数的详细解释

看了两天还是没有理解,先强记吧

猜你喜欢

转载自blog.csdn.net/Jruo911/article/details/121277417
今日推荐