从零开始学Python自然语言处理(十五)—— fasttext-pytorch代码实现

浏览: 2713

前文传送门:

从零开始学自然语言处理(十四)——Fasttext原理详解 

之前已经介绍过fasttext的基本概念从零开始学自然语言处理(十四)——Fasttext原理详解 ,这里给出实现fasttext的pytorch版本。思想很简单,但这里就不给出数据预处理的代码了,毕竟大家使用的具体场景不一样。小编尽量给出每一行代码的注释。

      import torch
      import torch.nn as nn
      import torch.optim as optim
      import pandas as pd

      设计fasttext的代码结构。思想很简单,就是先将词转换为向量形式,然后将这些向量加起来求平均。再去分类。

        class FastText(nn.Module):
            def __init__(self, vocab, w2v_dim, classes, hidden_size):
                super(FastText, self).__init__()
                #创建embedding
                self.embed = nn.Embedding(len(vocab), w2v_dim)  #embedding初始化,需要两个参数,词典大小、词向量维度大小
                self.embed.weight.requires_grad = True #需要计算梯度,即embedding层需要被训练
                self.fc = nn.Sequential(              #序列函数
                    nn.Linear(w2v_dim, hidden_size),  #这里的意思是先经过一个线性转换层
                    nn.BatchNorm1d(hidden_size),      #再进入一个BatchNorm1d
                    nn.ReLU(inplace=True),            #再经过Relu激活函数
                    nn.Linear(hidden_size, classes)#最后再经过一个线性变换
                )
            def forward(self, x):                      
                x = self.embed(x)                     #先将词id转换为对应的词向量
                out = self.fc(torch.mean(x, dim=1))   #这使用torch.mean()将向量进行平均
                return out

        训练模型,主要要将网络的模式设置为训练模式。

        def train_model(net, epoch, lr, data, label):      #训练模型
        print("begin training")
        net.train() # 将模型设置为训练模式,很重要!
        optimizer = optim.Adam(net.parameters(), lr=lr) #设置优化函数
        Loss = nn.CrossEntropyLoss() #设置损失函数
        for i in range(epoch): # 循环
        optimizer.zero_grad() # 清除所有优化的梯度
        output = net(data) # 传入数据,前向传播,得到预测结果
        loss = Loss(output, target) #计算预测值和真实值之间的差异,得到loss
        loss.backward() #loss反向传播
        optimizer.step() #优化器优化参数

        # 打印状态信息
        print("train epoch=" + str(i) + ",loss=" + str(loss.item()))
        print('Finished Training')

        验证代码,检测模型训练效果。同时,记得将网络模式调整为验证模式。

          def model_test(net, test_data, test_label):
          net.eval() # 将模型设置为验证模式
          correct = 0
          total = 0
          with torch.no_grad():
          outputs = net(test_data)
          # torch.max()[0]表示最大值的值,troch.max()[1]表示回最大值的每个索引
          _, predicted = torch.max(outputs.data, 1) # 每个output是一行n列的数据,取一行中最大的值
          total += test_label.size(0)
          correct += (predicted == test_label).sum().item()
          print('Accuracy: %d %%' % (100 * correct / total))

          整个代码基本就写好了,现在来写一下main函数。这里没有写具体数据预处理的方法,下面的代码中,data,label为训练数据和训练标签。test_data, test_label为验证数据和验证标签。

            if __name__ == "__main__":
            #这里没有写具体数据的处理方法,毕竟大家所做的任务不一样
            batch_size = 64
            epoch = 10 # 迭代次数
            w2v_dim = 300 # 词向量维度
            lr = 0.001
            hidden_size = 128
            classes = 2

            # 定义模型
            net = FastText(vocab=vocab, w2v_dim=w2v_dim, classes=classes, hidden_size=hidden_size)

            # 训练
            print("开始训练模型")
            train_model(net, epoch, lr, data, label)
            # 保存模型
            print("开始测试模型")
            model_test(net, test_data, test_label)

            整个代码就写好了。代码整体来讲还是很简单的,pytorch的初学者可以用这个代码来试试手。

            扫码下图关注我们不会让你失望!

            image.png

            推荐 0
            本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
            转载、引用前需联系作者,并署名作者且注明文章出处。
            本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

            0 个评论

            要回复文章请先登录注册