Реализация задачи «многие ко многим» - PullRequest
0 голосов
/ 07 декабря 2018

Извините, если я не ясно представляю свою проблему, английский не является моим родным языком

Задача

Краткое описание:

Я хочу обучить модель, которая вводит карту x (с формой [n_sample, timestamp, feature]) до выхода y (с точно такой же формой).Это как отображение 2 пробелов

Более длинная версия:

У меня есть 2 float ndarray s формы [n_sample, timestamp, feature], представляющих MFCC особенность n_sample аудиофайла.Эти 2 ndarray - речь двух спикеров одного и того же корпуса, которая была выровнена DTW.Давайте назовем эти 2 массива x и y.Я хочу тренировать модель, которая предсказывает y[k], учитывая x[k].Это как отображение из пространства x в пространство y, и результат должен быть точно такой же формы, как и у ввода

Что я пробовал

Это проблема временного ряда, поэтому я решаюиспользовать RNN подход.Вот мой код в PyTorch (я добавил комментарий к коду. Для простоты я удалил расчет среднего убытка).Обратите внимание, что я пробовал много вариантов для скорости обучения, поведение по-прежнему

Определение класса

class Net(nn.Module):
    def __init__(self, in_size, hidden_size, out_size, nb_lstm_layers):
        super().__init__()
        self.in_size = in_size
        self.hidden_size = hidden_size
        self.out_size = out_size
        self.nb_lstm_layers = nb_lstm_layers

        # self.fc1 = nn.Linear()
        self.lstm = nn.LSTM(input_size=self.in_size, hidden_size=self.hidden_size, num_layers=self.nb_lstm_layers, batch_first=True, bias=True)
        # self.fc = nn.Linear(self.hidden_size, self.out_size)
        self.fc1 = nn.Linear(self.hidden_size, 128)
        self.fc2 = nn.Linear(128, 128)
        self.fc3 = nn.Linear(128, self.out_size)

    def forward(self, x, h_state):
        out, h_state = self.lstm(x, h_state)
        output_fc = []

        for frame in out:
            output_fc.append(self.fc3(torch.tanh(self.fc1(frame)))) # I added fully connected layer to each frame, to make an output with same shape as input

        return torch.stack(output_fc), h_state

    def hidden_init(self):
        if use_cuda:
            h_state = torch.stack([torch.zeros(nb_lstm_layers, batch_size, 20) for _ in range(2)]).cuda()
        else:
            h_state = torch.stack([torch.zeros(nb_lstm_layers, batch_size, 20) for _ in range(2)])

        return h_state

Шаг обучения:

net = Net(20, 20, 20, nb_lstm_layers)
optimizer = optim.Adam(net.parameters(), lr=0.0001, weight_decay=0.0001)
criterion = nn.MSELoss()

for epoch in range(nb_epoch):
    count = 0
    loss_sum = 0

    batch_x = None
    for i in (range(len(data))): 
    # data is my entire data, which contain A and B i specify above.
        temp_x = torch.tensor(data[i][0])
        temp_y = torch.tensor(data[i][1])

        for ii in range(0, data[i][0].shape[0] - nb_frame_in_batch*2 + 1): # Create batches 
            batch_x, batch_y = get_batches(temp_x, temp_y, ii, batch_size, nb_frame_in_batch)  
            # this will return 2 tensor of shape (batch_size, nb_frame_in_batch, 20), 
            # with `batch_size` is the number of sample each time I feed to the net, 
            # nb_frame_in_batch is the number of frame in each sample
            optimizer.zero_grad()

            h_state = net.hidden_init()

            prediction, h_state = net(batch_x.float(), h_state)
            loss = criterion(prediction.float(), batch_y.float())

            h_state = (h_state[0].detach(), h_state[1].detach())

            loss.backward()
            optimizer.step()

Проблема в том, чтопотеря не уменьшается, а сильно колеблется, без четкого поведения

enter image description here

Пожалуйста, помогите мне.Любое предложение будет с благодарностью.Если кто-то может проверить мой код и предоставить какой-либо комментарий, это было бы так любезно.
Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Кажется, что сеть ничего не узнает из ваших данных, следовательно, колебания потерь (так как вес зависит только от случайной инициализации).Есть кое-что, что вы можете попробовать:

  • Попробуйте нормализовать данные (это довольно широкое предложение, но я не могу дать вам более подробную информацию, так как у меня нет ваших данных, но нормализуйте их, чтобыопределенный диапазон, такой как [0, 1], или к среднему и стандартному значению, стоит попробовать)
  • Одна очень типичная проблема LSTM в pytorch - его входное измерение весьма отличается от других типов нейронныхсеть .Вы должны ввести в свою сеть тензор с формой (seq_len, batch, input_size).Вы должны пойти здесь , раздел LSTM для более подробной информации
  • Еще одна вещь: попробуйте настроить ваши гиперпараметры.LSTM сложнее тренировать по сравнению с FC или CNN (по моему опыту).

Скажите, если у вас есть улучшения.Отладка нейронной сети всегда трудна и полна потенциальных ошибок кодирования

0 голосов
/ 08 мая 2019

Может проблема была в расчете потерь.Попробуйте суммировать потери каждого временного шага в последовательности, а затем взять среднее значение по партии.Пусть это поможет

0 голосов
/ 10 декабря 2018

С большинством алгоритмов ML трудно диагностировать, не видя данных.Из-за несоответствия результатов ваших потерь это может быть проблемой при предварительной обработке ваших данных.Вы пытались сначала нормализовать данные?Часто при значительных колебаниях результатов одно из ваших значений входных нейронов может искажать вашу функцию потерь, что делает ее неспособной найти правильное направление. Как нормализовать массив NumPy в пределах определенного диапазона? Это пример нормализации звука, но я бы также попытался отрегулировать скорость обучения, так как она выглядит высокой, и, возможно, удалить скрытый слой.

...