好的,下面是一个使用Python和PyTorch库来实现Bi-LSTM网络进行训练和测试的示例代码。该代码会读取CSV文件,训练Bi-LSTM模型,并计算F1值和绘制混淆矩阵。
首先,确保你已经安装了必要的库:
```bash
pip install pandas torch scikit-learn matplotlib
```
然后,使用以下代码:
```python
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, confusion_matrix
import matplotlib.pyplot as plt
import numpy as np
# 读取CSV文件
data = pd.read_csv('your_file.csv')
# 假设第一列是text,第二列是label
texts = data.iloc[:, 0].values
labels = data.iloc[:, 1].values
# 文本向量化(这里使用简单的词袋模型)
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(texts).toarray()
# 将标签转换为Tensor
y = torch.tensor(labels, dtype=torch.float32)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 将数据转换为Tensor
X_train = torch.tensor(X_train, dtype=torch.float32)
X_test = torch.tensor(X_test, dtype=torch.float32)
# 定义Bi-LSTM模型
class BiLSTM(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(BiLSTM, self).__init__()
self.hidden_dim = hidden_dim
self.lstm = nn.LSTM(input_dim, hidden_dim, bidirectional=True, batch_first=True)
self.fc = nn.Linear(hidden_dim * 2, output_dim)
def forward(self, x):
h0 = torch.zeros(2, x.size(0), self.hidden_dim).to(x.device) # 2 for bidirection
c0 = torch.zeros(2, x.size(0), self.hidden_dim).to(x.device)
out, _ = self.lstm(x.unsqueeze(1), (h0, c0))
out = self.fc(out[:, -1, :])
return out
# 初始化模型、损失函数和优化器
input_dim = X_train.shape[1]
hidden_dim = 64
output_dim = 1
model = BiLSTM(input_dim, hidden_dim, output_dim)
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
outputs = model(X_train)
loss = criterion(outputs.squeeze(), y_train)
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 测试模型
model.eval()
with torch.no_grad():
y_pred = model(X_test)
y_pred = torch.sigmoid(y_pred)
y_pred = (y_pred > 0.5).float().squeeze()
# 计算F1值
f1 = f1_score(y_test, y_pred)
print(f'F1 Score: {f1:.4f}')
# 绘制混淆矩阵
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(10, 7))
plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
plt.title('Confusion Matrix')
plt.colorbar()
tick_marks = np.arange(2)
plt.xticks(tick_marks, ['0', '1'], rotation=45)
plt.yticks(tick_marks, ['0', '1'])
thresh = cm.max() / 2.
for i, j in np.ndindex(cm.shape):
plt.text(j, i, cm[i, j],
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.show()
```