#本地离线模型使用
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline, BertForSequenceClassification, BertTokenizer
#设置具体包含config.json的目录,只支持绝对路径
model_dir = r"models\bert-base-chinese"
#model_dir = r"C:\Users\lb\PycharmProjects\AiStudyProject\trsanformers_test\models\bert-base-chinese\models--bert-base-chinese\snapshots\c30a6ed22ab4564dc1e3b2ecbf6e766b0611a33f"
#加载模型和分词器(方法一)
model = BertForSequenceClassification.from_pretrained("bert-base-chinese",cache_dir=model_dir)
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese",cache_dir=model_dir)
#加载模型和分词器(方法二)
#model = BertForSequenceClassification.from_pretrained(model_dir)
#tokenizer = AutoTokenizer.from_pretrained(model_dir)
#创建分类pipleine
classifier = pipeline("text-classification",model=model,tokenizer=tokenizer,device="cpu")
#进行文本分类
result = classifier("你好,我是一款语言模型")
print(result)
print(model)
BertForSequenceClassification(
(bert): BertModel(
## 文本转向量(编码)
(embeddings): BertEmbeddings(
(word_embeddings): Embedding(21128, 768, padding_idx=0)
(position_embeddings): Embedding(512, 768)
(token_type_embeddings): Embedding(2, 768)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
### 特征提取 编码模型,将词向量的意思进行特征提取和理解
(encoder): BertEncoder(
(layer): ModuleList(
(0-11): 12 x BertLayer(
(attention): BertAttention(
(self): BertSdpaSelfAttention(
(query): Linear(in_features=768, out_features=768, bias=True)
(key): Linear(in_features=768, out_features=768, bias=True)
(value): Linear(in_features=768, out_features=768, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(output): BertSelfOutput(
(dense): Linear(in_features=768, out_features=768, bias=True)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
(intermediate): BertIntermediate(
(dense): Linear(in_features=768, out_features=3072, bias=True)
(intermediate_act_fn): GELUActivation()
)
(output): BertOutput(
(dense): Linear(in_features=3072, out_features=768, bias=True)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
)
)
## 词话层 保持模型的适用性
(pooler): BertPooler(
(dense): Linear(in_features=768, out_features=768, bias=True)
(activation): Tanh()
)
)
### 减少过拟合
(dropout): Dropout(p=0.1, inplace=False)
### 分类层
(classifier): Linear(in_features=768, out_features=2, bias=True)
)
embeddings: 包含BERT的嵌入层,负责将输入的词、位置和类型信息转换为向量表示。
encoder: BERT的编码器,由多个相同的层堆叠而成,每个层都是一个BertLayer
。
BertLayer
的列表,每个层都包含自注意力机制、中间层和输出层。
pooler: 池化层,用于从编码器的输出中提取一个固定大小的表示,通常用于分类任务。
BertModel
的嵌入层和编码器层的多个位置,以及最终的分类器之前,都使用了Dropout层来减少过拟合。综上所述,BertForSequenceClassification
模型利用BERT的预训练表示能力,通过嵌入层、编码器层和池化层提取输入序列的特征,最后通过一个分类器层将这些特征映射到分类任务的标签空间。Dropout层在多个位置被用于减少过拟合,提高模型的泛化能力。
Dropout(p=0.1, inplace=False)
是在神经网络中常用的一种正则化技术,用于减少模型在训练集上的过拟合现象。这里的 Dropout
是指在神经网络的训练过程中,随机地“丢弃”一部分神经元的输出,即让这些神经元的输出为0。这种做法可以迫使网络学习到更加鲁棒的特征表示,因为它不能依赖于任何单个神经元(或一小部分神经元)的输出。
参数解释:
p=0.1
:表示丢弃率,即在每次训练迭代中,每个神经元有10%的概率被随机丢弃。这意味着每个神经元的输出有90%的概率保持不变,10%的概率变为0。inplace=False
:这个参数指示是否在原始数据上进行修改。False
表示不会修改输入数据,而是创建一个新的变量来存储应用了Dropout之后的数据。如果设置为 True
,则会在原地修改数据,但这在大多数情况下不是推荐的做法,特别是在需要保留原始数据的情况下。Dropout技术主要在训练阶段使用,而在模型评估或预测时,通常不使用Dropout(即所有神经元都参与计算)。这是因为在训练时,Dropout通过随机丢弃神经元来减少模型对训练数据的依赖,提高模型的泛化能力;而在预测时,我们希望模型能够利用所有可用的信息来做出最准确的预测。
总之,Dropout(p=0.1, inplace=False)
是一种有效的正则化手段,通过随机丢弃一部分神经元的输出来减少过拟合,提高模型的泛化性能。
(classifier): Linear(in_features=768, out_features=2, bias=True)
表示的是一个线性分类器(或线性层)的配置信息。在神经网络中,线性层(Linear layer)是最基本的组件之一,它执行的是线性变换,通常用于从网络的某一层到下一层的映射。这里的线性分类器特指一个全连接层(fully connected layer),其配置参数解释如下:
classifier:这是该线性层的名称或标识符,在这个上下文中,它可能表示这是一个用于分类任务的层。
Linear:表明这是一个线性层。
in_features=768:这表示输入特征的数量或输入层神经元的数量。在这个例子中,线性层接受768个输入特征。这些特征可能来自前一个隐藏层的输出。
out_features=2:这表示输出特征的数量或输出层神经元的数量。在这个例子中,线性层输出2个特征,这通常意味着该网络被配置为执行二分类任务(即,预测两个类别中的一个)。
bias=True:这表明在线性变换后,每个输出特征都会加上一个偏置项(bias term)。偏置项是一个可学习的参数,它允许线性层的输出在变换后能够有一个非零的基准值。在大多数情况下,启用偏置项是有益的,因为它增加了模型的灵活性。