Nano Hash - криптовалюты, майнинг, программирование

Вывод моей регрессионной NN с LSTM неверен даже при низком значении val_loss

Модель

В настоящее время я работаю над стеком LSTM и пытаюсь решить проблему регрессии. Архитектура модели следующая:

comp_lstm = tf.keras.models.Sequential([
    tf.keras.layers.LSTM(64, return_sequences = True),
    tf.keras.layers.LSTM(64, return_sequences = True),
    tf.keras.layers.LSTM(64),
    tf.keras.layers.Dense(units=128),
    tf.keras.layers.Dense(units=64),
    tf.keras.layers.Dense(units=32),
    tf.keras.layers.Dense(units=1)
])

comp_lstm.compile(optimizer='adam', loss='mae')

Когда я обучаю модель, она показывает хорошие значения потерь и val_loss:

Epoch 6/20
200/200 [==============================] - 463s 2s/step - loss: 1.3793 - val_loss: 1.3578
Epoch 7/20
200/200 [==============================] - 461s 2s/step - loss: 1.3791 - val_loss: 1.3602

Теперь я запускаю код, чтобы проверить вывод с кодом ниже:

idx = np.random.randint(len(val_X))
sample_X, sample_y = [[val_X[idx,:]]], [[val_y[idx]]]
test = tf.data.Dataset.from_tensor_slices(([sample_X], [sample_y]))
prediction = comp_lstm.predict(test)
print(f'The actual value was {sample_y} and the model predicted {prediction}')

И вывод:

The actual value was [[21.3]] and the model predicted [[2.7479606]]

Следующие несколько раз, когда я запускал его, я получил значение:

The actual value was [[23.1]] and the model predicted [[0.8445232]]
The actual value was [[21.2]] and the model predicted [[2.5449793]]
The actual value was [[22.5]] and the model predicted [[1.2662419]]

Я не уверен, почему это работает так, как есть. Значение val_loss очень низкое, но результат сильно отличается.


Борьба с данными

Обработка данных для получения train_X и val_X и т. д. показана ниже:

hist2 = 128 

features2 = np.array(list(map(list,[df["scaled_temp"].shift(x) for x in range(1, hist2+1)]))).T.tolist()
df_feat2 = pd.DataFrame([pd.Series(x) for x in features2], index = df.index)
df_trans2 = df.join(df_feat2).drop(columns=['scaled_temp']).iloc[hist2:]
df_trans2 = df_trans2.sample(frac=1)
target = df_trans2['T (degC)'].values
feat2 = df_trans2.drop(columns = ['T (degC)']).values

Форма feat2(44435, 128), а форма target(44435,).

Фрейм данных, который представляет собой столбец df["scaled_temp"], показан ниже (который был масштабирован с помощью стандартного масштабатора):

Date Time
2020-04-23T21:14:07.546476Z   -0.377905
2020-04-23T21:17:32.406111Z   -0.377905
2020-04-23T21:17:52.670373Z   -0.377905
2020-04-23T21:18:55.010392Z   -0.377905
2020-04-23T21:19:57.327291Z   -0.377905
                                 ...   
2020-06-08T09:13:06.718934Z   -0.889968
2020-06-08T09:14:09.170193Z   -0.889968
2020-06-08T09:15:11.634954Z   -0.889968
2020-06-08T09:16:14.087139Z   -0.889968
2020-06-08T09:17:16.549216Z   -0.889968
Name: scaled_temp, Length: 44563, dtype: float64

Фрейм данных для df['T (degC)'] показан ниже:

Date Time
2020-05-09T07:30:30.621001Z    24.0
2020-05-11T15:56:30.856851Z    21.3
2020-05-27T05:02:09.407266Z    28.3
2020-05-02T09:33:03.219329Z    20.5
2020-05-31T03:20:04.326902Z    22.4
                               ... 
2020-05-31T01:47:45.982819Z    23.1
2020-05-27T08:03:21.456607Z    27.2
2020-05-04T21:58:36.652251Z    20.9
2020-05-17T18:42:39.681050Z    22.5
2020-05-04T22:07:58.350329Z    21.1
Name: T (degC), Length: 44435, dtype: float64

Процесс создания набора данных выглядит следующим образом:

train_X, val_X = feat2[:int(feat2.shape[0]*0.95), :], feat2[int(feat2.shape[0]*0.95):, :]
train_y, val_y = target[:int(target.shape[0]*0.95)], target[int(target.shape[0]*0.95):]
train = tf.data.Dataset.from_tensor_slices(([train_X], [train_y])).batch(BATCH_SIZE).repeat()
val = tf.data.Dataset.from_tensor_slices(([val_X], [val_y])).batch(BATCH_SIZE).repeat()

Поэтому я не уверен, почему это происходит.


  • нет проблем, я удалил это из ответа. Спасибо. 14.06.2020
  • Можете ли вы поделиться набором данных? 20.06.2020
  • @MohammadArvan извините, я не могу, к сожалению 22.06.2020

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..