PyTorch代码实战入门

人这辈子千万不要马虎两件事

一是找对爱人、二是选对事业

因为太阳升起时要投身事业

太阳落山时要与爱人相拥

一、准备数据集

蚂蚁蜜蜂数据集

蚂蚁蜜蜂的图片,文件名就是数据的label

二、使用Dataset加载数据

打开pycharm,选择Anaconda创建的pytorch环境

将数据集放在项目的根目录下,并修改文件名

 新建 read_data.py文件,编写如下代码

扫描二维码关注公众号,回复: 17055312 查看本文章
from torch.utils.data import Dataset
from PIL import Image
import os


class MyData(Dataset):

    # 获取训练数据的list
    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)

    # 获取每一张图片及其label
    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 = "dataset/train"
ant_label_dir = "ants"
bee_label_dir = "bees"
ants_dataset = MyData(root_dir, ant_label_dir)
bees_dataset = MyData(root_dir, bee_label_dir)

train_dataset = ants_dataset + bees_dataset

解释:

1. MyData继承Dataset类

2. 重写里面的__init__方法,在MyData类初始化时,通过拼接数据路径,os.listdir()加载出数据的list列表

3. 重写里面的__getitem__方法,将一张一张地将list的图片和对应的label加载出来

4.train_dataset = ants_dataset + bees_dataset,得到训练数据集

三、TensorBoard的使用

安装TensorBoard需要的包

pip install tensorboard

编写如下代码:

from torch.utils.tensorboard import SummaryWriter

# 指定log文件生成的位置
writer = SummaryWriter("logs")

for i in range(100):
    '''
    第一个参数:图像的title
    第二个参数:纵坐标的值 
    第三个参数:横坐标的值
    '''
    writer.add_scalar("y=3x", 3 * i, i)

# 关闭资源
writer.close()

运行代码,会在SummaryWriter指定的位置生成log文件

在Terminal运行下面语句:

可以自己指定端口,防止冲突

tensorboard --logdir=logs --port=6007

运行输出

在浏览器打开

使用 writer.add_image 加载图片

编写下面代码:

from torch.utils.tensorboard import SummaryWriter
from PIL import Image
import numpy as np

# 指定log文件生成的位置
writer = SummaryWriter("logs")

image_path = "dataset/train/ants/7759525_1363d24e88.jpg"
image_PIL = Image.open(image_path)
image_array = np.array(image_PIL)

'''
第一个参数:图像的title
第二个参数:图片的numpy值
第三个参数:步数
第四个参数:将图片进行转换,3通道放在前面
'''
writer.add_image("test", image_array, 1, dataformats='HWC')

for i in range(100):
    '''
    第一个参数:图像的title
    第二个参数:纵坐标的值 
    第三个参数:横坐标的值
    '''
    writer.add_scalar("y=3x", 3 * i, i)

# 关闭资源
writer.close()

 同样在控制台打开运行生成的日志文件

四、Transforms的使用

图片转换工具

ToTensor() 把 PIL格式或者numpy格式转换成tensor

编写如下代码:

from PIL import Image
from torchvision import transforms

img_path = "dataset/train/ants/0013035.jpg"
img = Image.open(img_path)

# 使用transforms
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)

print(tensor_img)

输出:

tensor([[[0.3137, 0.3137, 0.3137,  ..., 0.3176, 0.3098, 0.2980],
         [0.3176, 0.3176, 0.3176,  ..., 0.3176, 0.3098, 0.2980],
         [0.3216, 0.3216, 0.3216,  ..., 0.3137, 0.3098, 0.3020],
         ...,
         [0.3412, 0.3412, 0.3373,  ..., 0.1725, 0.3725, 0.3529],
         [0.3412, 0.3412, 0.3373,  ..., 0.3294, 0.3529, 0.3294],
         [0.3412, 0.3412, 0.3373,  ..., 0.3098, 0.3059, 0.3294]],

        [[0.5922, 0.5922, 0.5922,  ..., 0.5961, 0.5882, 0.5765],
         [0.5961, 0.5961, 0.5961,  ..., 0.5961, 0.5882, 0.5765],
         [0.6000, 0.6000, 0.6000,  ..., 0.5922, 0.5882, 0.5804],
         ...,
         [0.6275, 0.6275, 0.6235,  ..., 0.3608, 0.6196, 0.6157],
         [0.6275, 0.6275, 0.6235,  ..., 0.5765, 0.6275, 0.5961],
         [0.6275, 0.6275, 0.6235,  ..., 0.6275, 0.6235, 0.6314]],

        [[0.9137, 0.9137, 0.9137,  ..., 0.9176, 0.9098, 0.8980],
         [0.9176, 0.9176, 0.9176,  ..., 0.9176, 0.9098, 0.8980],
         [0.9216, 0.9216, 0.9216,  ..., 0.9137, 0.9098, 0.9020],
         ...,
         [0.9294, 0.9294, 0.9255,  ..., 0.5529, 0.9216, 0.8941],
         [0.9294, 0.9294, 0.9255,  ..., 0.8863, 1.0000, 0.9137],
         [0.9294, 0.9294, 0.9255,  ..., 0.9490, 0.9804, 0.9137]]])

常见的Transforms

在机器学习和深度学习中,数据转换(Transforms)是一种常见的操作,用于对数据进行预处理、增强或标准化。下面是一些常见的数据转换操作:

