Я использую tensorflow 2.1.0
и transformers 2.5.1
на MacOS с python 3.7
. Я строю модель Keras, используя TFBertForSequenceClassification
:
model = TFBertForSequenceClassification.from_pretrained('bert-base-cased',
num_labels=number_label)
model.compile(optimizer=optimizer,
loss=loss,
metrics=[metric])
, и я могу исследовать структуру:
model.summary()
, и мы можем увидеть следующее
Model: "tf_bert_for_sequence_classification"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
bert (TFBertMainLayer) multiple 108310272
_________________________________________________________________
dropout_37 (Dropout) multiple 0
_________________________________________________________________
classifier (Dense) multiple 1538
=================================================================
Total params: 108,311,810
Trainable params: 108,311,810
Non-trainable params: 0
Как мы видим сверху, мы видим только 3 основных слоя, и у нас нет доступа к более подробной информации.
После подгонки модели (не знаю почему, но если мы этого не сделаем, то ввод и переменная outpu будет пуста) мы можем получить доступ к:
model.inputs
{'attention_mask': <tf.Tensor 'attention_mask:0' shape=(None, 128) dtype=int32>,
'input_ids': <tf.Tensor 'input_ids:0' shape=(None, 128) dtype=int32>,
'token_type_ids': <tf.Tensor 'token_type_ids:0' shape=(None, 128) dtype=int32>}
model.outputs
[<tf.Tensor 'tf_bert_for_sequence_classification/Identity:0' shape=(None, 2) dtype=float32>]
Это хорошее начало, и теперь я хотел бы изучить слои keras:
model.layers
[<transformers.modeling_tf_bert.TFBertMainLayer at 0x1a415fd7d0>,
<tensorflow.python.keras.layers.core.Dropout at 0x1a445c3550>,
<tensorflow.python.keras.layers.core.Dense at 0x1a445c3890>]
, но теперь, если я попытаюсь получить больше информации, это всегда пусто:
for layer in model.layers:
print(layer.name, layer._inbound_nodes, layer._outbound_nodes)
bert [] []
dropout_37 [] []
classifier [] []
Я пробовал другой метод, например inbound_nodes
, но он всегда пуст!
Есть ли способ, чтобы иметь возможность проверить в более детали слой какой-то сложной модели, как BERT? По какой причине мы получили пустую информацию?
Я также пытался:
tf.keras.utils.plot_model(model,
'model.png',
show_shapes=True)
, но я получаю не очень полезную информацию:
То же самое с использованием TensorBoard, который дает мне один график и много отключенных элементов
Да, как вариант, я хорошо смотрю код напрямую: код но я думал, что можно программно проверить структуру такой сложной модели.