Ошибка значения: несоответствие формы: форма меток (полученных (1,)) должна соответствовать форме логитов, за исключением последнего измерения (получено (10, 30))

#python #tensorflow #keras #tensorflow2.0 #huggingface-transformers

#python #тензорный поток #keras #tensorflow2.0 #huggingface-трансформеры

Вопрос:

я довольно новичок в tensorflow и был бы очень признателен за ответы. я пытаюсь использовать модель transformer в качестве слоя встраивания и передавать данные в пользовательскую модель.

 from transformers import TFAutoModel
from tensorflow.keras import layers
def build_model():
    transformer_model = TFAutoModel.from_pretrained(MODEL_NAME, config=config)
    
    input_ids_in = layers.Input(shape=(MAX_LEN,), name='input_ids', dtype='int32')
    input_masks_in = layers.Input(shape=(MAX_LEN,), name='attention_mask', dtype='int32')

    embedding_layer = transformer_model(input_ids_in, attention_mask=input_masks_in)[0]

    X = layers.Bidirectional(tf.keras.layers.LSTM(50, return_sequences=True, dropout=0.1, recurrent_dropout=0.1))(embedding_layer)
    X = layers.GlobalMaxPool1D()(X)
    X = layers.Dense(64, activation='relu')(X)
    X = layers.Dropout(0.2)(X)
    X = layers.Dense(30, activation='softmax')(X)

    model = tf.keras.Model(inputs=[input_ids_in, input_masks_in], outputs = X)

    for layer in model.layers[:3]:
        layer.trainable = False

    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    return model

    
model = build_model()
model.summary()
r = model.fit(
            train_ds,
            steps_per_epoch=train_steps,
            epochs=EPOCHS,
            verbose=3)
 

У меня 30 классов, и метки не являются одноразовыми, поэтому я использую sparse_categorical_crossentropy в качестве функции потерь, но я продолжаю получать следующую ошибку

 ValueError: Shape mismatch: The shape of labels (received (1,)) should equal the shape of logits except for the last dimension (received (10, 30)).
 

как я могу это решить?
и почему требуется форма (10, 30)? я знаю, что 30 — это из-за последнего плотного слоя с 30 единицами, но почему 10? это из-за MAX_LENGTH, который равен 10?

резюме моей модели:

 Model: "model_16"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_ids (InputLayer)          [(None, 10)]         0                                            
__________________________________________________________________________________________________
attention_mask (InputLayer)     [(None, 10)]         0                                            
__________________________________________________________________________________________________
tf_bert_model_21 (TFBertModel)  TFBaseModelOutputWit 162841344   input_ids[0][0]                  
                                                                 attention_mask[0][0]             
__________________________________________________________________________________________________
bidirectional_17 (Bidirectional (None, 10, 100)      327600      tf_bert_model_21[0][0]           
__________________________________________________________________________________________________
global_max_pooling1d_15 (Global (None, 100)          0           bidirectional_17[0][0]           
__________________________________________________________________________________________________
dense_32 (Dense)                (None, 64)           6464        global_max_pooling1d_15[0][0]    
__________________________________________________________________________________________________
dropout_867 (Dropout)           (None, 64)           0           dense_32[0][0]                   
__________________________________________________________________________________________________
dense_33 (Dense)                (None, 30)           1950        dropout_867[0][0]                
==================================================================================================
Total params: 163,177,358
Trainable params: 336,014
Non-trainable params: 162,841,344
 

Ответ №1:

10 — это количество последовательностей в одном пакете. Я подозреваю, что это количество последовательностей в вашем наборе данных.

Ваша модель действует как классификатор последовательностей. Таким образом, у вас должна быть одна метка для каждой последовательности.