Как построить карту внимания для модели Vision TransformerPython

Программы на Python
Anonymous
Как построить карту внимания для модели Vision Transformer

Сообщение Anonymous »

Я реализую модель Vision Transformer в рамках школьного проекта, и мне нужно построить карту внимания, чтобы сравнить различия между моделью CNN и моделью ViT, но я не знаю, как это сделать.< /p>
Для справки: я использовал код в этом блокноте, за исключением того, что для модели ViT я использовал google/vit-base-patch16-224-in21k
https:/ /mpolinowski.github.io/docs/IoT-and-Machine-Learning/ML/2023-08-03-tensorflow-i-know-flowers-deit/2023-08-03/#deit-modelЭто результат работы vit_model.summary():

Код: Выделить всё

Model: "model"
_________________________________________________________________
Layer (type)                Output Shape              Param #
=================================================================
input_1 (InputLayer)        [(None, 224, 224, 3)]     0

sequential (Sequential)     (None, 3, 224, 224)       0

vit (TFViTMainLayer)        TFBaseModelOutputWithPo   29686272
oling(last_hidden_state
=(None, 197, 768),
pooler_output=(None, 7
68),
hidden_states=None, at
tentions=None)

tf.__operators__.getitem (  (None, 768)               0
SlicingOpLambda)

dense (Dense)               (None, 2)                 1538

=================================================================
Total params: 29687810 (113.25 MB)
Trainable params: 29687810 (113.25 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
Это конфигурации модели:

Код: Выделить всё

ViTConfig {
"_name_or_path": "google/vit-base-patch16-224-in21k",
"attention_probs_dropout_prob": 0.0,
"encoder_stride": 16,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.0,
"hidden_size": 768,
"image_size": 224,
"initializer_range": 0.02,
"intermediate_size": 3072,
"layer_norm_eps": 1e-12,
"model_type": "vit",
"num_attention_heads": 8,
"num_channels": 3,
"num_hidden_layers": 4,
"patch_size": 16,
"qkv_bias": true,
"transformers_version": "4.38.2"
}
Я пытался извлечь слои активации и вывода из исходной модели вот так, но не знаю, как изменить форму массивов NumPy, чтобы веса соответствовали изображению 224x224:

Код: Выделить всё

activation_layer = vit_model.get_layer("vit")
new_model = Model(inputs = vit_model.input, outputs = activation_layer.output)
final_dense = vit_model.get_layer('dense')
W = final_dense.get_weights()[0]
Но, похоже, это не дает мне того, что мне нужно.

Подробнее здесь: https://stackoverflow.com/questions/783 ... rmer-model

Вернуться в «Python»