situación de la lista de tensores del cargador de datos del conjunto de datos

1. Recurrencia del problema


from torch.utils.data import Dataset
from torch.utils.data import dataloader
import torch
import numpy as np

class data(Dataset):
    def __init__(self):
        super().__init__()
        pass
    def __len__(self):
        return 2
    def __getitem__(self, index):
        a1=[torch.Tensor([1]) for i in range(3)]
        a2=torch.Tensor([2])
        return a1,a2
data_set=data()
data_loader=dataloader.DataLoader(data_set)

for dat1,dat2 in enumerate(data_loader):
    # print(batch)
    print(dat1)
    print(dat2)
    print('------------------------')
'''
0
[[tensor([[1.]]), tensor([[1.]]), tensor([[1.]])], tensor([[2.]])]
------------------------
1
[[tensor([[1.]]), tensor([[1.]]), tensor([[1.]])], tensor([[2.]])]
------------------------
'''

'''

Como se muestra en el código anterior, getitem espera devolver una lista de tensores y un tensor, pero solo se puede recibir una lista cuando se llama a dataloader.Como se puede ver en el contenido impreso, dataloader combina los dos valores devueltos por getitem.

2. Formulación y verificación de hipótesis

1. ¿Es porque getitem solo puede devolver un valor?

from torch.utils.data import Dataset
from torch.utils.data import dataloader
import torch
import numpy as np

class data(Dataset):
    def __init__(self):
        super().__init__()
        pass
    def __len__(self):
        return 2
    def __getitem__(self, index):
        # a1=[torch.Tensor([1]) for i in range(3)]
        # a2=[torch.Tensor([2]) for i in range(3)]
        a1=torch.Tensor([1])
        a2=torch.Tensor([2])
        return a1,a2
data_set=data()
data_loader=dataloader.DataLoader(data_set)

for dat1,dat2,dat3 in enumerate(data_loader):
    # print(batch)
    print(dat1)
    print(dat2)
    print('------------------------')
'''
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/liuchun/Downloads/codes/MHCAmapping/test.ipynb Cell 21 in ()
     18 data_set=data()
     19 data_loader=dataloader.DataLoader(data_set)
---> 21 for dat1,dat2,dat3 in enumerate(data_loader):
     22     # print(batch)
     23     print(dat1)
     24     print(dat2)

ValueError: not enough values to unpack (expected 3, got 2)
'''

Como se puede ver en el código de verificación anterior, incluso los valores devueltos del mismo tipo no se pueden recibir por separado.Los valores específicos devueltos son:

[tensor([[1.]]), tensor([[2.]])]

El programa también combinará automáticamente los dos valores devueltos en una lista. Desde este punto de vista, la suposición es cierta: no importa cuántos valores se devuelvan en getitem, solo se pueden usar dos variables para recibirlos en el cargador de datos: una se usa para recibir el tamaño del lote y la otra se usa para recibir la variable devuelta (múltiples variables se fusionan automáticamente en la lista de tensores)

3. Ver la configuración de la fuente

1 iterador iterable

Para comprender el cargador de datos, primero debe distinguir estos dos conceptos.
iterable: iterable, este objeto tiene el método __iter__()
iterador: iterador, este objeto tiene el método __iter__(), next
() Cada iterador debe ser iterable, iterable no es necesariamente iterador
Ejemplo:
lista es iterable pero no iterador, puede convertir lista iterador a través de la función iter, o convertir el iterador en iterable a través de la función list.
Complemento: todos los objetos que pueden generarse con for son objetos iterables, y todos los objetos que pueden generarse con next son objetos iteradores.

1. iter () convierte un objeto iterable en un objeto iterador

# code
s="GFG"
s=iter(s)
print(s)
print(next(s))
print(next(s))
print(next(s))
'''
out:
<str_iterator object at 0x7f6351e94650>
G
F
G
'''

2. siguiente ()

Muestra el elemento de cada iterador, el ejemplo se muestra en el código anterior.
¿Cómo entender a continuación? Se puede utilizar para generar una secuencia infinitamente larga. La siguiente función puede llamar al objeto iterador y devolver continuamente los siguientes datos hasta que se produzca un error StopIteration cuando no haya datos. Los datos se pueden considerar como una secuencia ordenada, pero no podemos saber la longitud de la secuencia de antemano, por lo que solo podemos usar la función next() para intentar calcular los siguientes datos a pedido.

3. Cómo usar objetos iterables

s=[1,2,3,4,5]
for i in s:
    print(i)
print('---------------------------------')
iters = iter(s)
while 1:
    try:
        print(next(iters))
    except StopIteration:
        break
'''
out:
1
2
3
4
5
---------------------------------
1
2
3
4
5
'''

4. enumerar()

El método de llamada del cargador de datos es:

for batch,data in enumerate(dataloader):

Dataloader es un objeto iterable. Sabemos que se puede llamar de las dos formas mencionadas en 3, pero todos los programas que vemos en realidad usan la función de enumeración. Esto se debe a que la función de enumeración también cuenta al devolver el elemento del objeto iterable, lo cual es conveniente para las llamadas de tecnología de programas.

Supongo que te gusta

Origin blog.csdn.net/m0_45290027/article/details/131386259
Recomendado
Clasificación