PyTorch 基础1

PyTorch 基础

训练流程:

1
2
3
4
5
6
7
1. 加载数据集
2. 前向传播
3. 计算损失
4. 反向传播
5. 更新权重
6. 验证集测试
7. 保存模型

Dataset类和Dataload类

Dataset类实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from torch.utils.data import Dataset
from PIL import Image
import os
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
return img,label
def __len__(self):
return len(self.img_path)
root_dir="hymenoptera_data/hymenoptera_data/train"
ants_label_dir="ants"
bees_label_dir="bees"
ants_label_dir=Mydata(root_dir,ants_label_dir)
bees_label_dir=Mydata(root_dir,bees_label_dir)

Tensorboard的使用

图像变化,transform的使用

Tensorboard的工作流程简单来说是

  • 将代码运行过程中的,某些你关心的数据保存在一个文件夹中:
1
这一步由代码中的writer完成
  • 再读取这个文件夹中的数据,用浏览器显示出来:
1
这一步通过在命令行运行tensorboard完成。
1
2
3
4
5
6
7
from torch.utils.tensorboard import SummaryWriter   
这里的SummaryWriter的作用就是,将数据以特定的格式存储到刚刚提到的那个文件夹中。

首先我们将其实例化

writer = SummaryWriter('./path/to/log')
这里传入的参数就是指向文件夹的路径,之后我们使用这个writer对象“拿出来”的任何数据都保存在这个路径之下。
1
writer.add_scalar(tag, scalar_value, global_step=None, walltime=None)

这里的tag指定可视化时这个变量的名字,scalar_value是你要存的值,global_step可以理解为x轴坐标。

使用tensorboard --logdir=log --port=端口号能查看图像

add_image()函数的使用

add_image函数主要用于将一张图像添加到 TensorBoard 中进行可视化。它接受几个关键参数,包括tag(图像的标签,用于在 TensorBoard 中区分不同的图像)、img_tensor(图像数据,以张量形式表示)以及global_step(全局步骤,通常用于表示训练的阶段或者迭代次数等)。
参数要求和细节:
对于img_tensor参数,它期望图像张量的格式为(height, width, channels)(即 HWC 格式),其中height是图像的高度,width是图像的宽度,channels是图像的通道数(例如,对于彩色图像通常是 3,表示 RGB 三个通道)。如果传入的张量格式不符合要求,就会出现之前遇到的那种格式不匹配的错误。
例如,假设你有一个单张图像的数据,已经将其转换为形状为(32, 32, 3)的张量(表示一张 32×32 像素的彩色图像),并且你想在 TensorBoard 中以’input_image’为标签来展示这张图像,在训练的第 10 步添加它,你可以这样使用add_image函数:
python
复制
import torch
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
image_tensor = torch.randn(32, 32, 3) # 随机生成一张形状为(32, 32, 3)的图像张量
writer.add_image('input_image', image_tensor, 10)
writer.close()


transform函数

torchvision下得transform

对于视觉方向的图像处理方面,PyTorch提供了很好的预处理接口,对于图像的转换处理,使用 torchvision.tranforms 模块使得这些操作非常高效。torchvision.transforms常用的图像预处理方法

torchvision.transforms.RandomCrop(size,padding = None,pad_if_needed = False,fill = 0,padding_mode ='constant' )

size(sequence 或int) - 作物的所需输出大小。如果size是int而不是像(h,w)这样的序列,则进行正方形裁剪(大小,大小)

padding(int或sequence ,optional) - 图像每个边框上的可选填充。默认值为None,即无填充。如果提供长度为4的序列,则它用于分别填充左,上,右,下边界。如果提供长度为2的序列,则分别用于填充左/右,上/下边界

pad_if_needed(boolean) - 如果小于所需大小,它将填充图像以避免引发异常。由于在填充之后完成裁剪,因此填充似乎是在随机偏移处完成的。

fill - 恒定填充的像素填充值。默认值为0.如果长度为3的元组,则分别用于填充R,G,B通道。仅当padding_mode为常量时才使用此值.

padding_mode-填充类型。应该是:恒定,边缘,反射或对称。默认值是常量。


transforms.RandomHorizontalFlip

随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。

1
2
3
4
5
from torchvision import transforms
from PIL import Image

# 创建RandomHorizontalFlip转换
random_horizontal_flip = transforms.RandomHorizontalFlip(p=0.5)

transforms.RandomCrop(size, padding=0)

切割中心点的位置随机选取。size可以是tuple也可以是Integer

transforms.Normalize(mean, std)

给定均值:(R,G,B) 方差:(R,G,B),将会把Tensor正则化。即:Normalized_image=(image-mean)/std

transforms.ToPILImage

shape(C,H,W)Tensorshape(H,W,C)numpy.ndarray转换成PIL.Image,值不变。

transforms.Compose

用于将多个transforms组合起来使用。可以将多个transforms按照顺序组合,然后一次性对数据进行处理。

transforms.ToTensor

把一个取值范围是[0,255]PIL.Image或者shape(H,W,C)numpy.ndarray,转换成形状为[C,H,W],取值范围是[0,1.0]torch.FloadTensor

PyTorch 的图像默认格式是 NCHW生成一个形状为 (1, 3, 224, 224) 的随机张量,服从标准正态分布 N(0,1)。

之后通过x.permute(0, 2, 3, 1)来实现交换维度顺序