Keras Tensorflow не в состоянии изучить простые линейные отношения - PullRequest
0 голосов
/ 31 мая 2019

Я довольно новичок в Tensorflow / Keras и пытаюсь настроить модель LSTM.Я уже успешно выполнил свой код, но мои результаты не дали мне значимых результатов.Поэтому я - в качестве теста - позволил моей сети LSTM изучить одну из функций, которые я ввожу.Я знаю, что LSTM и relu используют нелинейные отношения, однако я все еще ожидал, что результат будет несколько похож на функцию ввода, которую я пытался изучить, а это совсем не так.

Я использую измененную версию из того, что я узнал на https://keras.io/getting-started/sequential-model-guide/

feature_set = features.iloc[:-3,:].transpose() #23 features
target_set = features.iloc[-4:,:].transpose().iloc[:,0] #picking the 23rd feature
X_train,X_test,y_train,y_test = train_test_split(feature_set, target_set, test_size=0.2, shuffle=False, random_state=42)

rnn_units = 256
batch_size = 1
features_dim = 23
output = 1
def build_model(rnn_units):
    model = tf.keras.Sequential([
            tf.keras.layers.Dense(rnn_units, batch_input_shape=[batch_size, None, features_dim], activation='relu'),
            tf.keras.layers.Dropout(0.1),
            tf.keras.layers.CuDNNLSTM(rnn_units,
                return_sequences=True,   
                stateful=True),
            tf.keras.layers.Dropout(0.1),
            tf.keras.layers.CuDNNLSTM(rnn_units,
                return_sequences=True,   
                stateful=True),            
            tf.keras.layers.Dense(output)
          ])
    return model

model = build_model(rnn_units=rnn_units)

model.compile(optimizer = tf.train.AdamOptimizer(), loss = tf.keras.losses.mean_squared_error, metrics=['mse', 'mae', 'mape', 'cosine'])

reshape_train = int(X_train.values.shape[0]/batch_size)
reshape_test = int(X_test.values.shape[0]/batch_size)

history = model.fit(X_train.values[:reshape_train*batch_size].reshape(reshape_train*batch_size, -1, features_dim), y_train.values[:reshape_train*batch_size].reshape(reshape_train*batch_size, -1, output), epochs=EPOCHS, batch_size=batch_size, validation_data=(X_test.values[:reshape_test*batch_size].reshape(reshape_test*batch_size, 1, features_dim), y_test.values[:reshape_test*batch_size].reshape(reshape_test*batch_size, 1, output)), callbacks=[checkpoint_callback,tensorboard])

Как вы видите, я ввожу набор функций из 23 значений и пытаюсь узнать23-я особенность.Я использую 256 узлов в каждом слое, с одним плотным макетом в начале и в конце и двумя слоями LSTM, за которыми следуют слои Dropout.

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

Это, например, один прогон моего обучения:

Epoch 5/5
10329/10329 [==============================] - 93s 9ms/sample - loss: 0.0182 - mean_squared_error: 0.0182 - mean_absolute_error: 0.0424 - mean_absolute_percentage_error: 94.4916 - cosine_proximity: -0.9032 - val_loss: 0.0193 - val_mean_squared_error: 0.0193 - val_mean_absolute_error: 0.0438 - val_mean_absolute_percentage_error: 58.2152 - val_cosine_proximity: -0.9443

И когда я бегу

result = model.predict(feature_set.values.reshape(-1, 1, features_dim))

feature_set.transpose().append(pd.DataFrame(result.reshape(-1), columns = ['Prediction 5min']).set_index(features.columns).transpose()).transpose()

, я получаю, например,

2019-03-04 01:00:00 82.0105414589   0.0704929618    -0.1165011768   -0.3369084807   -1.8137642288   -0.2780955060   -4.3090711538   6.2721520391    9.5553857757    -1.2900340169   ... -29.8867675862  1.9178869544    -1.4765772054   1.0000000000    0.0000000000    0.0000000000    0.0000000000    0.0080950060    -0.3594492457   0.0056902645

где последние 2 значения должны быть равны, но они равны

-0.3594492457   0.0056902645

Есть идеи, что я делаю неправильно в моей модели?Могу ли я использовать LSTM для изучения таких отношений?

Спасибо!

1 Ответ

0 голосов
/ 31 мая 2019

Несколько вопросов:

Как правило, слои LSTM идут в начале, после чего следует несколько плотных слоев.

Кроме того, для слоя LSTM перед плотным слоем необходимо установить return_sequence в значение False.

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

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