Я смотрю на следующую статью: 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, «изначально управляя сетью» с грехом + константой перед фаза обучения для установки начального состояния сети. Почему они это делают? Возможно ли это в Керасе?
Заранее спасибо