鱼C论坛

 找回密码
 立即注册
查看: 827|回复: 6

中文情感分析

[复制链接]
发表于 2023-11-20 16:30:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
救救孩子吧
这是我的测试模型代码,但是告诉我矩阵形状维度不同,我该怎么办,我使用的是pytorch训练模型
import torch
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
import torch.nn as nn

data = pd.read_csv("最终数据集.csv")
X = data.drop("Label", axis=1)  # 特征矩阵,假设label列是标签列,需要从特征矩阵中去除
X_encoded = pd.get_dummies(X, columns=['Tokenized_Text'])  # 对包含字符串的列进行独热编码
input_size = X_encoded.shape[1]
hidden_size = 64
output_size = 3  # 修改为3,对应标签的数量

class MyModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(MyModel, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        return out


# 加载模型
try:
    model = MyModel(input_size, hidden_size, output_size)
    model.load_state_dict(torch.load("my_model.pth", map_location=torch.device('cpu')))

except (FileNotFoundError, KeyError):
    print("无法加载模型,请检查模型文件。")
    exit()

# 获取用户输入的文本
text = input("请输入要进行情感分类的文本:")

# 创建包含用户输入文本的DataFrame
input_data = pd.DataFrame({"text": [text]})

# 使用TF-IDF向量化器将输入文本转换为数字表示形式
vectorizer = TfidfVectorizer()
X_input = vectorizer.fit_transform(input_data["text"]).toarray()

# 将数字表示形式的输入转换为tensor
X_input = torch.tensor(X_input, dtype=torch.float32)

# 使用模型进行预测
with torch.no_grad():
    y_pred = model(X_input)

# 将预测结果转换为标签
predicted_label = torch.argmax(y_pred, dim=1).item()  # 修改为在dim=1维度上找到最大值的索引

# 定义标签映射
label_map = {2: "负面", 0: "中性", 1: "正面"}

# 输出情感分类结果
print("预测结果:", label_map.get(predicted_label, "未知"))

训练模型的代码:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from sklearn.model_selection import train_test_split
import pandas as pd

# 检查是否有可用的GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# 定义数据集类
class MyDataset(Dataset):
    def __init__(self, X, y):
        self.X = torch.tensor(X.values.astype(float), dtype=torch.float).to(device)
        self.y = torch.tensor(y.values.astype(float), dtype=torch.float).to(device)

    def __len__(self):
        return len(self.X)

    def __getitem__(self, idx):
        return self.X[idx], self.y[idx]


# 定义神经网络模型
class MyModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(MyModel, self).__init__()
        self.fc = nn.Sequential(
            nn.Linear(input_size, hidden_size),
            nn.ReLU(),
            nn.Linear(hidden_size, output_size)
        )

    def forward(self, x):
        out = self.fc(x)
        return out


# 读取数据集
data = pd.read_csv("最终数据集.csv")
print(data.columns)

# 假设您的数据集包含特征矩阵X和标签向量y
X = data.drop("Label", axis=1)  # 特征矩阵,假设label列是标签列,需要从特征矩阵中去除
X_encoded = pd.get_dummies(X, columns=['Tokenized_Text'])  # 对包含字符串的列进行独热编码
y = data["Label"]  # 标签向量

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X_encoded, y, test_size=0.3, random_state=42)

# 创建训练集和测试集的数据集对象
train_dataset = MyDataset(X_train, y_train)
test_dataset = MyDataset(X_test, y_test)

# 创建训练集和测试集的数据加载器
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32)

# 定义模型参数
input_size = X_encoded.shape[1]
hidden_size = 64
output_size = 1

# 创建模型对象和优化器对象,并将模型移动到GPU设备上
model = MyModel(input_size, hidden_size, output_size).to(device)
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 定义损失函数
criterion = nn.MSELoss()

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    train_loss = 0.0
    model.train()  # 设置模型为训练模式
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        inputs = inputs.to(device)
        labels = labels.to(device)
        outputs = model(inputs)
        loss = criterion(outputs.squeeze(), labels)
        loss.backward()
        optimizer.step()
        train_loss += loss.item() * inputs.size(0)
    train_loss /= len(train_loader.dataset)

    test_loss = 0.0
    model.eval()  # 设置模型为评估模式
    with torch.no_grad():
        for inputs, labels in test_loader:
            inputs = inputs.to(device)
            labels = labels.to(device)
            outputs = model(inputs)
            loss = criterion(outputs.squeeze(), labels)
            test_loss += loss.item() * inputs.size(0)
        test_loss /= len(test_loader.dataset)

    # 打印训练过程中的损失和测试集上的损失
    print("Epoch [{}/{}], Train Loss: {:.4f}, Test Loss: {:.4f}".format(epoch + 1, num_epochs, train_loss, test_loss))

