textCnn笔记

张开发
2026/6/20 1:41:16 15 分钟阅读
textCnn笔记
文章目录textCnn类(可复用)textCnn示例先说明下textCnn并不是一个具体的包或产品它是一个论文思路用基础的神经网络组件如卷积层、池化层、全连接层“搭积木”搭出来的一个自定义模型。textCnn类基本上不用变动构造的时候调整入参即可这样可以省代码。textCnn类(可复用)1、项目下创建models文件夹。models下创建__init__.py代码from.textcnnimportTextCNN __all__[TextCNN]2、models下创建textcnn.py代码**importtorchimporttorch.nnasnnclassTextCNN(nn.Module):def__init__(self,vocab_size,embedding_dim,num_classes,kernel_sizes(2,3,4),num_filters128,dropout0.5):super(TextCNN,self).__init__()self.embeddingnn.Embedding(vocab_size,embedding_dim)# 使用 ModuleList 来管理多个不同大小的卷积核self.convsnn.ModuleList([nn.Conv2d(1,num_filters,kernel_size(k,embedding_dim))forkinkernel_sizes])self.fcnn.Linear(num_filters*len(kernel_sizes),num_classes)self.dropoutnn.Dropout(dropout)defforward(self,x):xself.embedding(x).unsqueeze(1)# (batch, 1, seq_len, embed_dim)conv_outs[]forconvinself.convs:conv_outtorch.relu(conv(x)).squeeze(3)# (batch, num_filters, seq_len - k 1)pooledtorch.max(conv_out,dim2)[0]# (batch, num_filters)conv_outs.append(pooled)xtorch.cat(conv_outs,dim1)# (batch, num_filters * len(kernel_sizes))xself.dropout(x)xself.fc(x)returnx这样引用时很方便如frommodelsimportTextCNN modelTextCNN(...)如果要求大模型发示例可以如下描述TextCNN类已维护到models下可直接引用在此基础上提供代码即可。引用示例frommodelsimportTextCNN modelTextCNN(...)textCnn示例代码importtorchimporttorch.nnasnnimporttorch.optimasoptimimportnumpyasnp# 1. 模拟数据 (假设词汇表大小 1000, 句子长度 10, 词向量维度 128)vocab_size1000max_len10embedding_dim128num_classes2# 正面/负面# 随机生成一批数据 (batch_size4)Xtorch.randint(0,vocab_size,(4,max_len))ytorch.tensor([1,0,1,0])# 标签# 2. 定义 TextCNN 模型classTextCNN(nn.Module):def__init__(self,vocab_size,embedding_dim,num_classes):super(TextCNN,self).__init__()# 词嵌入层self.embeddingnn.Embedding(vocab_size,embedding_dim)# 定义多个不同大小的卷积核 (模拟 n-gram 特征提取)# 卷积核高度分别为 2, 3, 4宽度固定为 embedding_dimself.convsnn.ModuleList([nn.Conv2d(1,100,kernel_size(k,embedding_dim))forkin(2,3,4)])# 全连接层self.fcnn.Linear(300,num_classes)# 3个卷积核 * 100个通道self.dropoutnn.Dropout(0.5)defforward(self,x):# x shape: (batch_size, seq_len)xself.embedding(x)# (batch_size, seq_len, embedding_dim)xx.unsqueeze(1)# (batch_size, 1, seq_len, embedding_dim) - 增加通道维度# 卷积 激活 最大池化conv_outs[]forconvinself.convs:conv_outtorch.relu(conv(x)).squeeze(3)# (batch, 100, seq_len-k1)pooledtorch.max(conv_out,dim2)[0]# 最大池化 (batch, 100)conv_outs.append(pooled)# 拼接所有卷积核的输出xtorch.cat(conv_outs,dim1)# (batch, 300)xself.dropout(x)xself.fc(x)# (batch, num_classes)returnx# 3. 实例化模型、损失函数和优化器modelTextCNN(vocab_size,embedding_dim,num_classes)criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 4. 简单的训练循环 (演示用仅运行 1 次)print(开始训练...)model.train()optimizer.zero_grad()outputsmodel(X)losscriterion(outputs,y)loss.backward()optimizer.step()print(fLoss:{loss.item():.4f})# 5. 预测示例model.eval()withtorch.no_grad():test_inputtorch.randint(0,vocab_size,(1,max_len))predmodel(test_input)predicted_classtorch.argmax(pred,dim1).item()print(f预测结果:{正面ifpredicted_class1else负面})

更多文章