how to output specific layer of TFBertForSequenceClassification, or add layer?
Author: roccqqck
Pull request: no

how to output the last layer of TFBertForSequenceClassification?

I want to output the layer before classifier (Dense) 

```
Model: "tf_bert_for_sequence_classification"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
bert (TFBertMainLayer)       multiple                  102267648 
_________________________________________________________________
dropout_37 (Dropout)         multiple                  0         
_________________________________________________________________
classifier (Dense)           multiple                  3845      
=================================================================
Total params: 102,271,493
Trainable params: 102,271,493
Non-trainable params: 0
```

I tried tf.keras function
```
dense1_layer_model = Model(inputs=model.input, outputs=model.get_layer('bert').output)
```

It didnt worked.

Comments:
Please, copy and paste the source code in order to reproduce your problem.

> how to output the last layer of TFBertForSequenceClassification?
> 
> I want to output the layer before classifier (Dense)
> 
> ```
> Model: "tf_bert_for_sequence_classification"
> _________________________________________________________________
> Layer (type)                 Output Shape              Param #   
> =================================================================
> bert (TFBertMainLayer)       multiple                  102267648 
> _________________________________________________________________
> dropout_37 (Dropout)         multiple                  0         
> _________________________________________________________________
> classifier (Dense)           multiple                  3845      
> =================================================================
> Total params: 102,271,493
> Trainable params: 102,271,493
> Non-trainable params: 0
> ```
> 
> I tried tf.keras function
> 
> ```
> dense1_layer_model = Model(inputs=model.input, outputs=model.get_layer('bert').output)
> ```
> 
> It didnt worked.

> Please, copy and paste the source code in order to reproduce your problem.

this is my original code
```
model = TFBertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=5)
model.summary()
```
```
Model: "tf_bert_for_sequence_classification"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
bert (TFBertMainLayer)       multiple                  102267648 
_________________________________________________________________
dropout_37 (Dropout)         multiple                  0         
_________________________________________________________________
classifier (Dense)           multiple                  3845      
=================================================================
Total params: 102,271,493
Trainable params: 102,271,493
Non-trainable params: 0
```


I know if I use TFBertModel, I could get the (N, 512, 768) output without fine tuning.
```
model = TFBertModel.from_pretrained('bert-base-chinese')
model.summary()
```
But I need the (N, 512, 768) output after fine tuning.

I tried this too
```
model = Sequential()
model.add( TFBertModel.from_pretrained('bert-base-chinese') )
model.add( Dropout(0.5))
model.add( Dense(5,activation="softmax") )
model.summary()
```
```
ValueError: This model has not yet been built. Build the model first by calling `build()` or calling `fit()` with some data, or specify an `input_shape` argument in the first layer(s) for automatic build.
```

In order to create a `Sequential` model with TensorFlow.Keras framework, you have to specify the input shape through `input_shape` parameter on the input layer, otherwise TensorFlow.Keras doesn't know the input shape of the model you're creating.

> In order to create a `Sequential` model with TensorFlow.Keras framework, you have to specify the input shape through `input_shape` parameter on the input layer, otherwise TensorFlow.Keras doesn't know the input shape of the model you're creating.

add layer
```
input_layer = Input(shape = (512,), dtype='int64')
bert = TFBertModel.from_pretrained('bert-base-chinese')(input_layer)
bert = bert[0]              # i think there is a bug here
flat = Flatten()(bert)
classifier = Dense(units=5)(flat)
model = Model(inputs=input_layer, outputs=classifier)
model.summary()
```
```
Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         [(None, 512)]             0         
_________________________________________________________________
tf_bert_model_3 (TFBertModel ((None, 512, 768), (None, 102267648 
_________________________________________________________________
flatten_2 (Flatten)          (None, 393216)            0         
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 1966085   
=================================================================
Total params: 104,233,733
Trainable params: 104,233,733
Non-trainable params: 0
```


thanks it worked!!!



fit
```
optimizer = tf.keras.optimizers.Adam(learning_rate=3e-5, epsilon=1e-08, clipnorm=1.0)
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
metric = tf.keras.metrics.SparseCategoricalAccuracy('accuracy')
model.compile(optimizer=optimizer, loss=loss, metrics=[metric])

model_fit = model.fit(train_input_ids, train_label, 
                      batch_size=4, epochs=4, 
                      validation_data=(validation_input_ids, validation_label)
                   )
```

extract layer
```
flatten_layer_model = Model(inputs=model.input, outputs=model.get_layer('flatten_2').output)
predictions = flatten_layer_model.predict(validation_input_ids)
print(type(predictions))
print(predictions.shape)
```
```
<class 'numpy.ndarray'>
(8359, 393216)
```

Hi @roccqqck, I am also doing something similar. Most of my queries are cleared by your comment. I have just one more doubt. The [documentation](https://huggingface.co/transformers/model_doc/bert.html#tfbertforsequenceclassification) states that the input of model should look like this `[input_ids, attention_mask]`. So, are you providing attention mask as input?

Have you uploaded full the code mentioned above on your github with data? If yes, can you please share the link?

@sainimohit23 
I didn’t provide attention mask.