Как передать данные временных рядов в сеть автоэнкодеров для извлечения функций? - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь создать автоматический кодировщик с нуля для своего набора данных. Это вариационный автоэнкодер для извлечения признаков. Я довольно новичок в машинном обучении, и я хотел бы знать, как передать свои входные данные в автоэнкодер.

Мои данные - это данные временного ряда. Это выглядит так:

array([[[  10,   0,   10, ..., 10,   0,   0],
        ...,

        [  0,   12,   32, ...,  2,  2,  2]],

         [[ 0,  3,  7, ...,  7,  3,  0],
        .....
        [ 0,  2,  3, ...,  3,  4,  6]],

       [[1, 3, 1, ..., 0, 10, 2],
        ...,

        [2, 11, 12, ..., 1, 1, 8]]], dtype=int64)

Это стек массивов и форма (3, 1212, 700). И где я могу передать ярлык?

Примеры в сети просты, и нет подробного описания того, как в действительности подавать данные. Любые примеры или объяснения будут очень полезны.

1 Ответ

2 голосов
/ 30 апреля 2019

Это можно решить с помощью генератора. Генератор берет данные временных рядов из 700 точек данных, каждая с 3 каналами и 1212 временными шагами, и выводит пакет. В примере, который я написал, партии имеют одинаковый период времени, например, партия 0 - это первые 10 временных шагов для каждого из ваших 700 образцов, партия 1 - шаги времени 1:11 для каждого из ваших 700 образцов. Если вы хотите как-то все это перепутать, вам следует отредактировать генератор. Эпоха заканчивается, когда каждая партия прошла испытания и прошла обучение. Для нейронной сети очень простой кодер, модель декодера может быть достаточно, чтобы подтвердить концепцию - но вы, вероятно, захотите заменить ее своей собственной моделью. Переменная n используется для определения того, сколько временных шагов используется для автоматического кодера.

import numpy as np
import pandas as pd
import keras
from keras.layers import Dense, Flatten
from tensorflow.python.client import device_lib
# check for my gpu 
print(device_lib.list_local_devices())


# make some fake data

# your data
data = np.random.random((3, 1212, 700))

# this is a generator
def image_generator(data, n):
    start = 0
    end = n
    while end < data.shape[1] -1:
        last_n_steps = data[:,start:end].T
        yield (last_n_steps, last_n_steps)
        start +=1
        end +=1
        # the generator MUST loop
        if end == data.shape[1] -1:
            start = 0
            end = n

n = 10
# basic model - replace with your own
encoder_input = Input(shape = (n,3), name = "encoder_input")
fc = Flatten()(encoder_input)
fc = Dense(100, activation='relu',name = "fc1")(fc)
encoder_output = Dense(5, activation='sigmoid',name = "encoder_output")(fc)

encoder = Model(encoder_input,encoder_output)

decoder_input = Input(shape = encoder.layers[-1].output_shape[1:], name = "decoder_input")
fc = Dense(100, activation='relu',name = "fc2")(decoder_input)
output = Dense(5, activation='sigmoid',name = "output")(fc)

decoder = Model(decoder_input,output)

combined_model_input = Input(shape = (n,3), name = "combined_model_input")
autoencoder = Model(combined_model_input, decoder(encoder(combined_model_input)))

model = Model(input_layer,output_layer)
model.compile(optimizer="adam", loss='mean_squared_error')
print(model.summary())

#and training

training_history = model.fit_generator(image_generator(data, n),
                    epochs =5,
                    initial_epoch = 0,
                    steps_per_epoch=data.shape[2]-n,
                    verbose=1
                   )
...