【问题标题】:How to use different activation functions in one Keras layer?如何在一个 Keras 层中使用不同的激活函数?
【发布时间】:2018-05-26 02:35:38
【问题描述】:

我正在使用 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

【问题讨论】:

  • slice将层x分成两个(或更多)x_1,x_2,x_3...,然后使用你不同的激活函数y_n = act_n(x_n),然后concaty_ns。
  • 这正是我没有做到的。你能举个例子吗?
  • 你想如何分割两个激活函数的神经元?前十个通过softmax,另外十个通过ReLU?
  • 确切地说,该层将是 20 个神经元,其中 10 个是 Relu,10 个是 softmax(例如)

标签: neural-network keras keras-layer activation-function


【解决方案1】:

您必须使用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

【讨论】:

    【解决方案2】:

    所以这是我最近一直在尝试做的事情,到目前为止,这就是我所做的。我认为它有效,但如果有人告诉我我在这里做错了什么,我将不胜感激。我只在输出层这样做,我的输出层有两个单元:

    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)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 2020-09-12
      • 2023-03-13
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多