pytorch 及其模板应用
pytorch及其应用
优点:
- 支持GPU、灵活;
- 支持动态神经网络;
- 底层代码易于理解;
- 命令式体验;自定义扩展
缺点:
-
对比TensorFlow,全面性不足,不支持快速傅里叶、沿维翻转张量和检查无穷与非数值张量;
-
针对移动端、嵌入式部署以及高性能服务器端的部署其性能表现有待提升;
-
因为框架较新,社区没有那么强大,在文档方面其C库大多数没有文档。
环境配置
- 有关conda虚拟环境
conda list # 查看安装了哪些包
conda env list # 查看当前存在哪些虚拟环境
conda update conda # 检查更新当前conda
python --version # 查看python版本
conda create -n xxx python=3.6 # xxx为自己命名的虚拟环境名称,该文件可在Anaconda安装目录 envs文件下找到
conda create -n pytorch python=3.6
conda activate yorr_env_name # 激活虚拟环境
conda install -n your_env_name [package] # 对虚拟环境安装额外的包
deactivate # 关闭虚拟环境
conda remove -n your_env_name --all
conda remove --name your_env_name package_name # 删除环境中的某个包
- 虚拟环境下安装 jupyter
conda activate pytorch
conda install nb_conda
- pytorch安装
conda activate pytorch
conda install pytorch torchvision cpuonly -c pytorch
- 离线安装(极其有用,血泪教训)
# https://download.pytorch.org/whl/torch_stable.html
# 下载对应的whl,然后安装
pip install D:\software\Anaconda3\whl_download\torch-1.5.0+cpu-cp36-cp36m-win_amd64.whl
Python学习中的两大法宝函数
- dir() 道具:相当于你的手和眼睛,它可以帮你打开东西和看到其中的东西。能让你了解package有哪些东西,也许是更小的模块,或者是函数。dir() 函数,当输出是带有前后双下划线的,这个时候,就表明,这是一个函数,一个工具。你应该使用 help() 函数去查看这个工具的使用方法。
- help() 道具:相当于说明书,你可以知道每个工具的使用方法。能让你知道函数的使用方法。
import torch
dir(torch)
help(torch.cuda.is_available)
数据
from PIL import Image
img_path = "" # 注意,win下\\
img = Image.open(ima_path)
img.show()
import os
dir_path = "" # /
img_path_list = os.listdir(dir_path) # 文件夹下的变成列表
root_dir = "dataset/train"
label_dir = "ants"
path = os.path.join(root_dir,label_dir) # 系统自动加起来,不会出错
from torch.utils.data import Dataset
class MyData(Dataset):
def __init__(self, root_dir, label_dir):
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir,self.label_dir)
self.img_path = os.listdir(self.path) # 所有图片的名称
def __getitem__(self,idx):
img_name = self.img_path[idx] # 图片名
img_item_path = os.path.join(self.root_dir,self.label_dir, img_name) # 图片相对路径地址
img = Image.open(img_item_path) # 读取图片
label = self.label_dir # 这里label就是文件名
return img, label
def __len__(self):
return len(self.img_path) # 数据集的长度
root_dir = "dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)
img, label = ants_dataset[0] # 就自动调用了__getitem__获取了第一个
img.show()
train_dataset = ants_dataset + bees_dataset # 合并数据集 数据增强
构建自己的网络
- 处理数据
- 定义网络
- 定义损失函数
- 定义优化方法
- 训练
一个例子:
import torch
class TwoLayerNet(torch.nn.Module):
def __init__(self, D_in, H, D_out):
"""
在构造函数中,我们实例化了两个nn.Linear模块,并将它们作为成员变量。
"""
super(TwoLayerNet, self).__init__()
self.linear1 = torch.nn.Linear(D_in, H)
self.linear2 = torch.nn.Linear(H, D_out)
def forward(self, x):
"""
在前向传播的函数中,我们接收一个输入的张量,也必须返回一个输出张量。
我们可以使用构造函数中定义的模块以及张量上的任意的(可微分的)操作。
"""
h_relu = self.linear1(x).clamp(min=0)
y_pred = self.linear2(h_relu)
return y_pred
# N是批大小; D_in 是输入维度;
# H 是隐藏层维度; D_out 是输出维度
N, D_in, H, D_out = 64, 1000, 100, 10
# 产生输入和输出的随机张量
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)
# 通过实例化上面定义的类来构建我们的模型。
model = TwoLayerNet(D_in, H, D_out)
# 构造损失函数和优化器。
# SGD构造函数中对model.parameters()的调用,
# 将包含模型的一部分,即两个nn.Linear模块的可学习参数。
loss_fn = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
for t in range(500):
# 前向传播:通过向模型传递x计算预测值y
y_pred = model(x)
#计算并输出loss
loss = loss_fn(y_pred, y)
# print(t, loss.item())
# 清零梯度,反向传播,更新权重
optimizer.zero_grad()
loss.backward()
optimizer.step()
一个可以效仿的测试函数:
def test(model, device, test_loader):
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for i,data in enumerate(test_loader):
x,y= data
x=x.to(device)
y=y.to(device)
optimizer.zero_grad()
y_hat = model(x)
test_loss += criterion(y_hat, y).item() # sum up batch loss
pred = y_hat.max(1, keepdim=True)[1] # get the index of the max log-probability
correct += pred.eq(y.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(val_dataset),
100. * correct / len(val_dataset)))

浙公网安备 33010602011771号