Почему простой seq2seq в pytorch всегда возвращает NaN? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть следующая урезанная модель:

import torch.nn as nn
import torch
import argparse
import torch
import torch.utils.data
from torch import nn, optim
from torch.autograd import Variable
from torch.nn import functional as F
from torchvision import datasets, transforms
from torchvision.utils import save_image
import json
import numpy as np
import datetime
import os


class EncoderRNN(nn.Module):
    def __init__(self, input_size=8, hidden_size=10, num_layers=2):
        super(EncoderRNN, self).__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.num_layers = num_layers

        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.relu = nn.ReLU()
        self.sigmoid = nn.Sigmoid()

        #initialize weights
        nn.init.xavier_uniform(self.lstm.weight_ih_l0, gain=np.sqrt(2))
        nn.init.xavier_uniform(self.lstm.weight_hh_l0, gain=np.sqrt(2))

    def forward(self, input):
        tt = torch
        print input.shape
        h0 = Variable(tt.FloatTensor(self.num_layers, input.size(0), self.hidden_size))
        c0 = Variable(tt.FloatTensor(self.num_layers, input.size(0), self.hidden_size))
        encoded_input, hidden = self.lstm(input, (h0, c0))
        encoded_input = self.sigmoid(encoded_input)
        return encoded_input

train_x = torch.from_numpy(np.random.random((2000,19,8))).float()


train_loader = torch.utils.data.DataLoader(train_x,
    batch_size=64, shuffle=True)

model = EncoderRNN()

optimizer = optim.Adam(model.parameters(), lr=1e-6)

optimizer.zero_grad()


loss_function = torch.nn.BCELoss(reduce=True)

def train(epoch):
    model.train()
    train_loss = 0
    for batch_idx, (data_x) in enumerate(train_loader):
        x = model(Variable(data_x))
        print("output has nan: " + str(np.isnan(x.detach().numpy()).any()))


train(0)

Подводя итог, я думаю, что я в основном просто подаю вход в LSTM со случайными инициализированными скрытыми значениями, а затем получаю сигмоид выводаэтого LSTM.Затем я передаю этот вывод в LSTM-декодер и беру сигмоиду выходного сигнала декодера и использую его в качестве конечного значения.

К сожалению, даже на первой итерации модель часто выводитвектор правильной формы (batch_size, seq_length, seq_dim), но содержит как минимум одно, а иногда и все значения NaN.Что я делаю не так?

Спасибо!

Что я пробовал до сих пор:

  • изменение LSTM на GRU
  • изменение сигмоида наrelu
  • изменение размера скрытого представления
  • передача ошибочного ввода в кодировщик

Редактировать: Извинения всем, кто пытался помочь, когда я сломалсякод - я действительно ценю ваше время, и большое спасибо за помощь!

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