《自然语言处理指南》- 卷积神经网络在文本分类上的应用(更新中)

文章目录

*
TextCNN模型结构

+ 参考文章
+ 卷积操作在文本上的应用
+
* 数据源定义
* 数据embedding
* 卷积层操作
+ 池化层操作
+ 全连接层
+ 完整代码

TextCNN模型结构

参考文章

卷积操作在文本上的应用

数据源定义

  • 数据为 128 * 30 的文本转索引的数据 即 128行, 单个句子为30个词的文本
  • batch_size = 128 和 *max_seq_len = 30

数据embedding

  • num_embeddings : 文本中所有不重复单词的个数
  • embedding层会生成 num_embeddings * embedding_dim 的二维文本向量矩阵
self.embedding = nn.Embedding(num_embeddings=num_embeddings, embedding_dim=64)
  • 最终经过embedding层数据会变成 [batch_size, max_seq_len, embedding_dim] => *[128, 30, 64]

卷积层操作

  • 注意 : 卷积层的输入是 单个句子的长度 max_seq_len
  • 卷积层输出 out_channels为32, 卷积核 kernel_size大小为3, 步长 stride为2
self.conv1d = nn.Conv1d(in_channels=30, out_channels=32, kernel_size=3, stride=2)
  • 卷积核输出大小 : [batch_size, out_channels, out]
  • 计算公式如下 :

KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ L_{\text {out …

  • L i n L_in L i ​n 是 embedding_dim, 每个单词的向量维度
  • padding 是需要对数据填充的大小, 默认为 0
  • dilation : 默认为 1 目前不知道是干嘛的
  • 输入数据 [128, 30, 64] 经过卷积层后 输出结果为 *[128, 32, 31]

池化层操作

  • 定义池化层卷积核大小为31, 步长为 1
  • 池化层的作用是缩减特征, 取卷积核范围内最大的值作为新的特征
  • MaxPool1d 一维池化, 对应卷积核就是 kernel_size * 1, 如果是 MaxPool2d 就是 kernel_size * kernel_size
self.pool = nn.MaxPool1d(kernel_size=31, stride=1)

《自然语言处理指南》- 卷积神经网络在文本分类上的应用(更新中)
  • 最终池化结果为 *[128, 32, 1]

全连接层

完整代码


import torch
from torch import nn
import numpy as np
from torch.nn import functional
from torch.utils.data import DataLoader
from twitter_datasets import TwitterDatasets

class TextCNN(nn.Module):
    def __init__(self, num_embeddings):
        super(TextCNN, self).__init__()

        self.embedding = nn.Embedding(num_embeddings=num_embeddings, embedding_dim=64)

        self.conv1d = nn.Conv1d(in_channels=30, out_channels=32, kernel_size=3, stride=2)

        self.pool = nn.MaxPool1d(kernel_size=31, stride=1)
        self.decoder = nn.Linear(32, 2)

    def forward(self, inputs):

        embedded = self.embedding(inputs)

        out = self.conv1d(embedded)

        print(out.size())
        out = self.pool(out)

        print(out.size())

        out = torch.squeeze(out, -1)

        print(out.size())
        out = self.decoder(out)

        print(out.size())
        return out

if __name__ == '__main__':
    datasets = TwitterDatasets()
    train_loader = DataLoader(datasets, batch_size=128, shuffle=True)
    model = TextCNN(len(datasets.vocab_dict))

    for i, batch in enumerate(train_loader):
        out = model.forward(batch[1])
        print(out.size())

Original: https://blog.csdn.net/weixin_40040107/article/details/121107988
Author: 兀坐晴窗独饮茶
Title: 《自然语言处理指南》- 卷积神经网络在文本分类上的应用(更新中)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/666894/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球