pytorch学习笔记2
RNN结构图
pytorch保存模型方法
Pytorch 有两种保存模型的方式,都是通过调用pickle序列化方法实现的。
第一种方法只保存模型参数。第二种方法保存完整模型。
推荐使用第一种,第二种方法可能在切换设备和目录的时候出现各种问题。
1.保存模型参数方法(推荐):
|
print(model.state_dict().keys()) # 输出模型参数名称 # 保存模型参数到路径"./data/model_parameter.pkl" torch.save(model.state_dict(), "./data/model_parameter.pkl") new_model = Model() # 调用模型Model new_model.load_state_dict(torch.load("./data/model_parameter.pkl")) # 加载模型参数 new_model.forward(input) # 进行使用 |
2.保存完整模型(不推荐)
|
torch.save(model, './data/model.pkl') # 保存整个模型 new_model = torch.load('./data/model.pkl') # 加载模型
|
3.Transfomers库预训练模型的加载
|
# 使用transformers预训练后进行保存 model.save_pretrained(model_path) tokenizer.save_pretrained(tokenizer_path) # 预训练模型使用 `from_pretrained()` 重新加载 model.from_pretrained(model_path) |
BiGram的中文字符级预测(单向)
测试文档
广州市花都区劳动人事争议仲裁委员会
仲裁裁决书
穗花劳人仲案〔2022〕402号
申请人:何某,男,汉族,1973年2月10日出生,住址:湖南省新田县。
被申请人:广州华宇装饰设计工程有限公司,
地址:广州市花都区建设北路218号沃达商务中心316室。
法定代表人:刘彩凤。
申请人何某诉被申请人广州华宇装饰设计工程有限公司劳动争议一案,本委依法受理并进行开庭审理,申请人何某到庭参加了庭审,被申请人经依法通知后无正当理由未到庭,本委依法对其作缺席审理。本案现已审理终结。
申请人诉称:申请人于2021年4月28日入职被申请人单位工作,工作岗位是泥工,双方没有签订劳动合同,未缴社保,2021年5月15日申请人离职后,双方劳动关系解除。
仲裁请求:1、裁决被申请人向申请人全额支付2021年4月28日至2021年5月15日拖欠的工资,合计人民币11628元。被申请人未予答辩也未提交证据。
本委审理查明:申请人于2021年12月24日向本委申请劳动仲裁。
申请人主张于2021年4月28日入职被申请人单位工作,工作岗位是泥工,双方没有签订劳动合同,没有缴纳社保,由被申请人单位的项目经理郭工招聘过去工作,负责室内的泥水装修,由被申请人负责材料,申请人负责人工,工资按照不同的工序难易程度按不同的单价进行计算,具体工作的地址在广州市花都区建设北路218号沃达商务中心2楼3楼,共产生了人工费11628元。除了申请人外,还有申请人的老婆胡知姻及申请人雇请的一名人员罗利军共同完成该工程,申请人与罗利军约定每天人工费500元共3500元,且申请人已经支付了3500元给罗利军,该工程具体的完工时间是2021年5月15日,完工后申请人当天便离开被申请人公司。
申请人还主张工作的期间被申请人的实际经营者刘建华(法定代表人刘彩凤的丈夫)经常到工地看工程进度,但请假无需经过刘建华的同意,只要将泥水装饰工程按时按质量做好即可。后来,申请人与被申请人于2021年12月4日签订了《付款协议》,但被申请人仍然没有支付过款项给申请人。
申请人为证明其主张,向本委提交了《付款协议》,《付款协议》明确记载了“前有华宇公司尚未支付....泥工费用总额为11628元整,经双方同意于2021年12月20日前付5000元整,剩余的尾款于今年底结清”,该协议盖有被申请人的合同专用章及申请人的签名。
以上事实,有申请人的陈述、有关书证、庭审笔录等为据,证据确实,足以认定。
本委认为:本委通过合法途径将开庭通知书及相关资料送达被申请人,但被申请人没有正当理由拒绝出庭,也没有向本委提交任何答辩资料。根据《中华人民共和国劳动争议调解仲裁法》第三十六条的规定,本委依法对被申请人作出缺席裁决。
申请人主张被申请人还拖欠其工资11628元没有支付,但同时又主张完成工程的除了其本人外还有其老婆及另外雇请的一名工人,同时在完成该工程期间无需接受被申请人实际经营者的管理,而其提交与被申请人签订的《付款协议》中也只是明确为“泥工费用总额”而非工资。本委认为,申请人的主张及证据并不符合劳社部发〔2005〕12号《关于确立劳动关系有关事项的通知》第一条规定的条件,申请人与被申请人之间不存劳动关系。鉴于此,申请人要求被申请人支付其工资11628元,于法无据,本委不予支持。
根据《中华人民共和国劳动争议调解仲裁法》第三十六条、第四十七条、第四十八条、第四十九条,劳社部发〔2005〕12号《关于确立劳动关系有关事项的通知》第一条之规定,裁决如下:
驳回申请人的仲裁请求。
本仲裁裁决为终局裁决,裁决书自作出之日起发生法律效力。如劳动者不服本裁决,可以自收到本裁决书之日起十五日内向有管辖权的人民法院起诉。用人单位有证据证明本裁决有《中华人民共和国劳动争议调解仲裁法》第四十九条第一款规定情形之一的,可以自收到裁决书之日起三十日内向广州市中级人民法院申请撤销裁决。
仲裁员:骆玉仪
二○二二年三月二十四日
书记员:江志炜
代码
import json
import math
import os.path
import torch
from torch import nn
from torch.autograd import Variable
from torch.nn import functional as F
CONTEXT_SIZE=2
EMBEDDING_DIM=100
LR=0.001
LOSS=0.01
PATH="doc.txt"
if not os.path.exists("./data"):
os.mkdir("./data")
FOLDER=F'lr{LR}_loss{LOSS}_emdim{EMBEDDING_DIM}'
FOLDER_PATH=f"./data/{FOLDER}"
MODEL_PATH=f"./data/{FOLDER}/model.pkl"
VOCAB_PATH=f"./data/{FOLDER}/vocab.json"
if not os.path.exists(FOLDER_PATH):
os.mkdir(FOLDER_PATH)
file=open(PATH,mode='r',encoding='utf-8')
sen=file.read()
file.close()
trigram=[((sen[i],sen[i+1]),sen[i+2]) for i in range(len(sen)-2)]
vocab=set(sen)#vocab = {set: 356} {'做', '通', '关', '工',
word2index={word:i for i,word in enumerate(vocab)}
index2word={word2index[word]:word for word in word2index}
class NGram(nn.Module):
def __init__(self, vocab_size,context_size,embedding_dim):
super(NGram,self).__init__()
self.n_word=vocab_size
self.embedding=nn.Embedding(vocab_size,embedding_dim)
self.linear1=nn.Linear(context_size*embedding_dim,128)
self.linear2=nn.Linear(128,self.n_word)
def forward(self,x):#x = {Tensor: (2, 356)}
#Embedding层,将字典中汉字的索引号,变成向量
emb=self.embedding(x)#emb = {Tensor: (2, 10)} embedding_dim=10的情况
emb=emb.view(1,-1)#展开emb = {Tensor: (1, 20)} embedding_dim=10的情况
#线性层
out=self.linear1(emb)
#激活函数,加入非线性因素
out=F.relu(out)#out = {Tensor: (1, 128)}
#线性层2
out=self.linear2(out)#out = {Tensor: (1, 356)}
#将矩阵归一化,按照列进行归一化,并取对数
log_prob=F.log_softmax(out,dim=1)
return log_prob
def train(input,epochs,vocab_size,context_size,embedding_dim):
ngram=NGram(vocab_size,context_size,embedding_dim)
optimizer=torch.optim.Adam(ngram.parameters(),lr=LR)
for e in range(epochs):
for index in range(len(input)):
input0=input[index][0][0]#第一个汉字
input1 = input[index][0][1]#第二个汉字
t0= torch.LongTensor([word2index[input0]])#按索引号创建一个张量
t1 = torch.LongTensor([word2index[input1]]) # 按索引号创建一个张量
t=torch.cat([t0,t1],dim=0)#将两个向量按行进行拼接,1行变2行
optimizer.zero_grad()#优化器梯度清零
out=ngram.forward(t)#前向传播 计算出结果 结果是1维向量,长度为字典长度 out = {Tensor: (1, 356)}
real= torch.zeros_like(out)#创建全0向量,长度为字典长度
real_zi=input[index][1] #获取真实值汉字
real[0][word2index[real_zi]]=1 #获取真实值的独热码
loss=F.cross_entropy(out,real)#用交叉熵函数计算损失值 loss = {Tensor: ()} tensor(5.9448, grad_fn=<DivBackward1>)
loss.backward()#反向传播 计算梯度
optimizer.step()#优化参数
print(f'epoch={e} loss={loss.item()}')
if loss<0.01 and e>10:#训练终止条件,损失函数值<0.01并且训练轮数>10
#训练完成时,需要做2件事,保存字典,保存模型参数
file = open(VOCAB_PATH, mode='w', encoding='utf-8')
file.write(','.join(vocab))
file.close()
torch.save(ngram,MODEL_PATH)
break
def predict(input):
#读取本地字典文件
file=open(VOCAB_PATH,mode='r',encoding='utf-8')
vocab=file.read()
vocab=vocab.split(',')
file.close()
word2index = {word: i for i, word in enumerate(vocab)}
index2word = {word2index[word]: word for word in word2index}
input0 = input[0] # 第一个汉字
input1 =input [1] # 第二个汉字
t0 = torch.LongTensor([word2index[input0]]) # 按索引号创建一个张量
t1 = torch.LongTensor([word2index[input1]]) # 按索引号创建一个张量
t = torch.cat([t0, t1], dim=0) # 将两个向量按行进行拼接,1行变2行
#加载模型
ngram=torch.load(MODEL_PATH)#加载模型
out =ngram.forward(t) # 进行预测
out=torch.squeeze(out)#转换为一维
index=torch.argmax(out)#获取最大概率元素的索引
out2=torch.exp(out)
i=index.item()#获取索引值
return index2word[i],math.exp(out[i])#通过索引值获取字符和概率
#train(trigram,100,len(vocab),CONTEXT_SIZE,EMBEDDING_DIM)
input='申请'
pre,prob=predict(input)
print(f'input={input} predict={pre} problity={prob}')
input='法受'
pre,prob=predict(input)
print(f'input={input} predict={pre} problity={prob}')
input='正当'
pre,prob=predict(input)
print(f'input={input} predict={pre} problity={prob}')
input='缺席'
pre,prob=predict(input)
print(f'input={input} predict={pre} problity={prob}')
# 预测结果8.2659e-01
# input=申请 predict=人 problity=0.8265909677808763
# input=法受 predict=理 problity=0.9957110848813666
# input=正当 predict=理 problity=0.9998737733040751
# input=缺席 predict=裁 problity=0.7423789872547777
# word_to_idx={"hello":0,"world":1} #定义词典
# embeds=nn.Embedding(2,5) #2是词典大小,也就是词典元素个数;5是输出向量维度
# hello_idx=torch.LongTensor([word_to_idx['hello']]);
# hello_idx= Variable(hello_idx) #tensor([0]) tensor([0])hello_idx
# hello_embeds=embeds(hello_idx) #tensor([[ 2.3647, 1.1617, -0.8720, -0.0771, 0.7739]], grad_fn=<EmbeddingBackward0>)
# print(hello_embeds)
# idx=Variable(torch.LongTensor([2]))#tensor([2])
# emb=embeds(idx)#IndexError: index out of range in self
# print(emb)
词嵌入测试
import json
import math
import os.path
import torch
from torch import nn
from torch.autograd import Variable
from torch.nn import functional as F
DOC_PATH="doc.txt"
def readFile(path:str):
file = open(path, mode='r', encoding='utf-8')
content = file.read()
file.close()
return content
def writeFile(path:str,content:str):
file = open(path, mode='w', encoding='utf-8')
content = file.write(content)
file.close()
def getCharset(content:str):
chset=set()
for c in content:
chset.add(c)
return chset
#one-hot表示法
def one_hot(s:str,char_set:set()):
char_list=list(char_set)
n_char=len(char_list)+1
tensor=torch.zeros(len(s),1,n_char)
for i,c in enumerate(s):
try:
index=char_list.index(c)
except:
index=n_char-1
tensor[i][0][index]=1 #按照下标对应索引项就是1,其余项全部为0
return tensor
#索引表示法
def str2tensor(s:str,char_set:set):
char_list=list(char_set)
n_char=len(char_list)+1
tensor=torch.zeros(len(s),dtype=torch.long)
for i,c in enumerate(s):
try:
index=char_list.index(c)
except:
index=n_char-1
tensor[i]=index #将字符串中的文字,逐个转换成该文字在词典中的索引号
return tensor
content=readFile(DOC_PATH)
char_set=getCharset(content)
sentence=content.split('\n')[0]
tensor=str2tensor(sentence,char_set)#tensor = {Tensor: (17,)}
print(sentence)
print(tensor)
#输出结果
# 广州市花都区劳动人事争议仲裁委员会
# tensor([120, 36, 236, 167, 34, 222, 72, 171, 153, 135, 87, 112, 57, 342,
# 187, 170, 129])
vocab_size=len(char_set)+1#vocab_size = {int} 357
embed_dim=10
embedding=nn.Embedding(vocab_size,embed_dim)
out=embedding(tensor)
print(out)#out = {Tensor: (17, 10)}
#Embedding层,将一个索引号,或者一组索引号,变成一个指定维度的向量
#每个索引数字,变成一个10维向量,如果是多个索引L批量操作,就变成一个L*10的矩阵
#句子长度对应out的行数,embed_dim对应out的列数
#输入的tensor中的数字,不能超过vocab_size,否则会报错
#end
标签:vocab,torch,笔记,学习,pytorch,申请人,input,被申请人,out From: https://www.cnblogs.com/zhangdezhang/p/17100591.html