Извините, если я не ясно представляю свою проблему, английский не является моим родным языком
Задача
Краткое описание:
Я хочу обучить модель, которая вводит карту 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](https://i.stack.imgur.com/90wuG.png)
Пожалуйста, помогите мне.Любое предложение будет с благодарностью.Если кто-то может проверить мой код и предоставить какой-либо комментарий, это было бы так любезно.
Заранее спасибо!