我使用的是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))
更新: 我使用此代码实现了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"))
更新: 使用此代码:
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)
感谢所有帮助!
答案 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)
您的输出数据范围从5
到25
,您的输出ReLU激活将为您提供从0
到inf
的值。因此,您尝试的是“参数化”输出或标准化标签。这意味着,使用sigmoid作为激活((0,1)
中的输出)并通过减去5并除以20来转换标签,因此它们将(几乎)与输出[0,1]
处于相同的间隔。或者,您可以使用S型曲线,将输出乘以20,然后在计算损失之前加5。
看到结果会很有趣。