[PytorchLearning] Cree su propio conjunto de datos

Cree su propio conjunto de datos a partir de datos locales

Tome el conjunto de datos de la guerra de gatos y perros como ejemplo

1 conjunto de datos de guerra de gatos y perros

El conjunto de datos Cats vs. Dogs (Cats and Dogs War) es una tarea introductoria que Kaggle y Titanic yuxtaponen, utilizando los datos proporcionados combinados con diferentes algoritmos para realizar el reconocimiento de gatos y perros.
El conjunto de datos original contiene un conjunto de entrenamiento y un conjunto de prueba. El número de imágenes de gatos y perros en el conjunto de entrenamiento es de 12 500 y están ordenados en orden. El conjunto de prueba tiene un total de 12 500 imágenes de gatos y perros mezclados de orden.
Para simplificar la tarea aquí solo uso 4000 imágenes de perros y gatos, un total de 8000 datos, el enlace es el siguiente: Enlace
: https://pan.baidu.com/s/1cJ-f-q5CQV5rdgQVAGv72Q
Código de extracción : ultv
inserte la descripción de la imagen aquí

2 Preprocesamiento de datos

Antes de que los datos se propaguen en el modelo de la red neuronal, primero es necesario asegurarse de quemismo tamaño(Algunos modelos de pirámide también pueden manejar entradas de diferentes tamaños, que no se discutirán esta vez). En el caso de MNIST se ha integrado el formato y tamaño de los datos, solo necesitamos descargar y cargar. Pero para esta tarea, aunque el formato de las imágenes de gatos y perros es jpg, el tamaño no es uniforme, por lo que se requiere una conversión previa. Por ejemplo, en las imágenes se pueden realizar operaciones como cambiar el tamaño y recortar.
Aquí, solo se proporciona un método más simple:cambiar el tamaño
Para todas las imágenes, las redimensionamos al tamaño de 100x100, el código es el siguiente

import cv2
import os
from tqdm import tqdm

DataPath=r'TrainingData'# 训练数据
SavePath=r'ResizedData'

for img_dir in os.listdir(DataPath):
    # 包含类别信息的文件夹
    img_label_path=os.path.join(DataPath,img_dir)
    # 存储处理后的图片的文件夹
    save_label_path=os.path.join(SavePath,img_dir)
    if not os.path.exists(save_label_path):
        os.mkdir(save_label_path)

    # 使用tqdm查看每一类别图片处理进度
    tbar = tqdm(os.listdir(img_label_path), ncols=100)
    for image in tbar:
        # 进入到文件夹下进行图片遍历
        image_path=os.path.join(img_label_path,image)
        # 使用cv2读取图片
        image_old=cv2.imread(image_path)
        image_new=cv2.resize(image_old,(100,100))
        # 保存图像
        save_path=os.path.join(save_label_path,image)
        cv2.imwrite(save_path,image_new)
    print("当前处理的图片类别为{},保存路径为{},已处理完成".format(img_dir, save_label_path))

3 Crea tu propio conjunto de datos

3.1 Conjunto de datos y cargador de datos

Hay dos clases principales que se utilizan para crear conjuntos de datos en Pytroch: Dataset y DataLoader.
Entre ellos, Dataset no es solo una biblioteca para integrar conjuntos de datos (por ejemplo, MNIST y CIFAR están integrados en Datasets), sino también una biblioteca para representar conjuntos de datos.clase abstracta, nuestro conjunto de datos se puede construir con esta clase;
y DataLoader es esencialmente iterable (el método __ iter __ se define internamente), al leer los datos en Datasets, ensamblarlos en un lote y devolver un tensor.
Con todo, Dataset es uno de los parámetros de instancia importantes para construir Dataloader.

3.2 Cómo definir un conjunto de datos

La clase Dataset es la clase principal que debe heredarse de todas las clases de carga de conjuntos de datos en Pytorch. Las dos funciones de miembros privados en la clase principal deben sobrecargarse; de ​​lo contrario, se activará un mensaje de error:

def __getitem__(self,index):
	# 编写支持数据集索引的函数
def __len__(self):
	# 返回数据集的大小

El punto clave es la función getitem, getitem recibe un índice y luego devuelve los datos y las etiquetas de la imagen, este índice generalmente se refiere al índice de una lista, cada elemento de esta lista contiene los datos de la imagen.caminoyEtiquetainformación. Así que aquí presentaré un enfoque más común:

1-制作存储了图片的路径和标签信息的txt
2-将这些信息转化为list,该list每一个元素对应一个样本
3-通过getitem函数,读取数据和标签,并返回数据和标签

3.3 Cree un archivo txt que contenga rutas y etiquetas

Se recomienda utilizar una ruta absoluta para la ruta, en caso de que la lectura falle cuando cambie la posición relativa del archivo.
La etiqueta debe ser una variable entera (gradiente de tensor) y debe comenzar desde 0.
La etiqueta debe ser una variable entera (gradiente de tensor) y debe comenzar desde 0.
La etiqueta debe ser una variable entera (gradiente de tensor) y debe comenzar desde 0.
Di las cosas importantes tres veces, todos deben recordar, de lo contrario Assertion cur_target >= 0 && cur_target < n_classes‘ failed.se activarán los efectos especiales...


import os
import random

