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)
后面有个九分钟全英文的,大概是讲有问题就查网址的,不进行记录了。