我正在研究Python中的Keras,我有一个神经网络(见下面的代码)。 目前它仅适用于ReLu激活。
出于实验原因,我想在ReLu上有一些神经元,有些在softmax上(或任何其他激活函数)。例如,在一个有20个神经元的图层中,我希望有10个ReLu和10个Softmax。
我尝试了一些不同的方法,但始终无法获得输出。
你知道我应该怎么做吗?
# - Libraries
from keras.layers import Dense
from keras.models import Sequential
from keras.callbacks import EarlyStopping
early_spotting_monitor = EarlyStopping(patience=2)
layers = 4
neurons = 20
act = "ReLu"
# - Create Neural Network
model = Sequential()
model.add(Dense(neurons,activation=act,input_dim=X_train.shape[1]))
layers -= 1
while layers > 0:
model.add(Dense(neurons,activation=act))
layers -= 1
model.add(Dense(n_months))
model.compile(optimizer="adam",loss="mean_absolute_error")
model.fit(X_train,Y_train,validation_split=0.10,epochs=13,callbacks=[early_spotting_monitor])
编辑:这是我的(工作)代码:
# - Libraries
from keras.callbacks import EarlyStopping
early_spotting_monitor = EarlyStopping(patience=2)
from keras.layers import Input, Dense
from keras.models import Model
from keras.layers.merge import concatenate
# input layer
visible = Input(shape=(X_train.shape[1],))
hidden11 = Dense(14, activation='relu')(visible)
hidden12 = Dense(3, activation='softplus')(visible)
hidden13 = Dense(2, activation='linear')(visible)
hidden13 = Dense(2, activation='selu')(visible)
merge1 = concatenate([hidden11, hidden12, hidden13])
hidden21 = Dense(14, activation='relu')(merge1)
hidden22 = Dense(3, activation='softplus')(merge1)
hidden23 = Dense(2, activation='linear')(merge1)
hidden13 = Dense(2, activation='selu')(visible)
merge2 = concatenate([hidden21, hidden22, hidden23])
hidden3 = Dense(20, activation='relu')(merge2)
output = Dense(Y_train.shape[1],activation="linear")(hidden3)
model = Model(inputs=visible, outputs=output)
model.compile(optimizer="adam",loss="mean_absolute_error")
model.fit(X_train,Y_train,validation_split=0.10,epochs=13,callbacks=[early_spotting_monitor]) # starts training
return model
答案 0 :(得分:4)
您必须使用Functional API来执行此操作,例如:
input = Input(shape = (X_train.shape[1]))
branchA = Dense(neuronsA, activation = "relu")(input)
branchB = Dense(neuronsB, activation = "sigmoid")(input)
out = concatenate([branchA, branchB])
您无法使用Sequential API执行此操作,因此我建议您将代码移至functional API。
答案 1 :(得分:0)
这是我最近一直在尝试做的事情,到目前为止,这是我所做的。我认为它正在运行,但是如果有人告诉我我在做什么错,我将不胜感激。我仅在输出层上执行此操作,我的输出层有两个单元:
def activations(l):
l_0 = tf.keras.activations.exponential(l[...,0])
l_1 = tf.keras.activations.elu(l[...,1])
lnew = tf.stack([l_0, l_1], axis = 1)
return lnew
model = tf.keras.Sequential([..., Dense(2, activation = activations)])