人这辈子千万不要马虎两件事
一是找对爱人、二是选对事业
因为太阳升起时要投身事业
太阳落山时要与爱人相拥
一、准备数据集
蚂蚁蜜蜂数据集
蚂蚁蜜蜂的图片,文件名就是数据的label
二、使用Dataset加载数据
打开pycharm,选择Anaconda创建的pytorch环境
将数据集放在项目的根目录下,并修改文件名
新建 read_data.py文件,编写如下代码
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面板查看