• 微调模型的作用:
      • 微调模型一般用在迁移学习中的预训练模型之后, 因为单纯的预训练模型往往不能针对特定领域或任务获得预期结果, 需要通过微调模型在特定领域或任务上调节整体模型功能, 使其适应当下问题.

    • 构建全连接微调模型的代码分析:
      1. import torch
      2. import torch.nn as nn
      3. import torch.nn.functional as F
      4. class Net(nn.Module):
      5. """定义微调网络的类"""
      6. def __init__(self, char_size=20, embedding_size=768, dropout=0.2):
      7. """
      8. :param char_size: 输入句子中的字符数量, 因为规范后每条句子长度是max_len, 因此char_size为2*max_len
      9. :param embedding_size: 字嵌入的维度, 因为使用的bert中文模型嵌入维度是768, 因此embedding_size为768
      10. :param dropout: 为了防止过拟合, 网络中将引入Dropout层, dropout为置0比率, 默认是0.2
      11. """
      12. super(Net, self).__init__()
      13. # 将char_size和embedding_size传入其中
      14. self.char_size = char_size
      15. self.embedding_size = embedding_size
      16. # 实例化化必要的层和层参数:
      17. # 实例化Dropout层
      18. self.dropout = nn.Dropout(p=dropout)
      19. # 实例化第一个全连接层
      20. self.fc1 = nn.Linear(char_size*embedding_size, 8)
      21. # 实例化第二个全连接层
      22. self.fc2 = nn.Linear(8, 2)
      23. def forward(self, x):
      24. # 对输入的张量形状进行变换, 以满足接下来层的输入要求
      25. x = x.view(-1, self.char_size*self.embedding_size)
      26. # 使用dropout层
      27. x = self.dropout(x)
      28. # 使用第一个全连接层并使用relu函数
      29. x = F.relu(self.fc1(x))
      30. # 使用dropout层
      31. x = self.dropout(x)
      32. # 使用第二个全连接层并使用relu函数
      33. x = F.relu(self.fc2(x))
      34. return x

    • 代码位置: /data/doctor_online/bert_serve/finetuning_net.py

    • 实例化参数:
      1. embedding_size = 768
      2. char_size = 20
      3. dropout = 0.2

    • 输入参数:
      1. x = torch.randn(1, 20, 768)

    • 调用:

      1. net = Net(char_size, embedding_size, dropout)
      2. nr = net(x)
      3. print(nr)
    • 输出效果:

      1. tensor([[0.0000, 0.4061]], grad_fn=<ReluBackward0>)

    • 小节总结:
      • 学习了微调模型的作用:
        • 微调模型一般用在迁移学习中的预训练模型之后, 因为单纯的预训练模型往往不能针对特定领域或任务获得预期结果, 需要通过微调模型在特定领域或任务上调节整体模型功能, 使其适应当下问题.

    • 学习并实现了构建全连接微调模型的类: class Net(nn.Module)