Увеличение размера набора данных для нейронной сети Pytorch - PullRequest
1 голос
/ 03 ноября 2019

В настоящее время у меня есть обучение нейронной сети с batch_size = 1, чтобы запустить его через несколько графических процессоров, мне нужно увеличить размер пакета, чтобы он был больше, чем объем графических процессоров, поэтому я хочу, чтобы batch_size = 16, хотя, как у меняНастройка данных Я не уверен, как это изменить

Данные читаются из CSV-файла

raw_data = pd.read_csv("final.csv")
train_data = raw_data[:750]
test_data = raw_data[750:]

Затем данные нормализуются и превращаются в Tensors

# normalize features
scaler = MinMaxScaler(feature_range=(-1, 1))
scaled_train = scaler.fit_transform(train_data)
scaled_test = scaler.transform(test_data)
# Turn into Tensorflow Tensors
train_data_normalized = torch.FloatTensor(scaled_train).view(-1)
test_data_normalized = torch.FloatTensor(scaled_test).view(-1)

Затем данные преобразуются в Tensor Tuple формата [input list, output], например (тензор ([1,3,56,63,3]), тензор ([34]))

# Convert to tensor tuples
def input_series_sequence(input_data, tw):
 inout_seq = []
 L = len(input_data)
 i = 0
 for index in range(L - tw):
    train_seq = input_data[i:i + tw]
    train_label = input_data[i + tw:i + tw + 1]
    inout_seq.append((train_seq, train_label))
    i = i + tw
 return inout_seq


train_inout_seq = input_series_sequence(train_data_normalized, train_window)
test_input_seq = input_series_sequence(test_data_normalized, train_window)

И затем модель обучается следующим образом:

for i in range(epochs):

for seq, labels in train_inout_seq:
    optimizer.zero_grad()
    model.module.hidden_cell = model.module.init_hidden()
    seq = seq.to(device)
    labels = labels.to(device)
    y_pred = model(seq)

    single_loss = loss_function(y_pred, labels)
    single_loss.backward()
    optimizer.step()

Итак, я хочу знать, как именно изменить размер batch_size с 1 -> 16. Нужно ли использовать набор данных и Dataloader? и если да, то как именно он будет соответствовать моему текущему коду, спасибо!

Редактировать: Модель определяется следующим образом, возможно, придется изменить функцию пересылки?

class LSTM(nn.Module):
def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):
    super().__init__()
    self.hidden_layer_size = hidden_layer_size

    self.lstm = nn.LSTM(input_size, hidden_layer_size)

    self.linear = nn.Linear(hidden_layer_size, output_size)

    self.hidden_cell = (torch.zeros(1, 1, self.hidden_layer_size),
                        torch.zeros(1, 1, self.hidden_layer_size))

def init_hidden(self):
    return (torch.zeros(1, 1, self.hidden_layer_size),
            torch.zeros(1, 1, self.hidden_layer_size))

def forward(self, input_seq):
    lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq), 1, -1), self.hidden_cell)
    predictions = self.linear(lstm_out.view(len(input_seq), -1))
    return predictions[-1]

1 Ответ

0 голосов
/ 03 ноября 2019

Вы можете сделать это, обернув свою модель классом nn.DataParallel.

model = nn.DataParallel(model)

Поскольку сейчас у меня нет доступа к нескольким графическим процессорам и вашим данным для тестирования, я направлю вас сюда

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...