Уравнение разницы в сети 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()

0 ответов

Другие вопросы по тегам