首页 > 其他分享 >pytorch——基于循环神经网络的情感分类

pytorch——基于循环神经网络的情感分类

时间:2023-12-21 12:23:26浏览次数:31  
标签:情感 features torch 神经网络 pytorch import size feat tensor

任务目标

基于给定数据集,进行数据预处理,搭建以LSTM为基本单元的模型,以Adam优化器对模型进行训练,使用训练后的模型进行预测并计算预测分类的准确率。

数据集信息

IMDB数据集是一个对电影评论标注为正向评论与负向评论的数据集,共有25000条文本数据作为训练集,25000条文本数据作为测试集。
已知数据集中数据格式如下表所示。

1、读取数据内容

file

2、预处理

首先,对于创建词汇表,记录每一个单词出现的频率,并由此将特征数据集转为特征向量。最后转化为tensor格式
file
由于数据量庞大,这里先用PCA将数据降维,这里选择降到20个维度
file
将特征数据集和标签进行匹配,并每两个数据作为一个批次,全部数据进行随机的打乱
file

3、构建模型

这里采用pytorch中的LSTM来得到LSTM层的状态
file
LSTM层总共设置4层,传入初始隐藏状态的细胞内容和输入内容。最后取得最后的时间步的输出

4、模型训练

损失函数选择均方误差函数,优化器选择了Adam优化,总共训练4代
file
绘制出损失值的变化图像
file

5、模型评估

将测试集的内容导入并做和训练集一样的预处理,然后将测试集放入模型中,将均方误差作为评价标准,计算平均误差。
file
并绘制出误差图像
Uploading file...
误差都在0.003到0.005之间,说明模型能够正确预测情感。

完整代码


import gzip
import pandas as pd
from io import StringIO
import torch
import torch.nn as nn
import torch.optim as optim


feat_file_path = 'labeledBow.feat'

with open(feat_file_path, 'r') as file:
    lines = file.readlines()  # 逐行读取文件内容


# 显示部分文件内容(可根据需要调整)
# for line in lines[990:1000]:  # 显示前10行内容
#     print(line)


# In[2]:


labels = []
features = []

for line in lines:
    parts = line.split(' ')
    labels.append(int(parts[0]))
    feats = {}
    for part in parts[1:]:
        index, value = part.split(':')
        feats[int(index)] = float(value)
    features.append(feats)


# In[3]:


# 1. 创建词汇表
vocab = {}
for feat_dict in features:
    vocab.update(feat_dict)

# 创建特征索引到新的连续索引的映射
feature_idx = {feat: idx for idx, feat in enumerate(sorted(vocab.keys()))}

# 2. 创建特征向量
max_features = len(vocab)
feature_vectors = []
for feat_dict in features:
    # 初始化特征向量
    vector = [0.0] * max_features
    
    # 填充特征向量
    for feat_idx, feat_value in feat_dict.items():
        vector[feature_idx[feat_idx]] = feat_value
    
    feature_vectors.append(vector)

# 3. 转换为张量
features_tensor = torch.tensor(feature_vectors, dtype=torch.float32)

# 检查张量形状
print(features_tensor.shape)


# In[4]:


from sklearn.decomposition import PCA
import torch

# features_tensor 是特征张量,大小为 torch.Size([25000, 89527])
# 这里将其转换为 NumPy 数组
features_np = features_tensor.numpy()

# 初始化PCA,选择需要降维的维度,这里假设降到100维
pca = PCA(n_components=20)

# 用PCA拟合数据
features_reduced = pca.fit_transform(features_np)

# 将降维后的数据转换回张量形式
features_reduced_tensor = torch.tensor(features_reduced)

# 打印降维后的数据大小
print(features_reduced_tensor.size())


# In[5]:


import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset

labels_tensor = torch.tensor(labels, dtype=torch.float32)
features_reduced = features_reduced_tensor.unsqueeze(1) 
labels_t = labels_tensor.unsqueeze(1) 

train_data = TensorDataset(features_reduced, labels_t)
train_loader = DataLoader(train_data, batch_size=2, shuffle=True)

class LSTMModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size, num_layers=4):
        super(LSTMModel, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
        out, _ = self.lstm(x, (h0, c0))
        out = self.fc(out[:, -1, :])  # 取最后一个时间步的输出
        return out

# 定义模型参数
input_size = 20
hidden_size = 128
num_layers = 4
output_size = 1

# 初始化模型、损失函数和优化器
model = LSTMModel(input_size, hidden_size, output_size, num_layers)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.0001)
losses = []  # 存储损失值
# 训练模型
num_epochs = 5
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

for epoch in range(num_epochs):
    for i, (inputs, targets) in enumerate(train_loader):
        inputs, targets = inputs.to(device), targets.to(device)
        
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs.squeeze(), targets.squeeze())

        loss.backward()
        optimizer.step()
        losses.append(loss.item())  # 记录损失值
        if (i+1) % 2 == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item()}')




# In[6]:


import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import matplotlib.pyplot as plt
# 绘制损失值变化图
plt.plot(losses, label='Training Loss')
plt.xlabel('Training Steps')
plt.ylabel('Loss')
plt.title('Training Loss over Steps')
plt.legend()
plt.show()


# In[7]:


feat_file_path = 'labeledBow_test.feat'

with open(feat_file_path, 'r') as file:
    lines = file.readlines()  # 逐行读取文件内容

labels_test = []
features_test = []

for line in lines:
    parts = line.split(' ')
    labels_test.append(int(parts[0]))
    feats = {}
    for part in parts[1:]:
        index, value = part.split(':')
        feats[int(index)] = float(value)
    features_test.append(feats)


# In[8]:


# 1. 创建词汇表
vocab = {}
for feat_dict in features_test:
    vocab.update(feat_dict)

# 创建特征索引到新的连续索引的映射
feature_idx = {feat: idx for idx, feat in enumerate(sorted(vocab.keys()))}

# 2. 创建特征向量
max_features = len(vocab)
feature_vectors = []
for feat_dict in features_test:
    # 初始化特征向量
    vector = [0.0] * max_features
    
    # 填充特征向量
    for feat_idx, feat_value in feat_dict.items():
        vector[feature_idx[feat_idx]] = feat_value
    
    feature_vectors.append(vector)

# 3. 转换为张量
features_tensor = torch.tensor(feature_vectors, dtype=torch.float32)

# 检查张量形状
print(features_tensor.shape)


# In[9]:


from sklearn.decomposition import PCA
import torch

# features_tensor 是特征张量,大小为 torch.Size([25000, 89527])
# 这里将其转换为 NumPy 数组
features_np = features_tensor.numpy()

# 初始化PCA,选择需要降维的维度,这里假设降到100维
pca = PCA(n_components=20)

# 用PCA拟合数据
features_reduced = pca.fit_transform(features_np)

# 将降维后的数据转换回张量形式
features_reduced_tensor = torch.tensor(features_reduced)

# 打印降维后的数据大小
print(features_reduced_tensor.size())


# In[14]:


from torch.utils.data import DataLoader, TensorDataset

labels_tensor = torch.tensor(labels_test, dtype=torch.float32)
features_reduced = features_reduced_tensor.unsqueeze(1) 
labels_t = labels_tensor.unsqueeze(1) 

train_data = TensorDataset(features_reduced, labels_t)
train_loader = DataLoader(train_data, batch_size=2, shuffle=True)

losses = []

for epoch in range(num_epochs):
    for i, (inputs, targets) in enumerate(train_loader):
        inputs, targets = inputs.to(device), targets.to(device)
        outputs = model(inputs)
        loss = criterion(outputs.squeeze(), targets.squeeze())
        losses.append(loss.item()/len(train_loader))
        if (i+1) % 2 == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item()/len(train_loader)}')


# In[15]:


plt.plot(losses, label='Training Loss')
plt.xlabel('Training Steps')
plt.ylabel('Loss')
plt.title('Training Loss over Steps')
plt.legend()
plt.show()

本文由博客一文多发平台 OpenWrite 发布!

