Пакетная выборка данных из тензора Pytorch - PullRequest
0 голосов
/ 20 июня 2020

У меня есть train_x и valid_x, разделенные из trainX, train_y и valid_y, разделенные из trainY, и они имеют формы, как показано ниже. я хочу классифицировать изображения этикеток LABELS = set (["Лица", "Леопарды", "Мотоциклы", "самолеты"]).

print(train_x.shape, len(train_y))
torch.Size([1339, 96, 96, 3]) 1339

print(valid_x.shape, len(valid_y))
torch.Size([335, 96, 96, 3]) 335

print(testX.shape, len(testY))
torch.Size([559, 96, 96, 3]) 559 

, поэтому я хочу использовать обычный поезд / действителен для данных пакетный код, как показано ниже:

#train the network

n_epochs = 20

valid_loss = []
train_loss = []

for epoch in range(1,n_epochs+1):
    
    cur_train_loss = 0.0
    cur_valid_loss = 0.0
    
    #####################
    #### Train model ####
    #####################
    cnn_model.train()
    
    for data, target in trainLoader:
        if train_on_gpu:
            data, target = data.cuda(), target.cuda()
        optimizer.zero_grad()        
        output = cnn_model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        cur_train_loss += loss.item() * data.size(0)
        
    ########################
    #### Validate model ####
    ########################
    
    cnn_model.eval()
    
    for data, target in validLoader:
        if train_on_gpu:
            data, target = data.cuda(), target.cuda()
        output = cnn_model(data)
        loss = criterion(output, target)
        cur_valid_loss += loss.item() * data.size(0)
    
    # calculate avg loss
    avg_train_loss = cur_train_loss / len(trainLoader.sampler)
    avg_valid_loss = cur_valid_loss / len(validLoader.sampler)
    
    train_loss.append(avg_train_loss)
    valid_loss.append(avg_valid_loss)
    
    print('Epoch: {} \t train_loss: {:.6f} \t valid_loss: {:.6f}'.format(epoch, avg_train_loss, avg_valid_loss))

так что мне для этого нужно сделать? Я ищу это, но ничего конкретного c я не обнаружил. Я хочу использовать для этого pytorch. Я построил модель для другой проблемы, подобной этой, но в ней я использовал DataLoader для загрузки одного пакета данных за раз для обучения и проверки.

1 Ответ

0 голосов
/ 20 июня 2020

Вы можете создать набор данных с torch.utils.data.TensorDataset, где каждая выборка train_x связана с соответствующей меткой в ​​train_y, так что DataLoader может создавать партии, как вы используете к.

from torch.utils.data import DataLoader, TensorDataset

train_dataset = TensorDataset(train_x, train_y)
train_dataloader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)

valid_dataset = TensorDataset(valid_x, valid_y)
valid_dataloader = DataLoader(valid_dataset, batch_size=BATCH_SIZE, shuffle=False)

test_dataset = TensorDataset(testX, testY)
test_dataloader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False)
...