pytorch阶段性总结1

发布于:2025-02-27 ⋅ 阅读:(15) ⋅ 点赞:(0)

Dataset类,自定义数据集,想要使用这个类需要重写两个方法__init__和__getitem__
__init__可以用来初始化数据集所在位置的路径,__getitem__用来定义获取数据的方式
 

from torch.utils.data import Dataset
from PIL import Image
import os
#自定义数据集简单示例
class MyData(Dataset):
    #root_dir是数据集所在的一个路径,label_dir是当前数据集中一个分类的名字,参数根据具体情况而定
    def __init__(self,root_dir,label_dir):
        self.label_dir=label_dir
        #os.path.join是将两个dir通过/连接起来
        self.path=os.path.join(root_dir,label_dir)
        #os.listdir是获取当前目录下所有文件的名字
        self.img_path=os.listdir(self.path)

    #重写这个方法后可以像使用列表一样使用类
    def __getitem__(self,idx):
        #拿到这个文件的名字
        img_name=self.img_path[idx]
        img_item_path=os.path.join(self.path,img_name)
        #用Image打开图片获取
        img=Image.open(img_item_path)
        label=self.label_dir
        return img,label
    def __len__(self):
        return len(self.img_path)

#使用示例
root_dir="dataset/train"
ants_label_dir="ants_image"
bees_label_dir="bees_image"
ants_dataset=MyData(root_dir,ants_label_dir)
bees_dataset=MyData(root_dir,bees_label_dir)
train_dataset=ants_dataset+bees_dataset

        
        

tensorboard工具箱中的SummaryWriter是一个记录日志的类

from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
#创建一个SummaryWriter类,并传入一个字符串,这个字符串会作为日志文件夹的名字
writer=SummaryWriter("logs")
image_path="data/train/bees_image/16838648_415acd9e3f.jpg"
img_PIL=Image.open(image_path)
img_array=np.array(img_PIL)

#点开源代码可以看到dataformats默认是CHW的排列格式
#def add_image(
#   self, tag, img_tensor, global_step=None, walltime=None, dataformats="CHW"
#):

#如果你将img_array打印出来可以发现图片是"HWC"的类型,所以需要再dataformats中指定
#这里的字符串表示在打开日志以后它属于哪一个组别的,第二个参数是要记录的图片支持tensor数据类型
#和ndarray数据类型

writer.add_image("test1",img_array,global_step=0,dataformats='HWC')

#下面是一组图片的添加方式,它会将一组图片整合到一起,假设imgs是一组图片的集合
writer.add_images("test2",imgs,global_step=step)

#scalar标量,标量的添加方式
for i in range(100):
    #第一个是x值,第二个是y值
    writer.add_scalar("y=2x",2*i,i)

#生成日志完成以后关闭
writer.close()

#打开编译器底下的终端,logdir=日志文件的名字,端口默认6006,输入命令点开链接就可以看到数据的可视化
tensorboard --logdir=logs --port=6007



transforms当中的ToTensor方法,将PIL格式变成tensor格式

from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
import cv2
# 用to_tensor读图片
img_path="dataset/train/ants_image/0013035.jpg"
img=Image.open(img_path)

writer=SummaryWriter("logs")

tensor_trans=transforms.ToTensor()
tensor_img=tensor_trans(img)
# 用cv读图片变成ndarray类型
# cv_img=cv2.imread(img_path)

writer.add_image("Tensor_img",tensor_img)

writer.close()

transforms处理图像的常用方法Normalize(mean,std),Resize(size),Compose(transforms),RandomCrop(size)

#Normalize对图像进行标准化处理
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms



#读取图片
writer=SummaryWriter("logs")
img=Image.open("image/py.png")
# ToTensor作用是将所有像素值除以255转成一个张量
trans_totensor=transforms.ToTensor()
img_tensor=trans_totensor(img)
writer.add_image("ToTensor",img_tensor)



# Normalize:output[channel]=(input[channel]-mean[channel])/std[channel]
# 使数据分布更标准
trans_norm=transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm=trans_norm(img_tensor)
writer.add_image("Normalize",img_norm,1)



# Resize:传两个参数是指定修改长和宽,传一个参数就是将两边都修改成这个参数
trans_resize=transforms.Resize((512,512))
img_resize=trans_resize(img)
img_resize=trans_totensor(img_resize)
writer.add_image("Resize",img_resize)



# Compose:将多种操作组合在一起
trans_resize_2=transforms.Resize(512)
trans_compose=transforms.Compose([trans_resize_2,trans_totensor])
img_resize_2=trans_compose(img)
writer.add_image("Resize",img_resize_2,1)



# RandomCrop:随机截取图片的一个部分,给的长和宽不能超过图片的长和宽
trans_random=transforms.RandomCrop((295,350))
trans_compose_2=transforms.Compose([trans_random,trans_totensor])
for i in range(10):
    img_crop=trans_compose_2(img)
    writer.add_image("RandomCrop",img_crop,i+10)


writer.close()

torchvision中数据集的加载,train=True表示训练数据集,False表示测试数据集,root是下载的位置
transform可以传一个Compose,也可以直接传torchvision.transforms.ToTensor()

import torchvision
from torch.utils.tensorboard import SummaryWriter

dataset_transform=torchvision.transforms.Compose([
    torchvision.transforms.ToTensor()
])
train_set=torchvision.datasets.CIFAR10(root="./dataset",train=True,transform=dataset_transform,download=True)
test_set=torchvision.datasets.CIFAR10(root="./dataset",train=False,transform=dataset_transform,download=True)
# print(test_set[0])
# print(test_set.classes)
#
# img,target=test_set[1]
# print(img)
# print(target)
# print(test_set.classes[target])
# img.show()

# print(test_set[0])
writer=SummaryWriter("p10")

for i in range(10):
    img,target=test_set[i]
    writer.add_image("test_set",img,i)

writer.close()

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())
# shuffle表示是否会随机打乱,batch_size表示每一组有多少个图片,总共有sum/batch_size组,每组的图片都不会重复
# 最后一组可能会出现数量不足的情况,把drop_last设为true会删掉最后一个不足的组
test_loader=DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=0,drop_last=False)

img,target=test_data[0]
print(img.shape)
print(target)

writer=SummaryWriter("dataloader")
step=0
for data in test_loader:
    imgs,targets=data
    # print(imgs.shape)
    # print(targets)
    writer.add_images("test_data",imgs,step)
    step=step+1
writer.close()