标签:情感,features,torch,神经网络,pytorch,import,size,feat,tensor
From: https://www.cnblogs.com/humanplug/p/17918708.html

相关文章

  • 神经网络优化篇:详解dropout 正则化(Dropout Regularization)
    dropout正则化除了\(L2\)正则化,还有一个非常实用的正则化方法——“Dropout(随机失活)”。假设在训练上图这样的神经网络,它存在过拟合,这就是dropout所要处理的,复制这个神经网络,dropout会遍历网络的每一层,并设置消除神经网络中节点的概率。假设网络中的每一层,每个节点都以抛硬币......
  • BP神经网络思想及其Python实现
    神经网络是一种模拟人类大脑工作方式的计算模型。它由神经元组成,这些神经元相互连接形成网络。每个连接都有一个权重,而神经元则通过激活函数处理输入并生成输出。神经网络可以分为输入层、隐藏层和输出层。在训练过程中,神经网络通过调整权重来学习模式和特征,使其能够进行预测或分......
  • 用深度递归神经网络检测甲基化DNA结合的转录因子
    DetectionoftranscriptionfactorsbindingtomethylatedDNAbydeeprecurrentneuralnetwork关键词:deeprecurrentneuralnetwork;methylatedDNA;transcriptionfactors;tripeptide;tripeptidewordvector作者:HongfeiLi,YueGong,YifengLiu,HaoLin,Guoh......
  • P2 什么是神经网络
    深度学习指的是训练神经网络,有时候规模很大那么神经网络到底是什么???比方说我们现在有这么一张图 这张图叫:  HousingPricePrediction 我们有的数据是六个房子的面积和每平米的单价。我们现在知道了logestic回归模型,我们将数据输入这个模型,会拟合出一条穿过这些数据的......
  • 【Pytorch基础实战】第二节,卷积神经网络
    项目地址https://gitee.com/wxzcch/pytorchbase/tree/master/leason_2源码importtorchfromtorchimportnn,optimfromtorch.autogradimportVariablefromtorch.utils.dataimportDataLoaderfromtorchvisionimportdatasets,transforms#定义一些超参数batch_......
  • 神经网络优化篇:为什么正则化有利于预防过拟合呢?(Why regularization reduces overfitti
    为什么正则化有利于预防过拟合呢?通过两个例子来直观体会一下。左图是高偏差,右图是高方差,中间是JustRight。现在来看下这个庞大的深度拟合神经网络。知道这张图不够大,深度也不够,但可以想象这是一个过拟合的神经网络。这是的代价函数\(J\),含有参数\(W\),\(b\)。添加正则项,它可......
  • matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类|附代码数据
    全文下载链接:http://tecdat.cn/?p=19751本示例说明如何使用长短期记忆(LSTM)网络对序列数据进行分类。最近我们被客户要求撰写关于LSTM的研究报告,包括一些图形和统计输出。要训练深度神经网络对序列数据进行分类,可以使用LSTM网络。LSTM网络使您可以将序列数据输入网络,并根据序列......
  • 经典卷积神经网络LeNet&AlexNet&VGG
    LeNetLeNet-5是一种经典的卷积神经网络结构,于1998年投入实际使用中。该网络最早应用于手写体字符识别应用中。普遍认为,卷积神经网络的出现开始于LeCun等提出的LeNet网络,可以说LeCun等是CNN的缔造者,而LeNet则是LeCun等创造的CNN经典之作网络结构图由下图所示: LeNet网络总共有......
  • 神经网络优化篇:详解正则化(Regularization)
    正则化深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少的网络误差。如果怀疑神经网络过度拟合了数据,即存在高......
  • pytorch——豆瓣读书评价分析
    任务目标基于给定数据集,采用三层bp神经网络方法,编写程序并构建分类模型,通过给定特征实现预测的书籍评分的模型。选取数据在各项指标中,我认为书籍的评分和出版社、评论数量还有作者相关,和其他属性的关系并大。所以,对于出版社,我选取了出版社的平均评分和出版社在这个表格中出现......