使用keras实现NARX

2024-05-20 02:28:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在keras(后端Tensoflow)中实现一个简单的NARX网络。我通过子类化tf.keras.Model来构建模型。NARX网络可以训练成一个简单的前馈网络(串-并行结构),因此我对这个定义没有任何问题。但是对于预测,我需要关闭循环并将输出作为输入返回给模型。如何修改网络,使其能够做出预测和预测?在

以下是代码的最低版本:

import tensorflow as tf
from tensorflow import keras

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
numPreviousSteps = 8
inputShape = (None, numPreviousSteps + 2)

class Narx(keras.Model):

    def __init__(self):
        super(Narx, self).__init__(name='narx')
        self.dense = keras.layers.Dense(10, input_shape=inputShape,
                                        activation=keras.activations.tanh)
        self.outputLayer = keras.layers.Dense(1, activation=keras.activations.linear)

    def call(self, inputs, training = False):
        if (training):
            x = self.dense(inputs)
            return self.outputLayer(x)
        else: # TODO: what should the network do when used for prediction
            x = self.dense(inputs)
            return self.outputLayer(x)


model = Narx()
model.compile(optimizer=keras.training.RMSPropOptimizer(0.001),
              loss=tf.losses.mean_squared_error,
              metric=tf.metrics.mean_absolute_error)

# input data generation
numTsSamples = 1000

# time series to learn from
y = np.random.random((numTsSamples + numPreviousSteps + 1,))
x = np.random.random((numTsSamples,)) # exogenous input

# creation of tapped delay
data = [np.roll(y, -i)[:numTsSamples] for i in range(numPreviousSteps, -1, -1)]
data = [x] + data

# training data
data = np.stack(data, axis=1)

# expected results
yNext = y[numPreviousSteps : -1]

# model training
model.fit(data, yNext)

Tags: importself网络datamodeltfasnp