在的笔记系统看到自己还写过一篇这个,放出来一下,不然就发霉了
torch.mul() 、 torch.mm() 及torch.matmul()的区别
1、torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1, 2),返回的仍是(1, 2)的矩阵;
2、torch.mm(a, b)是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵。
import torch
a = torch.rand(1, 2)
b = torch.rand(1, 2)
c = torch.rand(2, 3)
print(torch.mul(a, b)) # 返回 1*2 的tensor
print(torch.mm(a, c)) # 返回 1*3 的tensor
print(torch.mul(a, c)) # 由于a、b维度不同,报错
pytorch 的块就是按照顺序储存的
class Sequ(nn.Module):
def __init__(self,*args):
super().__init__()
self._addmodules ={}
for id ,module in enumerate(args):
self._addmodules[str(id)] = module
def forward(self,X):
for modulex in self._addmodules.values():
X = modulex(X)
return X
nn.ReLU和F.ReLU的区别
nn.ReLU和F.ReLU两种实现方法。
其中nn.ReLU作为一个层结构,必须添加到nn.Module容器中才能使用,而F.ReLU则作为一个函数调用,看上去作为一个函数调用更方便更简洁。具体使用哪种方式,取决于编程风格。在PyTorch中,nn.X都有对应的函数版本F.X,但是并不是所有的F.X均可以用于forward或其它代码段中,因为当网络模型训练完毕时,在存储model时,在forward中的F.X函数中的参数是无法保存的。也就是说,在forward中,使用的F.X函数一般均没有状态参数,比如F.ReLU,F.avg_pool2d等,均没有参数,它们可以用在任何代码片段中。
PyTorch之nn.ReLU与F.ReLU的区别_鹊踏枝-码农的博客-CSDN博客_nn.relu和f.relu
Whats the difference between nn.relu() vs F.relu() - PyTorch Forums
块的多层嵌套
def block1():
return nn.Sequential(nn.Linear(4, 8), nn.ReLU(),
nn.Linear(8, 4), nn.ReLU())
def block2():
net = nn.Sequential()
for i in range(4):
# 在这里嵌套
net.add_module(f'block {i}', block1())
return net
rgnet = nn.Sequential(block2(), nn.Linear(4, 1))
rgnet(X)
卷积神经网络
池化层和卷积层其实差别不大
卷积层求的是在卷积核大小的区域的数据与卷积核的数据的加权和,池化层求的是一定区域内的平均值或者最大值
cov2d
def corr2d(X, K): #@save
"""计算二维互相关运算"""
h, w = K.shape
Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i:i + h, j:j + w] * K).sum() ###这个K就是cov2d和pooling的区别
return Y
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
corr2d(X, K)
pooling
def pool2d(X, pool_size, mode='max'):
p_h, p_w = pool_size
Y = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
if mode == 'max':
Y[i, j] = X[i: i + p_h, j: j + p_w].max()
elif mode == 'avg':
Y[i, j] = X[i: i + p_h, j: j + p_w].mean()
return Y
循环神经网络
基于嵌入维度,将数据映射为数据对和,但是会丢失前面项,因为没有足够的历史记录来描述前个数据样本。
一个简单的解决办法是:如果拥有足够长的序列就丢弃这几项;
另一个方法是用零填充序列。
tau = 4
features = torch.zeros((T - tau, tau))
for i in range(tau):
features[:, i] = x[i: T - tau + i]
labels = x[tau:].reshape((-1, 1))
x.shape
### torch.Size([1000])
features.shape
### features.shape
#### features ## 注意这种编码形式,也就是四个为一组,然后从第二个构建一行
tensor([[-0.0036, -0.1588, 0.1267, 0.1920],
[-0.1588, 0.1267, 0.1920, 0.0842],
[ 0.1267, 0.1920, 0.0842, -0.1051],
...,
[-0.5951, -0.5278, -0.5754, -0.8150],
[-0.5278, -0.5754, -0.8150, -0.4767],
[-0.5754, -0.8150, -0.4767, -0.1860]])