1. 数据标准化(Normalization):将数据按比例缩放,使其落在特定的范围内,通常是将数据映射到0到1之间或者使用均值为0、方差为1的分布(更快收敛)。这可以通过以下方法实现:

- Min - Max标准化:将数据缩放到指定的最小值和最大值之间。

- Z-Score标准化:将数据转化为均值为0、标准差为1的分布。

2. 数据增强(Data Augmentation):用于扩充训练数据集,增强样本的多样性,提高模型的泛华能力。常见的数据增强操作包括:

- 随机裁剪(Random Crop):随机裁剪图像的一部分,以减少位置的依赖性。

- 随机翻转(Random Filp):随机水平或垂直翻转图像,增加数据的多样性。

- 随机旋转(Random Rotation):随机旋转图像的角度,增加数据的多样性。

3. 图像预处理:用于对图像进行预处理,以减少噪声、增强特征或改变图像的外观。一些常见的图像预处理操作包括:

- 图像平滑(Image Smoothing):使用滤波器对图像进行平滑处理,减少噪声。

- 直方图均衡化(Histogram Equalization):增强图像的对比度,使得图像中的像素值更加均匀分布。

- 图像缩放(Image Resizing):改变图像的尺寸,通常用于将图像调整为模型输入的大小。

4. 文本预处理:用于对文本数据进行预处理和清洗,以便更好地适应模型的输入要求。一些常见的文本预处理操作包括:

- 分词(Tokenization):将文本分割成单个的词或字符。

- 去除停用词(Stopword Removal):去除常见的无意义词语,如“a”,“the”等。

- 文本向量化(Text Vectorzation):将文本转换为数值形式,如使用词袋模型或词嵌入。

以上只是一些常见的数据转换操作示例,实际应用中可能会根据任务和数据的特点进行适当的调整和组合。在使用转换操作时,可以使用各种机器学习框架(如PyTorch、TensorFlow)提供的相关库或函数来实现这些操作。

示例代码如下:

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

img_path = "hymenoptera_data/16.jpg"
img = Image.open(img_path)


writer = SummaryWriter("logs")


# totensor使用
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
writer.add_image("lyy", tensor_img)

# Normalize 使用
trans_norm = transforms.Normalize([111,111,111],[10,10,10])
img_norm = trans_norm(tensor_img)
writer.add_image("normalize", img_norm, 2)

# resize
trans_resize = transforms.Resize( (512, 512))
img_resize = trans_resize(img) # 输入的是Image类型的图像
img_resize_tensor = transforms.ToTensor()

tensor_img = tensor_trans(img_resize)
writer.add_image("resize", tensor_img, 0)

# compose 用法
trans_resize_2 =transforms.Resize(123)
trans_compose = transforms.Compose([trans_resize_2, tensor_trans])
img_resize_2 = trans_compose(img)
writer.add_image("resize2", img_resize_2,1)

# randomCrop
trans_random = transforms.RandomCrop((20,50))
trans_compose_2 = transforms.Compose([trans_random, tensor_trans])
for i in range(10):
    img_crop = trans_compose_2(img)
    writer.add_image("randomCrop", img_crop, i)


writer.close()

print("end")

五、torchvision中数据集使用

pytorch提供了很多的数据集,提供给我们学习使用。

进入官网

 选择Dataset数据集

下面就是常用的数据集

 CIFAR10数据集使用示例:

 代码示例:

import torchvision
from torch.utils.tensorboard import SummaryWriter

dataset_transfrom = torchvision.transforms.Compose([torchvision.transforms.ToTensor])

train_set = torchvision.datasets.CIFAR10(root="./cifar10", train=True, transform=dataset_transfrom, download=True)
test_set = torchvision.datasets.CIFAR10(root="./cifar10", train=False, transform=dataset_transfrom, download=True)

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

writer.close()

 提示:这样下载数据集很慢,可以使用迅雷下载, ctrl + CIFAR10  进入类里面,里面有下载地址,如下:

 把下载好的数据集压缩包,放在指定路径下即可。

 然后再tensorboard面板就能看到下载的数据集

六、DataLoader使用

Dataset是整理好的数据集

DataLoader是把这个数据集加载到神经网络中去训练

使用示例:

import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

test_data = torchvision.datasets.CIFAR10("./cifar10", train=False, transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)

writer = SummaryWriter("dataloader")

step = 0
for data in test_loader:
    imgs, targets = data
    writer.add_images("dataloader", imgs, step)
    step = step + 1

writer.close()

解释:

通过创建 test_loader,您可以使用 for 循环迭代它来逐批获取测试数据

  • dataset: 指定要加载的数据集test_data
  • batch_size: 指定每个批次中的样本数量。在这里,每个批次中有64个样本。
  • shuffle: 指定是否对数据进行洗牌(随机重排)。如果设置为 True,每个 epoch(训练周期)开始时,数据将被随机打乱顺序。这对于增加数据的随机性、减少模型对输入顺序的依赖性很有用。
  • num_workers: 指定用于数据加载的子进程数量。在这里,设置为0表示在主进程中加载数据,没有额外的子进程参与。如果设置为大于0的值,将使用多个子进程并行加载数据,可以加快数据加载速度。
  • drop_last: 指定当数据样本数量不能被 batch_size 整除时,是否丢弃最后一个不完整的批次。如果设置为 True,最后一个不完整的批次将被丢弃;如果设置为 False,最后一个不完整的批次将保留。

运行之后在tensorboard面板查看

猜你喜欢

转载自blog.csdn.net/2301_76354366/article/details/132029524
今日推荐