目录
1.安装
教学地址:https://www.bilibili.com/video/BV1hE411t7RN?p=12
2.基础
两大法宝函数:
dir()
打开,看见
help()
说明书
举例:查询torch.cuda.is_available
的作用,显示官方的解释文档
如何加载数据
dataset
提供一种方式去获取数据及其label(1)如何获取每一个数据(2)一共有多少个数据
dataloader
为网络提供不同的数据形式
训练集格式(1)训练集+验证集(2)训练集(images+labels.txt)+验证集(images+labels.txt)(3)label写在图片名上
from torch.utils.data import Dataset # 常用工具
from PIL import Image # 读图片
import os # 系统包
class MyData(Dataset):
def __init__(self, root_dir, label_dir): # 类实例化
# self 是类中的全局变量
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir, self.label_dir) # os.path.join 是对两个路径的一个拼接
self.img_path = os.listdir(self.path) # os.listdir(path)返回指定路径下所有文件和文件夹的名字,并存放于一个列表中
def __getitem__(self, idx): # input label;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 # 获取标签
return img, label # 返回图片和标签
def __len__(self):
return len(self.img_path) # 获取存放文件列表的长度
root_dir = 'GAN/PyTorch/data/monet2photo/train'
trainA_label_dir = 'A'
trainB_label_dir = 'B'
trainA_dataset = MyData(root_dir, trainA_label_dir)
trainB_dataset = MyData(root_dir, trainB_label_dir)
train_dataset = trainA_dataset + trainB_dataset
复制路径快捷键“ctrl+shift+C”
tensorboard 的使用
看loss的变化,是否在预期内
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('logs')
# writer.add_image()
# y =x 写一个函数
for i in range(100):
writer.add_scalar('y=x', i, i)
writer.close()
进入文件所在的文件夹tensorboard --logdir=logs(文件夹名)
指定端口名tensorboard --logdir=logs --port=6007
官方建议训练新的时候的时候最好创建不同的文件夹,不然图像可能重合
torchvision 中的transforms
“C”代表class
“M”代表def
transforms 的使用
常用transforms
想了解一个新的方法,首先要关注输入输出,多看官方文档,关注方法需要什么参数,不知道返回值的时候print;print(type());debug
- ToTensor
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs")
img = Image.open("data_test/train/ants_image/0013035.jpg")
print(img)
# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor)
writer.close()
# Normalize
# 输入必须是tensor
# transform.Normalize()则把0-1变换到(-1,1)
# image=(image-mean)/std
# mean std = [0.5, 0.5, 0.5], [0.5, 0.5, 0.5]
print(img_tensor[0][0][0])
trans_normal = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) # 要输入均值,标准差
img_norm = trans_normal(img_tensor)
print(img_norm[0][0][0])
writer.add_image('Normalize',img_norm)
在这里插入代码片# Resize
# 输入必须是PIL
print(img.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img)
img_resize = trans_totensor(img_resize) # PIL-Tensor
print(img_resize)
writer.add_image('Resize',img_resize)
2
计算公式:0.3137*2-1 = -0.3725
为什么选择tensor
是因为tensor的属性,包括反向传播“backward_hooks”,梯度"grad",cpu等信息
如何加载数据
dataset/dataloader
dataset:数据集在什么地方,有多少图片
DataLoader:加载数据
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
# 准备的测试数据集
test_data = torchvision.datasets.CIFAR10("./dataset", train=False,transform=torchvision.transforms.ToTensor(),download=True)
# batch_size每次取4个
test_loader = DataLoader(dataset=test_data,batch_size=64, shuffle=False, num_workers=0, drop_last=True) # num_workers的经验设置值是自己电脑/服务器的CPU核心数
# 测试数据集中第一张图片及target
img, target = test_data[0]
print(img.shape)
print(target)
writer = SummaryWriter("dataloader")
for epoch in range(2):
step = 0
for data in test_loader:
imgs, targets = data
print(imgs.shape)
print(targets)
writer.add_images("Epoch:{}".format(epoch), imgs, step) # images
# writer.add_image("test", image_array, 1, dataformats='HWC') # CWH 通道,宽度,高度 默认是这个,不然要修改
step = step+1
writer.close()
神经网络基本框架nn.Module
nn.Module包含一个def init(self):和一个 def forward(self, input):
import torch
from torch import nn
class Tudui(nn.Module):
def __init__(self):
super().__init__()
def forward(self, input):
output = input +1
return output
tudui = Tudui()
x = torch.tensor(1.0)
output = tudui(x)
print(output)
卷积操作
conv2d:input输入图像;
torch.nn 是封装好的,基础是torch.nn.fouctional
池化操作
最常用的还是maxpooling
dilation空洞卷积
floor向下取整
ceiling向上取整
非线性激活
网络模型的保存和读取
模型的保存
模型的加载
完整的模型训练套路-GPU训练
完整的模型验证套路