pytorch基础学习

Pytorch基础学习

by 熠熠发光的白

参考李宏毅2021春课程的基础教学

1.基础步骤

定义神经网络->损失函数->优化器

然后配合数据进行训练

最后使用验证集进行验证

2.Tensor基本介绍

高维度的矩阵

类型:浮点数和整数,torch.FloatTensor和torch.LongTensor

pytorch中的dim和numpy中的axis相同

import pytorch as torch

x = torch.tensor([[1, -1], [-1, 1]])
print(x)
x = torch.from_numpy(np.array([[1, -1], [-1, 1]]))
print(x)

#zero tensor
x = torch.zeros([2, 2])
print(x)

#Unit tensor
x = torch.ones([1, 2, 5])
print(x)

tensor([[ 1, -1],
[-1, 1]])
tensor([[ 1, -1],
[-1, 1]], dtype=torch.int32)
tensor([[0., 0.],
[0., 0.]])
tensor([[[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]]])

3.Squeeze函数
x = torch.zeros([1, 2, 3])
print(x.shape)
x = x.squeeze(0) #数字为被squeeze掉的维度,必须保证拿掉之后size一样大
print(x.shape)

torch.Size([1, 2, 3])
torch.Size([2, 3])

x = torch.zeros([2, 3])
x = x.unsqueeze(2) #数字为维度
print(x.shape)

torch.Size([2, 3, 1])

4.基础操作
x = torch.zeros([2, 1, 3])
y = torch.zeros([2, 3, 3])
z = torch.zeros([2, 2, 3])
w = torch.cat([x, y, z], dim=1)
print(w.shape)

torch.Size([2, 6, 3])

z = x + y #基本加法
z = x - y #基本减法
y = x.pow(2) #开方
y = x.sum() #求所有元素和
y = x.mean() #求平均数
5.仪器选择
x = x.to('cpu')
x = x.to('cuda') #在GPU上跑
torch.cuda.is_available() #检测是否能用cuda加速
6.梯度计算
x = torch.tensor([[1., 0.], [-1., 1.]], requires_grad=True)
z = x.pow(2).sum()
z.backward()
x.grad

在这里插入图片描述

7.dataset&dataloader
from torch.utils.data import Dataset, DataLoader

class MyDataset(Dataset):
    def __init__(self, file):
        self.data = ...
        return #读取数据和处理部分
    def __getitem__(self, index):
        return self.data[index] #返回数据的标签,一次返回一个
    def __len__(self):
        return len(self.data) #返回dataset的大小

dataset = MyDataset(file)
dataloader = Dataloader(dataset, batch_size, shuffle=True) #对于测试数据需要进行shuffle,testing不产生变化
8.torch.nn
nn.Linear(in_features, out_features) #全连接层,将inchannel转换为output的channel数

layer =torch.nn.Linear(32, 64)
print(layer.weight.shape)
print(layer.bias.shape)

#激活函数
nn.Sigmoid()
nn.ReLU()

#Loss函数
nn.MSELoss()
nn.CrossEntropyLoss()

#建立一个自己的神经网络
import torch.nn as nn

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.net = nn.Sequential(
        	nn.Linear(10, 32),
            nn.Sigmoid(),
            nn.Linear(32, 1)
        )
    def forward(self, x):
        return self.net(x) ##通过network定义output

torch.Size([64, 32])
torch.Size([64])

9.torch.optim
torch.optim.SGD(params, lr, momentum = 0) #model.parameters()

#training part
for epoch in range(n_epoches):
    model.train() #设置为training mode
    for x, y in tr_set:
        optimizer.zero_grad() #将gradient设置为0
        x, y = x.to('cpu'), y.to('cpu')
        pred = model(x)
        loss = criterion(pred, y) #计算误差
        loss.backward() #计算gradient
        optimizer.step() #进行更新
        
    model.eval() #切换到评估环节
    total_loss = 0
    for x, y in dv_set: #data validation
        x, y = x.to('cpu'), y.to('cpu')
        with torch.no_grad: #梯度不进行更新
            pred = model(x)
            loss = criterion(pred, y) #计算loss
        total_loss += loss.cpu().item()*len(x)
        avg_loss = total_loss / len(dv_set.dataset)
        
    model.eval() #虽然是测试环节,但是仍然采用eval,因为没有区别
    preds = [] #倾向于是绘图需要使用
    for x in tt_set: #testing set
        x = x.to('cpu')
        with torch.no_grad:
            pred = model(x)
            preds.append(pred.cpu()) #收集数据(append展成一维)
       
#save/load neural network
torch.save(model.state_dict(), path)
ckpt = torch.load(path)
model.load_state_dict(ckpt)

后面有个九分钟全英文的,大概是讲有问题就查网址的,不进行记录了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值