Уравнение разницы в сети LSTM на Tensorflow
Я хотел бы использовать сеть LSTM в Tensorflow для реализации разностного уравнения. Я искал в Интернете, но я ничего не нашел по этой теме.
Уравнение:
в котором b=[1, 2, 1] и a=[1, -1,6641, 0,8387].
Моя цель — использовать нейронную сеть, чтобы найти корреляцию между вводом и выводом. В связи с этим, чтобы найти выходное объявление k-мгновенного, вы также должны знать предыдущие входы и выходы, моя идея состоит в том, чтобы реализовать сеть LSTM (многие к одной структуре).
Если мы предполагаем, что у нас есть входной вектор из 500 выборок и размер окна равен 5, вход сети LSTM представляет собой вектор формы (500,5,1), а выход — (500,1,1).
IN%OUT первой итерации:
[0; х(к-4), х(к-3), х(к-2), х(к-1), х(к); 1] -> [1; у(к); 1]формула
во второй итерации:
[0; х(к-3), х(к-2), х(к-1), х(к), х(к+1); 1] -> [1; у(к+1); 1]формула
Поэтому я использовал сеть LSMT с состоянием , установленным на TRUE , чтобы позволить сети запоминать прошлые состояния, но она не сходится.
Мне кажется, что идея правильная, но я не вижу, где я ошибаюсь. Может ли кто-нибудь помочь мне найти проблему? Я копирую и вставляю код ниже, и сеть разрабатывается на Tensorflow.
# Difference equation
K = 0.0436
b = np.array([1,2,1])
a = np.array([1, -1.6641, 0.8387])
x = np.random.uniform(0, 1, 100)
y = K*(signal.lfilter(b,a,x))
# Generate Dataset
X_train = np.random.uniform(0, 1, 100)
y_train = K*(signal.lfilter(b,a,X_train))
X_val = np.ones(100)
y_val = K*(signal.lfilter(b,a,X_val))
X_test = np.random.uniform(0.5, 0.8, 100)
y_test = K*(signal.lfilter(b,a,X_test))
def get_x_split(data, windows_size):
""" Return sliding window dataset. """
x_temp = np.zeros([1,windows_size-1])
x = np.array([])
for i in range(0,len(data)):
x_temp = np.append(x_temp[-windows_size+1:], data[i]).T
x = np.append(x, x_temp, axis=0)
x = np.reshape(x, (int(len(x)/windows_size), windows_size))
return x
windows_size = 10
X_train = get_x_split(X_train, windows_size)
X_val = get_x_split(X_val, windows_size)
X_test = get_x_split(X_test, windows_size)
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_val = np.reshape(X_val, (X_val.shape[0], X_val.shape[1], 1))
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
# Model Definition
activation_function = 'tanh'
def build_model():
input_layer = Input(shape=(X_train.shape[1],1), batch_size=1)
HL_1 = LSTM(1, activation=activation_function, return_sequences=True, stateful = True)(input_layer)
HL_2 = LSTM(1, activation=activation_function, return_sequences=False, stateful = True)(HL_1)
output_layer = Dense(1, activation='relu',name='Output')(HL_2)
model = Model(inputs=input_layer, outputs=output_layer)
return model
model = build_model()
model.compile(optimizer=RMSprop(),
loss={'Output': 'mse'}, #mse
metrics={'Output': tf.keras.metrics.RootMeanSquaredError()})
# Training
history = model.fit(x=X_train,
y=y_train,
batch_size=1,
validation_data=(X_val, y_val),
epochs=5000,
verbose=1,
shuffle=False)
# Test
y_pred = model.predict(X_test)
pred_samples = 400
plt.figure(dpi=1200)
plt.plot(y_test[300:pred_samples,3,0], label='true', linewidth=0.8, alpha=0.5)
plt.plot(y_pred[300:pred_samples,3,0], label='pred')
plt.legend()
plt.grid()
plt.title("Test")
plt.show()