PaddlePaddle / PaddleNLP

πŸ‘‘ Easy-to-use and powerful NLP and LLM library with πŸ€— Awesome model zoo, supporting wide-range of NLP tasks from research to industrial applications, including πŸ—‚Text Classification, πŸ” Neural Search, ❓ Question Answering, ℹ️ Information Extraction, πŸ“„ Document Intelligence, πŸ’Œ Sentiment Analysis etc.
https://paddlenlp.readthedocs.io
Apache License 2.0
11.98k stars 2.92k forks source link

text_classification/pretrained_models/train.py error or my way was wrong #1067

Closed Magic-Fy closed 2 years ago

Magic-Fy commented 2 years ago

Version: PaddleNLP==2.0.8, PaddlePaddle==2.1.3 Env: Linux Ubuntu 18.04 , GPU

examples/text_classification/pretrained_models/train.py The original file is:

train_ds, dev_ds = load_dataset("thucnews", splits=["train", "dev"])

# If you wanna use bert/roberta/electra pretrained model,
# model = ppnlp.transformers.BertForSequenceClassification.from_pretrained('bert-base-chinese', num_class=2)
# model = ppnlp.transformers.RobertaForSequenceClassification.from_pretrained('roberta-wwm-ext', num_class=2)
# model = ppnlp.transformers.ElectraForSequenceClassification.from_pretrained('chinese-electra-small', num_classes=2)
model = ppnlp.transformers.ErnieForSequenceClassification.from_pretrained('ernie-tiny', num_classes=len(train_ds.label_list))

# If you wanna use bert/roberta/electra pretrained model,
# tokenizer = ppnlp.transformers.BertTokenizer.from_pretrained('bert-base-chinese')
# tokenizer = ppnlp.transformers.RobertaTokenizer.from_pretrained('roberta-wwm-ext')
# tokenizer = ppnlp.transformers.ElectraTokenizer.from_pretrained('chinese-electra-small', num_classes=2)
# ErnieTinyTokenizer is special for ernie-tiny pretained model.
tokenizer = ppnlp.transformers.ErnieTinyTokenizer.from_pretrained(
'ernie-tiny')

I modified by:

train_ds, dev_ds = load_dataset("thucnews", splits=["train", "dev"])

# If you wanna use bert/roberta/electra pretrained model,
model = ppnlp.transformers.BertForSequenceClassification.from_pretrained('bert-base-chinese', num_class=len(train_ds.label_list))
# model = ppnlp.transformers.RobertaForSequenceClassification.from_pretrained('roberta-wwm-ext', num_class=2)
# model = ppnlp.transformers.ElectraForSequenceClassification.from_pretrained('chinese-electra-small', num_classes=2)
# model = ppnlp.transformers.ErnieForSequenceClassification.from_pretrained('ernie-tiny', num_classes=len(train_ds.label_list))

# If you wanna use bert/roberta/electra pretrained model,
tokenizer = ppnlp.transformers.BertTokenizer.from_pretrained('bert-base-chinese')
# tokenizer = ppnlp.transformers.RobertaTokenizer.from_pretrained('roberta-wwm-ext')
# tokenizer = ppnlp.transformers.ElectraTokenizer.from_pretrained('chinese-electra-small', num_classes=2)
# ErnieTinyTokenizer is special for ernie-tiny pretained model.
# tokenizer = ppnlp.transformers.ErnieTinyTokenizer.from_pretrained('ernie-tiny')

And the error is:

IndexError: (OutOfRange) label value should less than the shape of axis dimension when label value(2) not equal to ignore_index(-100), But received label value as 2 and shape of axis dimension is 2 [Hint: Expected lbl < axis_dim, but received lbl:2 >= axis_dim:2.] (at /paddle/paddle/fluid/operators/math/cross_entropy.cc:75) [operator < softmax_with_cross_entropy > error]

Was my way wrong?

linjieccc commented 2 years ago

Please modify num_class=len(train_ds.label_list) to num_classes=len(train_ds.label_list). Sorry for the mistake, the wrong comment will be updated by https://github.com/PaddlePaddle/PaddleNLP/pull/1083

Magic-Fy commented 2 years ago

Ok, it works. Thanks a lot. πŸ‘