什么是用于时间序列预测的最佳激活函数

时间:2019-11-08 06:02:52

标签: python keras neural-network sequential activation-function

我使用的是Keras的序列模型,具有DENSE层类型。我编写了一个递归计算预测的函数,但是预测远未完成。我想知道什么是用于数据的最佳激活功能。目前,我正在使用hard_sigmoid函数。输出数据值的范围为5到25。输入数据的形状为(6,1),输出数据为单个值。当我绘制预测时,它们永远不会减少。谢谢您的帮助!

# create and fit Multilayer Perceptron model
model = Sequential();
model.add(Dense(20, input_dim=look_back, activation='hard_sigmoid'))
model.add(Dense(16, activation='hard_sigmoid'))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=200, batch_size=2, verbose=0)

#function to predict using predicted values
numOfPredictions = 96;

for i in range(numOfPredictions):
    temp = [[origAndPredictions[i,0],origAndPredictions[i,1],origAndPredictions[i,2],origAndPredictions[i,3],origAndPredictions[i,4],origAndPredictions[i,5]]]
    temp = numpy.array(temp)
    temp1 = model.predict(temp)   
    predictions = numpy.append(predictions, temp1, axis=0)
    temp2 = []
    temp2 = [[origAndPredictions[i,1],origAndPredictions[i,2],origAndPredictions[i,3],origAndPredictions[i,4],origAndPredictions[i,5],predictions[i,0]]]
    temp2 = numpy.array(temp2)
    origAndPredictions = numpy.vstack((origAndPredictions, temp2))

enter image description here

更新: 我使用此代码实现了swish。

from keras.backend import sigmoid
def swish1(x, beta = 1):
    return (x * sigmoid(beta * x))
def swish2(x, beta = 1):
    return (x * sigmoid(beta * x))
from keras.utils.generic_utils import get_custom_objects
from keras.layers import Activation
get_custom_objects().update({'swish': Activation(swish)})

model.add(Activation(custom_activation,name = "swish1"))

New plot of predictions using swish.

更新: 使用此代码:

from keras.backend import sigmoid
from keras import backend as K
def swish1(x):
        return (K.sigmoid(x) * x)
def swish2(x):
        return (K.sigmoid(x) * x)

enter image description here

感谢所有帮助!

2 个答案:

答案 0 :(得分:4)

尽管没有最佳的激活功能,但我发现Swish对于时间序列问题特别有效。 AFAIK keras不提供内置的Swish,您可以使用:

from keras.utils.generic_utils import get_custom_objects
from keras import backend as K
from keras.layers import Activation

def custom_activation(x, beta = 0.999):
        return (K.sigmoid(beta * x) * x)

get_custom_objects().update({'custom_activation': Activation(custom_activation)})

然后在模型中使用它:

model.add(Activation(custom_activation,name = "Swish"))

答案 1 :(得分:1)

您的输出数据范围从525,您的输出ReLU激活将为您提供从0inf的值。因此,您尝试的是“参数化”输出或标准化标签。这意味着,使用sigmoid作为激活((0,1)中的输出)并通过减去5并除以20来转换标签,因此它们将(几乎)与输出[0,1]处于相同的间隔。或者,您可以使用S型曲线,将输出乘以20,然后在计算损失之前加5。

看到结果会很有趣。