Как я могу позволить RNN генерировать временной ряд синусоидальной волны, учитывая постоянный временной ряд в качестве входных данных в Керасе - PullRequest
0 голосов
/ 13 апреля 2020

Я смотрю на следующую статью: https://ieeexplore.ieee.org/document/6797581 В частности, раздел 3.4 о генераторе синусоидальной волны (который также сопровождается некоторыми пояснениями в разделе 6.3.

Я хотел бы чтобы более или менее повторить их настройку и использовать RNN, который принимает временные ряды с постоянной частотой в качестве входных данных и генерирует временные ряды синусоидальной волны в качестве прогнозирования выходных данных.

Я совершенно новичок в RNN и Keras, поэтому, пожалуйста, имейте в виду со мной.

Насколько я понимаю, у меня должен быть набор train_x, содержащий наборы временных рядов с постоянной частотой, например:

train_x = [[i for j in range(time_steps)] for i in range(1, max_freq)] * 10

И train_y должен быть набором синусоидальных волн Временной ряд, по одному связанному с каждым частотным временным рядом:

train_y = [create_sine(freq, np.random.uniform(0,1)) for freq in range(1, max_freq)] * 10

Где

def create_sine(frequency, offset):
  return np.sin(frequency * np.linspace(offset, 2 * np.pi + offset, time_steps))

возвращает список, содержащий временной ряд синусоидальной волны.

Является ли это правильным способ преобразования train_x в трехмерный тензор для ввода в RNN? Я понимаю, что это означает, что существует неопределенное количество выборок, временных интервалов 'time_step' и функции 1. Это orrect?

train_x.reshape(-1, time_steps, 1)

Теперь настраиваем LNTM RNN с, возможно, плотным слоем и некоторым выпадением (сейчас это не важно):

input_series = Input(shape=(time_steps, 1), name='Input') 
lstm = LSTM(units=100)(input_series)
hidden = Dense(units=100, activation='relu')(lstm)
dropout = Dropout(rate=0.1)(hidden)
output = Dense(units=1, activation='relu')(dropout)

model = Model(input_series, output)
model.compile('adam', 'mean_squared_error')

Здесь я немного запутался. Какую ошибку нужно минимизировать в этом случае? Ошибка между синусоидами train_y и генерируемыми синусоидами, точка за точкой? Знает ли Керас, как сопоставить эти два?

Когда я тренирую эту модель, я получаю убыток, который постоянно равен 0,5. Что здесь происходит?

model.fit(train_x, train_y, epochs=200)

Опробование модели на том же самом data then

test_x = train_x 
test_y = train_y
print(model.predict(test_x))

Предоставляет только список списков, содержащих один ноль, например:

[[0.]
 [0.]
 [0.]
 [0.]
 [0.]
 ...
 [0.]
 [0.]
 [0.]
 [0.]
 [0.]]

Почему не выводится временной ряд в каждом списке? Может ли RNN выводить временные ряды, как я ищу? Если нет, то как авторы статьи достигли sh этого?

Я также не понимаю, что авторы подразумевают в разделе 6.3, «изначально управляя сетью» с грехом + константой перед фаза обучения для установки начального состояния сети. Почему они это делают? Возможно ли это в Керасе?

Заранее спасибо

...