У меня есть следующая сеть:
inp_features = Input(shape=(segment_number, 10), name='features_input')
flow_features = Bidirectional(GRU(gru_size, activation='tanh', return_sequences=True, name='LSTM1'))(inp_features)
features = Model(inp_features, flow_features)
features.summary()
sent_input = Input(shape=(segment_number, max_seg_len), dtype='float32', name='input_2')
y = Dense(40, name='dense_2')(sent_input)
y = concatenate([inp_features, y], axis=2)
y = Dense((gru_size*2), name='dense_3')(y)
y = Activation('softmax')(y)
y = keras.layers.dot([y, flow_features], axes=[2, 2])
y = Dense(2, activation='softmax', name='final_softmax')(y)
model = Model([inp_features, sent_input], y)
model.summary()
и вот резюме:
Layer (type) Output Shape Param #
=================================================================
features_input (InputLayer) (None, 20, 10) 0
_________________________________________________________________
bidirectional_1 (Bidirection (None, 20, 64) 8256
=================================================================
Total params: 8,256
Trainable params: 8,256
Non-trainable params: 0
_________________________________________________________________
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_2 (InputLayer) (None, 20, 400) 0
__________________________________________________________________________________________________
features_input (InputLayer) (None, 20, 10) 0
__________________________________________________________________________________________________
dense_2 (Dense) (None, 20, 40) 16040 input_2[0][0]
__________________________________________________________________________________________________
concatenate_1 (Concatenate) (None, 20, 50) 0 features_input[0][0]
dense_2[0][0]
__________________________________________________________________________________________________
dense_3 (Dense) (None, 20, 64) 3264 concatenate_1[0][0]
__________________________________________________________________________________________________
activation_1 (Activation) (None, 20, 64) 0 dense_3[0][0]
__________________________________________________________________________________________________
bidirectional_1 (Bidirectional) (None, 20, 64) 8256 features_input[0][0]
__________________________________________________________________________________________________
dot_1 (Dot) (None, 20, 20) 0 activation_1[0][0]
bidirectional_1[0][0]
__________________________________________________________________________________________________
final_softmax (Dense) (None, 20, 2) 42 dot_1[0][0]
==================================================================================================
Total params: 27,602
Trainable params: 27,602
Non-trainable params: 0
__________________________________________________________________________________________________
У меня есть два вопроса:
1- Вход вСлой softmax: (None, 20, 64)
, а выход имеет ту же яркость! Что случилось на этом этапе тогда? когда вход 2D, активация softmax дает временным шагам (2-й дим) различные вероятности или веса, но как насчет этого случая?
2 - я хочу сделать точечное произведение между activation_1
и bidirectional_1
, Почему? Я предполагаю, что предыдущий слой softmax дал разные веса для временных шагов (2nd dim, 20), примененных к 3-му dim (64). Таким образом, я хочу сделать как «средневзвешенное значение» для выходов Bi-LSTM (bidirectional_1
) с использованием выходной матрицы softmax. Я применил точечное произведение (внутреннее произведение) к двум матрицам:
softmax: (None, 20, 64)
Bidirectional: (None, 20, 64)
Таким образом, keras.layers.dot([y, flow_features], axes=[2, 2])
, чтобы соответствовать затемнению 64
. Это правильно, что я сделал?