首页 > 其他分享 >pytorch学习笔记2

pytorch学习笔记2

时间:2023-02-08 09:58:19浏览次数:44  
标签:vocab torch 笔记 学习 pytorch 申请人 input 被申请人 out

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

相关文章

  • Unity学习路线
    【第一阶段】01Unity3D基础操作02C#语言基础03PS图像简单处理04Unity3D界面UI(UGUI或NGUI)05Unity3D动画系统(Mecanim和DOtween)06Unity3D图形数学(点乘、欧......
  • 学习Python包含哪些基础内容
    对于刚刚入行的新手来说,如何打好Python基础非常重要。首先我们要了解Python语言起源、设计目标、设计哲学,Python语言的优缺点和面向对象的基本概念、执行方式、集成开发环......
  • 读Java实战(第二版)笔记04_用流收集数据
    1. 方便程序员和可读性是头等大事!1.1. 函数式API设计更易复合和重用2. 归约和汇总为一个值2.1. counting()2.1.1. 计数2.2. maxBy2.2.1. 查找流中的最大值2......
  • 开关电源环路学习
    关于下面一些开关电源环路的问题,你是否也有过?1、开关电源有开关,根本就不是一个线性系统,传递函数是咋弄出来的?2、系统环路框图的输入量为什么不是Vin,而是参考电压Vref?......
  • 学习方法:尼古拉斯·卢曼的思考方法(思考的方法:卡片法)
    学习方法:尼古拉斯·卢曼的思考方法(思考的方法:卡片法)    一、翻译内容: 尼古拉斯·卢曼的思考方法(思考的方法:卡片法) 总结: 1、频繁地、深入地思考“话题(......
  • 自我介绍与学习记录
    这个作业属于哪个课程https://edu.cnblogs.com/campus/fzzcxy/2023learning这个作业要求在哪里https://edu.cnblogs.com/campus/fzzcxy/2023learning/homework/1......
  • 自我介绍与学习记录
    自我介绍与学习记录这个作业属于哪个课程https://edu.cnblogs.com/campus/fzzcxy/2023learning这个作业要求在哪里https://edu.cnblogs.com/campus/fzzcxy/2023......
  • c++学习 4 运算符及其应用技巧
    一按位与运算符“&”按位与运算符,全1为1,有0则0。特点:和1相与保持不变,和0相与都变为0。功能:将指定位置清0。example:  10001100&11001011--------------------......
  • 自我介绍及学习记录
    这个作业属于哪个课程https://edu.cnblogs.com/campus/fzzcxy/2023learning这个作业要求在哪里https://edu.cnblogs.com/campus/fzzcxy/2023learning/homework/1......
  • 深度学习之GRU网络
    https://www.cnblogs.com/jiangxinyang/p/9376021.html 1、GRU概述GRU是LSTM网络的一种效果很好的变体,它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常......