Ваша идея будет очень неэффективной в Keras, так как большинство современных библиотек фокусируются на весовой матрице умножения. Либо вы можете написать собственный слой, либо использовать какой-нибудь хак.
Итак, скажем, у вас есть входы с размером n
, вы хотите добавить смещение к каждому входу, применить relu и обучить его таким образом.
Один хакерский подход будет использовать промежуточную ветвь.
вход будет передан в две ветви
в первой В ответвлении мы просто передаем входные данные в не_тренируемую плотность, инициализированную 0 и без смещения.
поэтому мы получаем группу нулей, которые затем передаются в другой обучаемый массив с уклоном = True
наконец, мы используем Add () с предыдущими неизменными входами, чтобы добавить тензоры и применить softmax.
from tensorflow.keras.layers import Input, Dense, Add, Activation
from tensorflow.keras.models import Model
n = 3
ip = Input(shape=(n))
# branch 1
d1 = Dense(n, trainable = False, use_bias = False, kernel_initializer = 'zeros')(ip)
d2 = Dense(n, trainable = True, use_bias = True)(d1)
d2 = Activation('relu')(d2)
# branch 2
add = Add()([ip, d2])
act = Activation('softmax')(add)
model = Model(ip, act)
model.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 3)] 0
__________________________________________________________________________________________________
dense (Dense) (None, 3) 9 input_1[0][0]
__________________________________________________________________________________________________
dense_1 (Dense) (None, 3) 12 dense[0][0]
__________________________________________________________________________________________________
add (Add) (None, 3) 0 input_1[0][0]
dense_1[0][0]
__________________________________________________________________________________________________
activation (Activation) (None, 3) 0 add[0][0]
==================================================================================================
Total params: 21
Trainable params: 12
Non-trainable params: 9