Самый эффективный способ подготовить данные для Pytorch lstm из pandas dataframe - PullRequest
2 голосов
/ 18 июня 2019

Я пытаюсь ввести данные в мой lstm.У меня есть данные из нескольких CSV-файлов, поэтому я создал генератор для их загрузки. Однако у меня возникают некоторые проблемы при подготовке данных для моего lstm.

Я понимаю этот код (я получил его из pytorchдокументы)

seq_len = 5
batch_size= 3
cols_num = 10
hidden_size=20
num_layers = 2

rnn = nn.LSTM(input_size=cols_num, hidden_size=hidden_size, num_layers=num_layers)

data = torch.randn(seq_len, batch_size, cols_num)
h0 = torch.randn(batch_size, seq_len, hidden_size)
c0 = torch.randn(batch_size, seq_len, hidden_size)
output, (hn, cn) = rnn(data)

Однако я думаю, что мое отключение связано с использованием фактических данных, а не torch.randn ().

Это мой текущий генератор:

def data_loader(batch_size, fp, dropcol, seq_len):
    while True:
        for f in fp:
            gc.collect()
            df=pd.read_csv(f)
            df=df.replace(np.nan, 0)
            df=df.drop(dropcol,1)
            df['minute'] = df['minute'].apply(lambda x: min_idx(x))
            row_count, col_count = df.shape
            encoder_input = []
            prev = 0
            for idx, b in enumerate(range(1, row_count)):
                end = prev + batch_size
                window = df.iloc[prev:end]
                prev = end - 1
                w = np.array(window, dtype='float64')
                if w.shape[0] != batch_size:  break
                encoder_input.append(w)
                if idx == seq_len:
                    w0 = encoder_input
                    encoder_input = []
                    yield w0

но я получаю ошибки, когда я запускаю это:

loader = data_loader(batch_size=batch_size, fp=<list of csvs>, dropcol=idcol, seq_len=2)
lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=batch_first)


for batch in loader:
    b = torch.tensor(batch)
    output, hidden = lstm(b)

Ошибка: RuntimeError: Expected object of scalar type Float but got scalar type Double for argument #4 'mat1'

Какая ошибка в том, как я думаю?Кроме того, как мне отформатировать h0 или c0 из данных?

1 Ответ

1 голос
/ 20 июня 2019

Ошибка не в том, как вы думаете, а в том, как модели Pytorch принимают ввод.Тип данных по умолчанию, созданный в тензоре Pytorch, - torch.float64, где принятый моделями тип данных по умолчанию (и, возможно, только) - torch.float32.

Чтобы исправить это, используйте:

b = torch.tensor(batch, dtype=torch.float32)

Это преобразует ваши входные данные в torch.float32.

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