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
自动求导
如果用 非标量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]]
然后转化为一维行向量
'''
线性模型
神经网络
视频笔记
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
词典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的输入、输出、参数详细理解
看了两天还是没有理解,先强记吧