对 textcnn 的理解

虽然用 cnn 训练主题分类很久了,金牌突然有点疑惑,本质上 textcnn 就是用 kernel 进行特征提取,ok,那么问题来了:为什么我要进行 embedding?embedding 之后应该还是表示这个字(中文),那我用embedding_dim=1(就是字典 id)来做可不可以,理论上应该没啥变化的哈(自己认为)

那就做个实验吧

一、把之前embedding = tf.get_variable('embedding', [self.config.vocab_size, self.config.embedding_dim], trainable=Flase) 设置成不可训练,也就是说在训练过程中 embedding 不改变,结果比原来trainable=True 稍微差一点。

二、把上式self.config.embedding_dim=1,接着测试,效果十分差,惨不忍睹。

三、那重新设置回去,使得 embedding可训练,看看是不是能够打到 word2vec 的效果,代码有点问题,暂时不知道那里错了,错误如下:

目前的结论就是 embedding 是十分有必要的,应该会打到 word2vec 的效果,等我找到 bug 再展示吧

### TextCNN 模型概述 TextCNN 是一种基于卷积神经网络(CNN)设计的文本分类模型,最初由 Yoon Kim 在 2014 年的 EMNLP 论文中提出[^2]。该模型的核心思想是利用 CNN 提取局部特征的能力,结合词嵌入技术完成文本分类任务。 #### 模型架构详解 1. **输入层** 输入是一组经过分词并转换成固定长度的词向量序列。这些词向量通常来源于预训练的词嵌入模型(如 Word2Vec 或 GloVe),或者通过随机初始化的方式生成[^1]。 2. **卷积层** 卷积操作用于提取 n-gram 特征。同于图像中的二维卷积核,TextCNN 使用的是宽度等于词向量维度的一维卷积核。常见的卷积核尺寸为 (3, 4, 5),分别对应于三元语法、四元语法和五元语法的特征提取。每种大小的卷积核可以设置多个实例以捕获更多样化的模式。 3. **池化层** 经过卷积之后,采用最大池化(Max-Pooling)操作保留最重要的特征信息。无论句子长短如何变化,这一过程都能确保最终输出具有固定的维度。 4. **全连接层与 Softmax 输出** 池化后的特征被拼接在一起送入全连接层,并通过 softmax 函数计算各个类别的概率分布,从而实现多类别分类目标。 #### 主要特点分析 - **优点** - 结构简洁明了,易于理解和部署; - 利用已有的高质量词向量能够显著提升性能表现,在多种公开数据集上的实验表明其效果优于传统方法[^3]; - 对短文本尤其有效,因为这类情况下全局上下文依赖较弱而局部语义关联更强。 - **局限性** - 缺乏对具体特征贡献程度的有效衡量手段,难以像决策树那样直观展示哪些部分最为关键; - 当面对复杂关系建模需求时可能显得力从心,比如长距离依赖问题更适合 RNN/LSTM 类架构解决。 #### 实际应用场景举例 由于其实现简便高效且泛化能力强的特点,TextCNN 已广泛应用于各类自然语言处理领域内的子任务之中: - 文本情感分析; - 新闻主题划分; - 垃圾邮件过滤; - 用户评论质量评定等等[^4]。 以下是 Python 中基于 TensorFlow/Keras 构造的一个基础版 TextCNN 示例代码片段: ```python import tensorflow as tf from tensorflow.keras import layers, models def create_textcnn(vocab_size, embed_dim, max_len, num_classes): inputs = layers.Input(shape=(max_len,)) # Embedding Layer x = layers.Embedding(input_dim=vocab_size, output_dim=embed_dim)(inputs) pooled_outputs = [] filter_sizes = [3, 4, 5] for fsz in filter_sizes: conv = layers.Conv1D(filters=100, kernel_size=fsz, activation='relu')(x) pool = layers.GlobalMaxPooling1D()(conv) pooled_outputs.append(pool) concat = layers.Concatenate(axis=-1)(pooled_outputs) dropout = layers.Dropout(0.5)(concat) outputs = layers.Dense(num_classes, activation='softmax')(dropout) model = models.Model(inputs=inputs, outputs=outputs) return model model = create_textcnn(vocab_size=10000, embed_dim=128, max_len=50, num_classes=2) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) print(model.summary()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值