Слой Softmax над 3D-тензором в кератах - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть следующая сеть:

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. Это правильно, что я сделал?

...