Как использовать разные функции активации в одном слое Keras?

Я работаю над Keras на Python, и у меня есть нейронная сеть (см. Код ниже). В настоящее время он работает только с активацией 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

person Nicolas    schedule 12.12.2017    source источник
comment
slice слой x на два (или более) x_1,x_2,x_3..., затем используйте различные функции активации y_n = act_n(x_n), затем concat y_ns.   -  person M. Shaw    schedule 12.12.2017
comment
Это именно то, что я не могу сделать. У вас есть пример этого?   -  person Nicolas    schedule 12.12.2017
comment
Как вы хотите разделить нейроны для двух функций активации? Просто первые десять прошли через softmax, а остальные десять через ReLU?   -  person M. Shaw    schedule 12.12.2017
comment
Точно, слой будет состоять из 20 нейронов, где 10 - Relu, а 10 - softmax (например).   -  person Nicolas    schedule 12.12.2017


Ответы (2)


Для этого необходимо использовать Функциональный API, например:

input = Input(shape = (X_train.shape[1]))
branchA = Dense(neuronsA, activation = "relu")(input)
branchB = Dense(neuronsB, activation = "sigmoid")(input)

out = concatenate([branchA, branchB])

Вы не можете сделать это с помощью последовательного API, поэтому я рекомендую вам переместить свой код в функциональный API..

person Dr. Snoopy    schedule 12.12.2017

Так что это то, что я пытался сделать в последнее время, и до сих пор это то, что я делал. Я думаю, что это работает, но я был бы признателен, если бы кто-нибудь сказал мне, что я здесь делаю не так. Я делаю это только на выходном слое, и мой выходной слой состоит из двух единиц:

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)])
person armen    schedule 28.12.2019