两个法宝函数
dir():打开,看见
help():帮助、说明
例子:dir(pytorch)、dir(pytorch.X)
Ctrl+F:搜索
注意:双下划线是不能修改的文件
Pycharm和Jupter的对比
python文件:以块作为一个整体;通用运行,但是需要从头运行。
python控制台:以每一行为快,调试可以看到变量属性;Shift+enter可以换行书写代码;显示每个变量的属性,不利于代码的阅读和修改。
jupter:以任意块运行;利于代码阅读及修改;环境需要配置。
Pytorch加载数据初认识
dataset:提供一种方式去获取数据机器label,使用时需要继承这个类
dataloader:为后面的网络提供不同的数据形式;包含两个功能:如何获取每一个数据及其label、告诉我们总共有多少个数据
torch.utils.data:torch常用工具
**class中init函数·**:为class类提供全局变量;后面创建实例的时候需要给init的参数赋值
路径:绝对路径在Windows中路径用“\”表示;相对路径用"/"表示
self:指定了一个类中的全局变量
Tensorboard
from torch.utils.tensorboard import summmarywriter
块注释:ctrl+/
args:参数
scalar:结果可视化(不太推荐使用)
图片打开:PIL:Python Image Library
from PIL import Image
img=Image.open(imge_path)
CHW–HWC:writer.add_image(“test”,image_array,2, dataformats=‘HWC’)
SummaryWriter
from torch.utils.tensorboard import SummaryWriter
writer=SummaryWriter("logs")
write.add_image("图片title",图片(tenstor类型),输出排列的第几张图片)
Transforms
导入:from trochvision import Transform
trasnforms.py工具箱:
里面的工具:ToTensor、resize
通过transforms.ToTensor去看两个问题
1、transforms该如何使用python
ctrl+p出现需要什么参数
result=tool(input)
内置函数前后具有双下划线,调用类时会自动调用;如果是单纯调用其中的某个函数,则不会调用内置函数。
2、为什么需要Tensor数据类型
alt+enter:提供解决方案
输入、输出、作用
读取图片:
Image.open()
cv.imread()
3、ToTensor
Img_Tensor = transformers.ToTensor(Img_PIL/Img_Numpy)
4、Resize()
trans_resize = transforms.Resize((512,512))
img_resize=trans_resize(img)
5、compose
Transforms.Randomcrop()#随机裁剪
关注函数功能、输入和输出(输入一般是会告诉是什么样的类型、输出可以用调试的方法进行或者直接打印变量)
观看官方文档,比较准确!
关注方法需要什么参数
TorchVision
1、数据集:torchvision.datasets.CIFAR10(root=,train=,download=true),推荐download一直设置为true!
2、可以通过迅雷进行数据下载
3、可以用summary.writer进行处理
DateLoader
**作用:**怎么取数据、取多少数据
batch_size:每次取的数据量
shuffle:是否打乱数据
num_workers:单进程还是多进程,=0表示是主进程;windows下一般用=0.
drop_last:剩余的数据是否丢弃
nn.Module
import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 20, 5)
def forward(self, x):
x = F.relu(self.conv1(x))
return F.relu(self.conv2(x))
卷积、池化、非线性&&&&
torch.reshape()
troch.transformers.resize()
torch.flatten()
sequential
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
# Using Sequential with OrderedDict. This is functionally the
# same as the above code
model = nn.Sequential(OrderedDict([
('conv1', nn.Conv2d(1,20,5)),
('relu1', nn.ReLU()),
('conv2', nn.Conv2d(20,64,5)),
('relu2', nn.ReLU())
]))
输出网络结构:print(model())
检验网络(尤其是线性层):
input=torch.ones((64,3,32,32))
output=model(input)
可以检验正确性!
怎么打印模型参数?
损失函数和反向传播
from troch.nn import L1Loss
results=L1Loss(input,target)
损失函数:L1Loss、交叉熵损失(适合于分类问题)、MSELoss损失
补:入门的时候学习太多会减弱兴趣的!
优化器
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
优化器主要配置两个参数:params、lr
optim = torch.optim.xxx(models.parameters,lr=0.01)
optim.zero_grad()
result_los.backward()
optim.step()
现有模型修改
pip list :展示安装的package
vgg16.add_module(“add_linear”,nn.Linear(1000,10)):vgg之后增加线性层
vgg16.classifier[6]:直接修改最后一层的输出
网络模型保存与加载
pytorch的官网的程序写法可以借鉴,作为套路和模板
方式1:
保存模型和参数:
torch.save(vgg16,"vgg16_method1.pth")
加载模型和参数
model=torch.load("vgg16_method1.pth")
自己的网络模型在加载的时候需要复制到加载程序中
方式2:
保存模型参数(官方推荐)
torch.save(vgg16.state_dict(),"vgg16_method2.pth")
加载模型参数(官方推荐)
vgg16=trochvision.models.vgg16(pretrained=Flase)
vgg16.load_state_dict(torch.load("vgg16_method2.pth"))
模型训练
模型测试:
不要再调整成参数和寻找最优了!
with torch.no_grad():
计算正确率
GPU训练
google colaoratary和Jupter相似,可以用其中的GPU
利用GPU训练的是把网络模型、数据和损失函数改为.cuda()
if torch.cuda.is_avialable()
model=Model.cuda()
常用写法
device=torch.device("cuda" iftorch.cuda.is_available() else "cpu")
模型测试(demo)
利用已经训练好的模型,然后提供输入
先加载模型参数,然后复制神经网络,数据reshape和totensor
GitHub
多看牛人代码,认真体会细节
一般看星号排序的代码
补充:
item()的使用
import torch
a = troch.tensor(5)
print(a)
print(a.item())
输出为:
tensor(5)
5
参考链接:
B站视频_小土堆
PyTorch 深度学习快速入门教程