以前不甘心,总想争个对错,现在不会了
人心各有所愿,没有道理可讲
—— 25.1.18
计算Bert模型结构中的参数数量
BertModel.from_pretrained():用于从预训练模型目录或 Hugging Face 模型库加载 BERT 模型的权重及配置。
参数名称 | 类型 | 是否必填 | 说明 |
---|---|---|---|
pretrained_model_name_or_path | 字符串 | 是 | 模型名称(如 bert-base-uncased )或本地路径。 |
config | BertConfig 对象 | 否 | 自定义配置类,用于覆盖默认配置。 |
state_dict | 字典 | 否 | 预训练权重字典,用于部分加载模型。 |
cache_dir | 字符串 | 否 | 缓存目录,用于存储下载的模型文件。 |
from_tf | 布尔值 | 否 | 是否从 TensorFlow 模型加载权重,默认为 False 。 |
ignore_mismatched_sizes | 布尔值 | 否 | 是否忽略权重大小不匹配的错误,默认为 False 。 |
local_files_only | 布尔值 | 否 | 是否仅从本地文件加载模型,默认为 False 。 |
return_dict参数:
- 当
return_dict
设置为True
时,forward()
方法返回一个BaseModelOutput
对象,该对象包含了模型的各种输出,如最后一层的隐藏状态、[CLS] 标记的输出等。 - 当
return_dict
设置为False
时,forward()
方法返回一个元组,包含与BaseModelOutput
对象相同的元素,但不包含对象结构。
numel():计算张量(Tensor)中的元素总数
参数名称 | 类型 | 是否必填 | 说明 |
---|---|---|---|
tensor | torch.Tensor | 是 | 输入的PyTorch张量。 |
parameters():返回模型中所有可训练参数的迭代器。
参数名称 | 类型 | 是否必填 | 说明 |
---|---|---|---|
recurse | 布尔值 | 否 | 是否递归获取子模块的参数,默认为True 。 |
import torch
import math
import torch.nn as nn
import numpy as np
from transformers import BertModel
model = BertModel.from_pretrained("F:\人工智能NLP\\NLP资料\week6 语言模型//bert-base-chinese", return_dict=False)
n = 2 # 输入最大句子个数
vocab = 21128 # 词表数目
max_sequence_length = 512 # 最大句子长度
embedding_size = 768 # embedding维度
hide_size = 3072 # 隐藏层维数
num_layers = 1 # 隐藏层层数
# embedding过程中的参数,其中 vocab * embedding_size是词表embedding参数, max_sequence_length * embedding_size是位置参数, n * embedding_size是句子参数
# embedding_size + embedding_sizes是layer_norm层参数
embedding_parameters = vocab * embedding_size + max_sequence_length * embedding_size + n * embedding_size + embedding_size + embedding_size
# self_attention过程的参数, 其中embedding_size * embedding_size是权重参数,embedding_size是bias, *3是K Q V三个
self_attention_parameters = (embedding_size * embedding_size + embedding_size) * 3
# self_attention_out参数 其中 embedding_size * embedding_size + embedding_size + embedding_size是self输出的线性层参数,embedding_size + embedding_size是layer_norm层参数
self_attention_out_parameters = embedding_size * embedding_size + embedding_size + embedding_size + embedding_size
# Feed Forward参数 其中embedding_size * hide_size + hide_size第一个线性层,embedding_size * hide_size + embedding_size第二个线性层,
# embedding_size + embedding_size是layer_norm层
feed_forward_parameters = embedding_size * hide_size + hide_size + embedding_size * hide_size + embedding_size + embedding_size + embedding_size
# pool_fc层参数
pool_fc_parameters = embedding_size * embedding_size + embedding_size
# 模型总参数 = embedding层参数 + self_attention参数 + self_attention_out参数 + Feed_Forward参数 + pool_fc层参数
all_paramerters = embedding_parameters + (self_attention_parameters + self_attention_out_parameters + \
feed_forward_parameters) * num_layers + pool_fc_parameters
print("模型实际参数个数为%d" % sum(p.numel() for p in model.parameters()))
print("diy计算参数个数为%d" % all_paramerters)