Pytorch: рдбреЗрдЯрд╛рд▓реЛрдбрд░ рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдмреИрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдЬреВрди 2017  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pytorch/pytorch

рдХреНрдпрд╛ рдбреЗрдЯрд╛рд▓реЛрдбрд░ рд╕реЗ рдПрдХ рдмреИрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдЕрдк рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмреИрдЪ рд▓реМрдЯрд╛рддрд╛ рд╣реВрдВред
рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдбреЗрдЯрд╛рд▓реЛрдбрд░ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

next(iter(data_loader)) ?

рд╕рднреА 18 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

next(iter(data_loader)) ?

рдмрдврд╝рд┐рдпрд╛, рдореИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЙрд╕рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж!

рд╡рд╣ рдЙрддреНрддрд░ рд░реИрдо рдореЗрдореЛрд░реА рдХреЗ рд░реИрдЦрд┐рдХ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреЛ рдЙрддреНрддреЗрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд▓реВрдк (рдФрд░ рд▓реВрдк рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдХреЛрдб) рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░ рд╡реНрдпрд╡рд╕рд╛рдп: /

:+1: рд╕реЗ @hyperfraise. рдпрд╣ рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдмрдирд╛рддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд (рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ) рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛:

dataloader_iterator = iter(dataloader)
for i in range(iterations):     
    try:
        X, Y = next(dataloader_iterator)
    except:
        dataloader_iterator = iter(train_loader)
        X, Y = next(dataloader_iterator)
    do_backprop(X, Y)

рдлреЙрд░-рд▓реВрдк рдХреЗ рджреМрд░рд╛рди рдореЗрдореЛрд░реА рдСрдХреНрдпреВрдкреЗрд╢рди рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝рддрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЕрдВрдХ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реВрдВ (рдпрджрд┐ рдЕрднреА рддрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)

рдпрд╣ рдПрдХ рдореЗрдореЛрд░реА рд▓реАрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдпрд╣ рддрдереНрдп рдХрд┐ рдЖрдкрдХрд╛ рд▓реВрдк рдмреЗрд╣рдж рд╡реНрдпрд╕реНрдд рд╕реНрдкреЙрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╡реНрдпрд╕реНрдд рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдкреНрдд рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрдЯрд╛рд▓реЛрдбрд░ рдЗрдЯрд░реЗрдЯрд░ рдмрд╣реБрдд рдХрдо рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдПрдВ рдирд╣реАрдВ рд╣реИрдВ

рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдЧрд▓рдд рдереАред рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд░рд┐рд╕рд╛рд╡ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдерд╛ (рдореИрдВ рдЙрддреНрд╕реБрдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд┐рдП рдмрд┐рдирд╛ vars рдкрд░ рд▓рдЯрдХ рд░рд╣рд╛ рдерд╛)ред

рдЕрдЧрд▓реА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп "BrokenPipeError: [Errno 32] рдЯреВрдЯрд╛ рд╣реБрдЖ рдкрд╛рдЗрдк" рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (iter (dataloader))

рдореИрдВрдиреЗ рд▓реВрдк рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмреИрдЪреЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:

    for i in range(n):
       batch = next(iter(data_loader))

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдореБрдЭреЗ рдПрдХ рд╣реА рдмреИрдЪ рдорд┐рд▓рддрд╛ рд░рд╣рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд __getitem__ рдХреЛ рд╕рдорд╛рди item рдЗрдВрдбреЗрдХреНрд╕ рдорд┐рд▓рддрд╛ рд░рд╣рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ?

@shaibagon
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк iter(dataloader) рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХрдХреНрд╖рд╛ _DataLoaderIter рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд▓реВрдк рдореЗрдВ, рдЖрдк рдПрдХ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ n рдмрд╛рд░ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдмреИрдЪ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ _DataLoaderIter рдмрдирд╛рдирд╛ рдФрд░ рдЙрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдирд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рд╕рднреА рдмреИрдЪреЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, _DataLoaderIter рдПрдХ StopIteration рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред

рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:

    dataloader_iterator = iter(dataloader)
    for i in range(iterations):
        try:
            data, target = next(dataloader_iterator)
        except StopIteration:
            dataloader_iterator = iter(dataloader)
            data, target = next(dataloader_iterator)
        do_something()

рдпрд╣ рдмрд╣реБрдд рдмрджрд╕реВрд░рдд рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдореБрджреНрджрд╛ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╡рд╣рд╛рдВ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреА рднреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ srossi93 рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рдиред рдЬрдм рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЪрдХреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рдХрднреА-рдХрднреА рдореБрдЭреЗ рдПрдХ рдЕрдирджреЗрдЦрд╛ рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИ: ConnectionResetError: [Errno 104] Connection reset by peer ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рдбреЗрдЯрд╛рд▓реЛрдбрд░ рдкрд░ num_workers рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИред рдХреЛрдИ рдЕрдиреНрдп рдЙрдкрд╛рдп?

thx @ srossi93

рд╢рд╛рдпрдж рдпрд╣ рдХреЛрдб рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИ?

def inf_train_gen():
    while True:
        for images, targets in enumerate(dataloader):
            yield images, targets
gen = inf_train_gen
for it in range(num_iters):
    images, targets = gen.next()    

рдпрджрд┐ рдореИрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдХреНрдпрд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдлреЗрд░рдмрджрд▓ рд╣реЛрдЧрд╛?
dataloader_iterator = iter(dataloader) for i in range(iterations): try: X, Y = next(dataloader_iterator) except: dataloader_iterator = iter(train_loader) X, Y = next(dataloader_iterator) do_backprop(X, Y)

рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдЬреЗрдирд░реЗрдЯрд░/рдЗрдЯрд░реЗрдЯрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

@ Yamin05114 рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рд░ рдмрд╛рд░ рд░реАрд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ iter(dataloader) рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдлреЗрд░рдмрджрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдЫреЛрдЯреА рд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдиреАрдЪреЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд┐рдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЫреЛрдЯреЗ рд╕реЗрдЯ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдСрд░реНрдбрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреЗрд░рдмрджрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдорд╛рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкреБрдЦреНрддрд╛ рд╕рдмреВрдд рд╣реИ рдХрд┐ рдЬрдм рднреА рд╣рдо iter (train_loader) рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдбреЗрдЯрд╛ рдореЗрдВ рдлреЗрд░рдмрджрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

import torch
from torch.utils.data import Dataset, DataLoader

dataset = torch.tensor([0, 1, 2, 3, 4, 5, 6, 7])
dataloader = DataLoader(dataset, batch_size=2, shuffle=True, num_workers=3)
iterloader = iter(dataloader)

for i in range(0, 12):

    try:
        batch = next(iterloader)
    except StopIteration:
        iterloader = iter(dataloader)
        batch = next(iterloader)

    print("iteration" + str(i))
    print(batch)

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ @shaibagon рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ ... рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреИрдЪреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ (рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдорд╛рди рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рдЗрд╕рд▓рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реБрдЖред

for i in range(0, 12):
    batch = next(iter(dataloader))
    print("iteration: " + str(i))
    print(batch)

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ dataset рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдкрд╛рдЗрдЯреЛрд░рдЪ рд╕реЗ data.Dataset рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ __getitem__ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ idx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

**some dataset instance called _data_
data=Dataset(**kwargs)
for i in range(10):
     data[i]

рдпрд╛

for i in range(10):
     data_batch.__getitem__(i)
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