gpt4 book ai didi

keras - 简单的 Keras LSTM 模型的 PyTorch 版本

转载 作者:行者123 更新时间:2023-12-04 01:47:15 25 4
gpt4 key购买 nike

尝试将 Keras 中的简单 LSTM 模型转换为 PyTorch 代码。 Keras 模型仅在 200 个 epoch 后收敛,而 PyTorch 模型:

  • 需要更多的 epoch 才能达到相同的损失水平(200 对 ~8000)
  • 似乎过度拟合输入,因为预测值不接近 100

  • 这是 Keras 代码:
    from numpy import array
    from keras.models import Sequential
    from keras.layers import LSTM
    from keras.layers import Dense

    X = array([10,20,30,20,30,40,30,40,50,40,50,60,50,60,70,60,70,80]).reshape((6,3,1))
    y = array([40,50,60,70,80,90])
    model = Sequential()
    model.add(LSTM(50, activation='relu', recurrent_activation='sigmoid', input_shape=(3, 1)))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mse')
    model.fit(X, y, epochs=200, verbose=1)
    x_input = array([70, 80, 90]).reshape((1, 3, 1))
    yhat = model.predict(x_input, verbose=0)
    print(yhat)

    这是等效的 PyTorch 代码:
    from numpy import array
    import torch
    import torch.nn as nn
    import torch.nn.functional as F

    X = torch.tensor([10,20,30,20,30,40,30,40,50,40,50,60,50,60,70,60,70,80]).float().reshape(6,3,1)
    y = torch.tensor([40,50,60,70,80,90]).float().reshape(6,1)

    class Model(nn.Module):
    def __init__(self):
    super(Model, self).__init__()
    self.lstm = nn.LSTM(input_size=1, hidden_size=50, num_layers=1, batch_first=True)
    self.fc = nn.Linear(50, 1)

    def forward(self, x):
    batches = x.size(0)
    h0 = torch.zeros([1, batches, 50])
    c0 = torch.zeros([1, batches, 50])
    (x, _) = self.lstm(x, (h0, c0))
    x = x[:,-1,:] # Keep only the output of the last iteration. Before shape (6,3,50), after shape (6,50)
    x = F.relu(x)
    x = self.fc(x)
    return x

    model = Model()
    criterion = nn.MSELoss()
    optimizer = torch.optim.Adam(model.parameters())

    n_epochs = 8000
    for epoch in range(n_epochs):
    model.train()
    optimizer.zero_grad()
    y_ = model(X)
    loss = criterion(y_, y)
    loss.backward()
    optimizer.step()
    print(f"Epoch {epoch+1}/{n_epochs}, loss = {loss.item()}")

    model.eval()
    x_input = torch.tensor([70, 80, 90]).float().reshape((1, 3, 1))
    yhat = model(x_input)
    print(yhat)

    唯一可能的区别是初始权重和偏差值,但我不认为稍微不同的权重和偏差可能会导致如此大的行为差异。
    我在 PyTorch 代码中遗漏了什么?

    最佳答案

    行为差异是因为 LSTM API 中的激活函数。通过将激活更改为 tanh,我也可以在 Keras 中重现该问题。

    model.add(LSTM(50, activation= 'tanh' , recurrent_activation='sigmoid', input_shape=(3, 1)))

    pytorch LSTM API 中没有将激活函数更改为“relu”的选项。
    https://pytorch.org/docs/stable/nn.html#lstm

    从这里获取 LSTM 实现,https://github.com/huggingface/torchMoji/blob/master/torchmoji/lstm.py
    并将 hardsigmoid/tanh 更改为 sigmoid/relu,模型也会在 pytorch 中收敛。

    关于keras - 简单的 Keras LSTM 模型的 PyTorch 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815899/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com