Прежде всего, ваше изменение данных неверно. NB. Я только что заметил, что вы принимаете X1, Y1 за X2, Y2.
print (X1.shape) -> (56,3) print (Y1.shape) -> (56, 3)
Вы пытаетесь изменить их размерность (-1,30,1) или (-1,3,1). Там нет 32 в последовательностях. X1 и Y1 имеют одинаковое измерение (56,3), так что это проблема seq2seq. Но вы используете слой 1 * F C, как в режиме регрессии, который даст вам ошибку, так как ваш вывод имеет больше измерений.
Кроме того, есть другие ошибки, такие как X не был определен, и все же вы использовал это. К сожалению, ваш код полностью поврежден.
Случай № 1, я предполагаю, что данные имеют 56 выборок, а каждая выборка имеет 3 значения (временное измерение).
Для начала я добавил минимальную кодовую базу.
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
# load
X1 = np.load('X1.npy')
Y1 = np.load('Y1.npy')
X2 = np.load('X2.npy')
Y2 = np.load('Y2.npy')
print(X1.shape)
print(Y1.shape)
# Reshape data
X = X1.reshape(-1,3,1)
Y = Y1.reshape(-1,3)
# LSTM
model = tf.keras.models.Sequential()
# layre #1
model.add(tf.keras.layers.LSTM(units=3, return_sequences=True, input_shape=(3,1), activation = 'relu'))
model.add(tf.keras.layers.Dropout(0.4))
#layer #2
model.add(tf.keras.layers.LSTM(units=3, return_sequences=False))
model.add(tf.keras.layers.Dropout(0.12))
# layer #3
model.summary()
Model: "sequential_6"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_9 (LSTM) (None, 3, 3) 60
_________________________________________________________________
dropout_8 (Dropout) (None, 3, 3) 0
_________________________________________________________________
lstm_10 (LSTM) (None, 3) 84
_________________________________________________________________
dropout_9 (Dropout) (None, 3) 0
=================================================================
Total params: 144
Trainable params: 144
Non-trainable params: 0
__________________________
model.compile(optimizer='adam', loss='mse')
model.fit(X,Y, epochs=2, batch_size=20, verbose=1)
pred = model.predict(X)
Для X2, Y2:
X = X1.reshape(-1,32,1)
Y = Y1.reshape(-1,32)
# LSTM
model = tf.keras.models.Sequential()
# layre #1
model.add(tf.keras.layers.LSTM(units=32, return_sequences=True, input_shape=(3,1), activation = 'relu'))
model.add(tf.keras.layers.Dropout(0.4))
#layer #2
model.add(tf.keras.layers.LSTM(units=32, return_sequences=False))
model.add(tf.keras.layers.Dropout(0.12))
model.compile(optimizer='adam', loss='mse')
model.fit(X,Y, epochs=2, batch_size=20, verbose=1)
pred = model.predict(X)
Некоторые идеи улучшить производительность: используйте нормализацию min-max, в последнем слое используйте sigmoid для активации. Добавьте еще отсев и recurrent_dropout. Но не используйте выпадение после последнего слоя, это портит ваши прогнозы.
Вот обновленный код:
X = X1.reshape(-1,3,1)
Y = Y1.reshape(-1,3)
X = (X-np.min(X))/(np.max(X) - np.min(X))
Y = (Y-np.min(Y))/(np.max(Y) - np.min(Y))
# LSTM
model = tf.keras.models.Sequential()
# layre #1
model.add(tf.keras.layers.LSTM(units=8, return_sequences=True, input_shape=(3,1), activation = 'relu', recurrent_dropout = 0.2))
model.add(tf.keras.layers.Dropout(0.4))
model.add(tf.keras.layers.LSTM(units=8, return_sequences=True, input_shape=(3,1), activation = 'relu', recurrent_dropout = 0.2))
model.add(tf.keras.layers.Dropout(0.4))
#layer #2
model.add(tf.keras.layers.LSTM(units=3, return_sequences=False, activation = 'sigmoid'))
model.compile(optimizer='adam', loss='mse')
hist = model.fit(X,Y, epochs=50, batch_size=20, verbose=1)
import matplotlib.pyplot as plt
plt.plot(hist.history['loss'])
plt.show()
Случай № 2, у вас есть только одна выборка с 56 временными измерениями и 3 фильтрами. Это совсем не случай LSTM. Вам необходимо предоставить более подробную информацию о вашем формате входных данных.
Случай № 3, у вас есть больше данных и кода, которые вы не добавили здесь. Пожалуйста, добавьте эти фрагменты, чтобы мы могли помочь.