qwen模型用soft prompt实现文本分类

之前写过p tuning,用的是官方文档中的模型和任务。现在用qwen中文模型和中文文本分类任务。代码已上传。

数据集介绍

魔搭社区汇聚各领域最先进的机器学习模型,提供模型探索体验、推理、训练、部署和应用的一站式服务。icon-default.png?t=O83Ahttps://www.modelscope.cn/datasets/wowhaha/moral-foundation-news_2000我用的数据是魔塔上的“新闻文本+道德判断”数据集,包含基于道德基础分类的新闻文章,适用于中文的多标签文本分类任务。每篇新闻文章根据其道德倾向进行标注,分为实用(Pragmatism)/ 理想(Idealism)”、“责任(Responsibility)/ 利益(Profit)”、“创新(Innovation)/ 守旧(Conservatism)三个标签。

这是数据形式。system是系统给的instruction(所有数据的instruction都是一样的),query是要分类的文本,response是分类标签。

{'query': '部署集中式可持续智能平台,以促进和简化PETRONAS供应链脱碳的努力。',
 'response': '责任/利益',
 'system': '你是一位道德判断模型。根据给出的有关环境报道的新闻文本,请判断其倾向于以下哪一个维度:责任/利益、实用/理想、创新/守旧、非道德。你的回答必须只包含其中的一个维度。'}

模型是qwen2.5 1.5b版本。

魔搭社区汇聚各领域最先进的机器学习模型,提供模型探索体验、推理、训练、部署和应用的一站式服务。icon-default.png?t=O83Ahttps://www.modelscope.cn/models/Qwen/Qwen2.5-1.5B-Instruct

预准备

import os
import torch
from pprint import pprint
from datasets import load_dataset
import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers import Trainer, TrainingArguments, DataCollatorWithPadding, DataCollatorForLanguageModeling, DataCollatorForSeq2Seq, default_data_collator
from peft import AutoPeftModelForCausalLM, get_peft_model, PromptTuningInit, PromptEncoderConfig, PromptTuningConfig, TaskType


os.environ['CUDA_VISIBLE_DEVICES'] = '7'
model_name_or_path = "../../DataCollection/officials/Qwen2.5-1.5b-Instruct"
tokenizer_name_or_path = model_name_or_path

tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
if tokenizer.pad_token_id is None:
    tokenizer.pad_token_id = tokenizer.eos_token_id
    
base_model = AutoModelForCausalLM.from_pretrained(model_name_or_path)

def inference_single(model, tokenizer, text, device=None):
    if not device:
        device = 'cuda' if torch.cuda.is_available() else 'cpu'
    model.to(device)
    inputs = tokenizer(text, return_tensors='pt')
    outputs = model.generate(
        input_ids=inputs["input_ids"].to(device),
        attention_mask=inputs["attention_mask"].to(device),
        max_new_tokens=20,
        eos_token_id=t
<think>嗯,用户想了解如何使用DeepSeek-R1-Distill-Qwen-1.5B模型进行文本分类,需要示例代码。首先,我得回顾一下提供的引用内容。引用[2]和[3]提到了本地使用该模型的步骤,包括环境准备、加载模型和Tokenizer。所以,我需要基于这些信息构建回答。 首先,环境准备方面,用户需要安装PyTorch和transformers库。然后,加载模型和分词器,这里可以使用AutoTokenizer和AutoModelForCausalLM,因为引用[3]提到过。但文本分类通常需要分类头,而生成模型可能需要调整。可能需要添加自定义的分类层,或者在模型顶部使用序列分类的方法。 接下来,数据预处理部分。用户需要将文本转换为模型能接受的输入格式,比如使用分词器进行编码,添加填充和截断。然后构建数据集和数据加载器。 然后是模型微调。由于这是一个生成模型,可能需要调整模型结构,比如在模型输出后添加线性层进行分类。或者,可以使用模型的隐藏状态作为特征,输入到分类器中。这里需要示例代码,所以应该展示如何修改模型,添加分类头,并设置训练循环。 评估部分需要计算准确率等指标,最后进行推理。示例代码应该覆盖这些步骤,并提醒用户可能需要调整超参数,比如学习率、批次大小等。 还需要注意,用户提到的模型是蒸馏得到的,可能在微调时需要较小的学习率,避免破坏预训练权重。另外,如果显存不足,可能需要使用梯度累积或混合精度训练。 最后,根据用户提供的引用,确保在回答中正确引用来源,比如环境准备和模型加载部分引用[2]和[3]。可能还需要指出,文本分类不是生成模型的主要任务,因此微调是必要的。</think>### DeepSeek-R1-Distill-Qwen-1.5B模型文本分类实现方法 #### 1. 环境准备 需安装PyTorch和HuggingFace Transformers库: ```bash pip install torch transformers datasets ``` 建议使用NVIDIA GPU加速训练(显存建议≥8GB)[^2] #### 2. 模型加载与配置 ```python from transformers import AutoTokenizer, AutoModelForSequenceClassification model_name = "deepseek-ai/deepseek-r1-distill-qwen-1.5B" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained( model_name, num_labels=5, # 假设5分类任务 ignore_mismatched_sizes=True # 允许修改分类头 ) ``` #### 3. 数据预处理示例 ```python from datasets import load_dataset dataset = load_dataset("imdb") # 以IMDB影评数据集为例 def preprocess(examples): return tokenizer( examples["text"], padding="max_length", truncation=True, max_length=512 ) encoded_dataset = dataset.map(preprocess, batched=True) encoded_dataset.set_format(type="torch", columns=["input_ids", "attention_mask", "label"]) ``` #### 4. 微调训练代码 ```python from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir="./results", per_device_train_batch_size=4, learning_rate=2e-5, num_train_epochs=3, logging_dir="./logs", fp16=True # 启用混合精度训练 ) trainer = Trainer( model=model, args=training_args, train_dataset=encoded_dataset["train"], eval_dataset=encoded_dataset["test"] ) trainer.train() ``` #### 5. 推理示例 ```python text = "这部电影的剧情非常精彩" inputs = tokenizer(text, return_tensors="pt") outputs = model(**inputs) predicted_class = outputs.logits.argmax().item() print(f"预测类别: {predicted_class}") ``` #### 关键技术点: 1. 使用`AutoModelForSequenceClassification`自动添加分类头 2. 通过`ignore_mismatched_sizes`参数适配自定义分类任务 3. 混合精度训练(fp16)降低显存消耗 4. 使用HuggingFace Trainer简化训练流程[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值