DataPath=r'ResizedData'# 训练数据
absolutePath=r'D:\Code\pytorch\Pytorch_Train\catvsdog\data'# 这里需要替换成catvsdog的绝对路径
label=0

if __name__ == '__main__':

    for dataClass in os.listdir(DataPath):

        # 读取猫狗数据
        data=os.listdir(os.path.join(DataPath,dataClass))

        # 打乱顺序
        random.shuffle(data)

        # 训练集占所有数据的4/5
        train_len=len(data)*4//5

        # 将图片按照8:2划分为训练、验证
        train_list,val_list=data[:train_len],data[train_len:]


        # 将训练集写入train.txt
        with open(os.path.join(absolutePath,'train.txt'), 'a')as f:
            for img in train_list:
                f.write(os.path.join(absolutePath,DataPath,dataClass,img)+ ' ' + str(label)+'\n')
        print("标签为{}的训练集图片处理完毕".format(dataClass))

        # 将验证集写入val.txt
        with open(os.path.join(absolutePath,'val.txt'), 'a+')as f:
            for img in val_list:
                f.write(os.path.join(absolutePath,DataPath,dataClass,img) + ' ' + str(label)+'\n')
        print("标签为{}的验证集图片处理完毕".format(dataClass))

        label+=1

3.4 Leer archivo txt, heredar conjunto de datos

La tarea difícil se ha resuelto antes, esta parte no es difícil de entender, directamente en el código.

import torch
import numpy as np
from PIL import Image
from torch.utils.data.dataset import Dataset
import torchvision.transforms as transforms

def read_txt(path):
    # 读取txt文件,将图像路径和标签写入到列表中并返回
    ims,labels=[],[]
    with open(path,'r') as f:
        for sample in f.readlines():
            im,label=sample.strip().split(" ")
            ims.append(im)
            labels.append(label)
    return ims,labels

class ImageDataset(Dataset):
    # 重载DataLoader

    def __init__(self, txtpath, transform=None):

        super().__init__()
        self.ims, self.labels = read_txt(txtpath)
        self.transform = transform


    def __getitem__(self, index):

        im_path=self.ims[index]
        label=self.labels[index]

        # 使用Image库处理图片,将其转化为张量
        image=Image.open(im_path)
        transf = transforms.ToTensor()
        image = transf(image)

        # image = self.transform(image).float().cuda()
        label=torch.from_numpy(np.asarray(label,dtype=np.int32)).long()

        return image,label

    def __len__(self):
        return len(self.ims)


Los archivos posteriores de modelos y trenes se han introducido anteriormente, por lo que no los repetiré aquí.

Apéndice: Enlaces de proyectos

Enlace: https://pan.baidu.com/s/1f-Gy4CAzrB0c7fUhvsKing
Código de extracción: lo59

poema del dia

regresar
Tao Yuan Ming

   Vuelve, vuelve, ¿no volverá el huhu salvaje? Ya que consideras tu corazón como tu forma, ¿cómo puedes sentirte melancólico y solitario?Si comprendes el pasado, no serás advertido, y si conoces el futuro, puedes perseguirlo.No está lejos del verdadero camino perdido, y siento que hoy está bien y ayer estuvo mal. Zhou Yaoyao vuela a la ligera y el viento sopla su ropa. Pregúntale a Zhengfu el camino antes, odia el amanecer del amanecer.

   Nai Zhan Hengyu, Zai Xin Zai Ben. Los sirvientes son bienvenidos, los niños esperan en la puerta. Los tres caminos están desiertos, pero aún existen los pinos y los crisantemos. Llevando a los niños a la habitación, hay botellas de vino. Introduce la maceta por discreción y disfruta de la belleza del jardín. Apoyado en la ventana sur para expresar orgullo, la facilidad de juzgar las rodillas. El jardín está lleno de diversión y la puerta siempre está cerrada aunque esté arreglada. Para ayudar a los viejos a descansar, a rectificar la cabeza y a velar. La nube no tiene corazón para salir de Xiu, y el pájaro sabe regresar cuando está cansado. Jing Yiyi está a punto de entrar, acariciando el pino solitario y demorándose.

   Vuelve y ven, por favor dame un respiro. El mundo está en mi contra, ¿cómo puedo volver a pedirlo? Por favor, las palabras de amor de los familiares y reproducir música y libros para aliviar las preocupaciones. El granjero le dijo a Yu Yichun que algo le sucedería a Xichou. O pide un carro de toallas, o un bote solitario. Es delgado y alto para encontrar barrancos, y también escarpado para atravesar colinas. Mu Xinxin es próspero, y el manantial gotea y comienza a fluir. Cuando todas las cosas están bien, siento el resto de mi vida.

   ¡Se acabó! ¿Cuánto tiempo durará en el universo físico? ¿Quieres quedarte o no? ¿Por qué quieres hacerlo? La riqueza y el honor no son mi deseo, y la ciudad natal imperial es impredecible. Huai Liangchen va solo o trabaja duro plantando palos. Deng Donggao escribió poemas con Shu Xiao, Lin Qingliu. ¡El parloteo y la multiplicación se agotaron, y el destino de Lefu será ridiculizado nuevamente!

Supongo que te gusta

Origin blog.csdn.net/weixin_43427721/article/details/122673634
Recomendado
Clasificación