#python #tensorflow #keras #tensorflow2.0
#python #тензорный поток #keras #tensorflow2.0
Вопрос:
Новичок в нейронных сетях, поэтому, пожалуйста, исправьте мой синтаксис.
Я пытаюсь создать LSTM RNN, который будет предсказывать последовательность Фибоначчи. Когда я запустил приведенный ниже код, потери остаются невероятно высокими (около 35339663592701874176
).
- Почему форма ввода должна быть
(batch_size, timesteps, input_dim)
? В моем примере у меня есть100
записи данных, так что это было бы моимbatch_size
, и последовательность Фибоначчи принимает2
входные данные, так что это было быinput_dim
, но что былоtimesteps
бы в этом случае?1
? - Разве значение
units
LSTM не должно быть 1? Если я правильно понимаю, «единицы» — это просто количество узлов скрытых состояний, которые находятся в LSTM. Таким образом, теоретически, каждый из 2 входных данных будет иметь вес коэффициента «1» по отношению к этому скрытому состоянию после обучения. - Будет ли RNN подходящей моделью для этой проблемы? Когда я смотрел онлайн, большинству людей нравится использовать последовательность Фибоначчи в качестве примера, чтобы объяснить, как работает RNN.
Спасибо за помощь!
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
# Create Training Data
xs = [[[1, 1]]]
ys = []
i = 0
while i < 100:
ys.append([xs[i][0][0] xs[i][0][1]])
xs.append([[xs[i][0][1], ys[len(ys)-1][0]]])
i = i 1
del xs[len(xs)-1]
xs = np.array(xs, dtype=float)
ys = np.array(ys, dtype=float)
# Create Model
model = keras.Sequential()
model.add(layers.LSTM(1, input_shape=(1, 2)))
model.add(layers.Dense(1))
model.compile(optimizer="adam", loss="mean_absolute_error", metrics=[ 'accuracy' ])
# Train
model.fit(xs, ys, epochs=100000)
Ответ №1:
- Вы не можете передавать данные NN, где некоторые значения в 10 ^ 21 раз больше, чем некоторые другие, и ожидать, что это сработает, этого просто не происходит.
- Вы не делаете здесь ничего, что на самом деле требует LSTM (или любого RNN), вы на самом деле не используете измерение времени, и вы в основном просто пытаетесь выучить сложение. Возможно, вы хотели сделать что-то другое (например, ввести цифры в виде последовательности или выполнить вывод для нескольких временных шагов и дать вам несколько значений последовательности), но это не то, что вы делаете, и неясно, чего вы хотите.
- Количество единиц — это ваш объем памяти / обработки. Каждая единица RNN способна получать значения от всех единиц измерения за предыдущий временной интервал. Один модуль сам по себе не может сделать ничего интересного, особенно без слоя перед ним для предварительной обработки данных.
Комментарии:
1. На самом деле я действительно хотел, чтобы он научился складывать. Просто не понимал, почему так много онлайн-учебников любят использовать последовательность Фибоначчи в качестве примера того, что делает RNN (вывод возвращается во ввод скрытого слоя. их пример не имеет ничего общего со временем, что именно то, что вы объяснили). Спасибо!