Pytorch深度学习一些笔记

在的笔记系统看到自己还写过一篇这个,放出来一下,不然就发霉了

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]])

你可能感兴趣的:(Pytorch深度学习一些笔记)