# 保存训练好的模型参数到文件中
torch.save(model.state_dict(), 'my_model.pth')

报错:
D:\Anaconda3\python.exe D:\pycharm目录\毕设\测试模型.py
请输入要进行情感分类的文本:今天天气真好
Traceback (most recent call last):
  File "D:\pycharm目录\毕设\测试模型.py", line 51, in <module>
    y_pred = model(X_input)
  File "C:\Users\31328\AppData\Roaming\Python\Python39\site-packages\torch\nn\modules\module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "D:\pycharm目录\毕设\测试模型.py", line 21, in forward
    out = self.fc1(x)
  File "C:\Users\31328\AppData\Roaming\Python\Python39\site-packages\torch\nn\modules\module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "C:\Users\31328\AppData\Roaming\Python\Python39\site-packages\torch\nn\modules\linear.py", line 114, in forward
    return F.linear(input, self.weight, self.bias)
RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x1 and 42765x64)

进程已结束,退出代码为 1

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-20 16:30:50 | 显示全部楼层
这个错误是由于输入的维度不匹配导致的。在模型的forward方法中,fc1层的输入维度应该是(input_size, hidden_size),而X_input的维度是(1, 42765),这两个维度不匹配导致了矩阵形状维度不同的错误。要解决这个问题,需要对输入数据进行预处理,使其与模型期望的输入维度匹配。

在这个具体的情况下,可以使用与训练时相同的TF-IDF向量化器对用户输入的文本进行处理,并且需要注意保持训练时的数据预处理步骤一致。然后,将处理后的输入数据转换为tensor,并且确保其维度与模型期望的输入维度匹配。这样就可以避免矩阵形状维度不同的错误。

另外,还需要注意在加载模型时,确保模型处于评估模式(model.eval()),这样可以避免在推理时对模型参数进行更新,提高推理的速度和效率。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-20 16:32:26 | 显示全部楼层
根据你的报错信息,看起来是在模型预测的过程中出现了矩阵形状维度不匹配的问题。报错信息显示了无法进行矩阵乘法运算,因为输入矩阵的形状是(1x1),而模型期望的输入形状是(42765x64)。

这个问题可能是因为模型的输入维度与实际输入数据的维度不匹配导致的。首先,确保你的输入数据经过了和训练时相同的预处理步骤,包括特征提取、向量化等。其次,确认模型的输入层与输入数据的维度相匹配。

在你的代码中,使用了TF-IDF向量化器将输入文本转换为数字表示形式,然后将数字表示形式的输入转换为tensor。但是没有使用训练模型时使用的同一个向量化器。可能导致了训练时和预测时的数据预处理不一致。

建议你在预测之前,使用训练阶段使用的TF-IDF向量化器对输入文本进行处理,然后将处理后的数据转换为tensor,并且确保转换后的数据维度与模型的期望输入维度匹配。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-20 16:34:59 | 显示全部楼层
我必须对输入数据进行与处理吗?我的想法是,输入任意长度的文字,都可以进行分析
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-20 16:36:07 | 显示全部楼层
Mike_python小 发表于 2023-11-20 16:32
根据你的报错信息,看起来是在模型预测的过程中出现了矩阵形状维度不匹配的问题。报错信息显示了无法进行矩 ...


我必须对输入数据进行与处理吗?我的想法是,输入任意长度的文字,都可以进行分析
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-20 16:36:48 | 显示全部楼层
isdkz 发表于 2023-11-20 16:30
这个错误是由于输入的维度不匹配导致的。在模型的forward方法中,fc1层的输入维度应该是(input_size, hidde ...


我必须对输入数据进行与处理吗?我的想法是,输入任意长度的文字,都可以进行分析
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-20 19:07:54 | 显示全部楼层
去stackoverflow问吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 00:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表