Как мне получить промежуточный результат сиамской модели, где входные данные для левого и правого каналов извлекаются с помощью 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())