python - 实现多对多回归任务

标签 python deep-learning lstm pytorch

对不起,如果我没有清楚地表达我的问题,英语不是我的母语

问题

简短描述:

我想训练一个映射输入的模型 x (形状为 [n_sample, timestamp, feature] )到输出 y (具有完全相同的形状)。就像映射2个空间

更长的版本:

我有 2 个 float ndarray形状的 s [n_sample, timestamp, feature] , 代表 MFCC n_sample的特征音频文件。这些 2 ndarray是同一个语料库的 2 个说话者的语音,由 DTW 对齐。让我们将这 2 个数组命名为 xy .我想训练一个预测 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

请帮帮我。任何建议将不胜感激。如果有人可以检查我的代码并提供一些评论,那就太好了。
提前致谢!

最佳答案

网络似乎没有从您的数据中学到任何东西,因此损失波动很大(因为权重仅取决于随机初始化)。您可以尝试以下方法:

  • 尝试规范化数据(这个建议很广泛,但我不能给你更多的细节,因为我没有你的数据,但是将它规范化到一个特定的范围,比如 [0, 1],或者一个均值和标准值值得一试)
  • pytorch 中 LSTM 的一个非常典型的问题是它的输入维度与其他类型的神经网络有很大不同。您必须将形状为 (seq_len, batch, input_size) 的张量输入网络。你应该去here , LSTM 部分以获得更好的细节
  • 还有一件事:尝试调整您的超参数。与 FC 或 CNN 相比,LSTM 更难训练(根据我的经验)。

如果你有进步,请告诉我。调试神经网络总是很困难并​​且充满潜在的编码错误

关于python - 实现多对多回归任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53667213/

相关文章:

machine-learning - 用于向量到字符序列转换的 LSTM

python - 使用不同版本的 fixture 运行一项测试

python - Python 3 上的 Numpy

python - 如何调整多 channel tiff 图像的大小?

machine-learning - CNTK 中的 cntk.blocks.Stabilizer() 函数有什么作用?

java - 深度学习4j : update a saved model

machine-learning - LSTM 的输入到底是什么?

python - 如何使数据框中的每个组具有相同的大小?

python - SQLAlchemy 和连接,我们没有外键

python - 具有高级文本效果的图像库?