keras получает промежуточный вывод после tf.unstack - PullRequest
0 голосов
/ 03 августа 2020

Как мне получить промежуточный результат сиамской модели, где входные данные для левого и правого каналов извлекаются с помощью tf.unstack?

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 2, 235, 256) 0                                            
__________________________________________________________________________________________________
tf_op_layer_unstack (TensorFlow [(None, 235, 256), ( 0           input_1[0][0]                    
__________________________________________________________________________________________________
positional_encoding (Positional (None, 235, 256)     0           tf_op_layer_unstack[0][0]        
                                                                 tf_op_layer_unstack[0][1]        
__________________________________________________________________________________________________
transformer_block (TransformerB (None, 235, 256)     395776      positional_encoding[0][0]        
                                                                 positional_encoding[1][0]        
__________________________________________________________________________________________________
transformer_block_1 (Transforme (None, 235, 256)     395776      transformer_block[0][0]          
                                                                 transformer_block[1][0]          
__________________________________________________________________________________________________
transformer_block_2 (Transforme (None, 235, 256)     395776      transformer_block_1[0][0]        
                                                                 transformer_block_1[1][0]        
__________________________________________________________________________________________________
global_average_pooling1d (Globa (None, 256)          0           transformer_block_2[0][0]        
                                                                 transformer_block_2[1][0]        
__________________________________________________________________________________________________
tf_op_layer_stack (TensorFlowOp (2, None, 256)       0           global_average_pooling1d[0][0]   
                                                                 global_average_pooling1d[1][0] 

Чтобы получить промежуточный результат, я делаю:

x = np.random.rand(1,2,235,256)
layer_output = model.get_layer('positional_encoding').output
newmodel = tf.keras.Model(inputs=model.input, outputs=layer_output)
y = newmodel.predict(x)
print(y.shape) # prints (1, 235, 256) the left part of the siamese network

Это всегда дает мне только левую часть ввода, а не правую часть (имеется в виду первый индекс в списке, который я получаю из tf.unstack)

Я считаю, что моя модель работает так, как ожидалось но я не могу отладить его, потому что я не могу получить как левый, так и правый промежуточный вывод.

Это код для построения моей модели:

input_samples = tf.keras.layers.Input(shape=input_shape, dtype=np.float32)

[left_input, right_input] = tf.unstack(input_samples, num=2, axis=1)

add_pos_encoding = PositionalEncoding(input_shape[1], input_shape[2])

l1 = TransformerBlock(input_shape[2], 8, input_shape[2])
l2 = TransformerBlock(input_shape[2], 8, input_shape[2])
l3 = TransformerBlock(input_shape[2], 8, input_shape[2])
gap = tf.keras.layers.GlobalAveragePooling1D()
left_out = gap(l3(l2(l1(add_pos_encoding(left_input)))))
right_out = gap(l3(l2(l1(add_pos_encoding(right_input)))))

leftright = tf.stack([left_out, right_out])

model = tf.keras.Model(inputs=[input_samples], outputs=leftright)
model.compile(loss=nt_xent_loss, optimizer=tf.keras.optimizers.Adam())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...