import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torchvision.transforms import ToTensor import numpy as np

定义CNN模型

class CNN(nn.Module): def init(self): super(CNN, self).init() self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1) self.relu = nn.ReLU(inplace=True) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1) self.fc = nn.Linear(3288, 128)

def forward(self, x):
    x = x.view(-1, 1, 8, 8)  # 转换为图片格式,1表示通道数
    x = self.conv1(x)
    x = self.relu(x)
    x = self.pool(x)
    x = self.conv2(x)
    x = self.relu(x)
    x = self.pool(x)
    x = x.view(x.size(0), -1)
    x = self.fc(x)
    return x

定义BiGRU模型

class BiGRU(nn.Module): def init(self): super(BiGRU, self).init() self.gru = nn.GRU(input_size=23, hidden_size=64, num_layers=2, batch_first=True, bidirectional=True)

def forward(self, x):
    x, _ = self.gru(x)
    return x[:, -1, :]

定义特征融合模型

class FusionModel(nn.Module): def init(self): super(FusionModel, self).init() self.cnn_model = CNN() self.gru_model = BiGRU() self.fc1 = nn.Linear(128+128, 64) self.fc2 = nn.Linear(64, 8)

def forward(self, x_img, x_gru):
    x_img = self.cnn_model(x_img)
    x_gru = self.gru_model(x_gru)
    x = torch.cat((x_img, x_gru), dim=1)
    x = self.fc1(x)
    x = self.fc2(x)
    return x

定义数据集类

class MyDataset(Dataset): def init(self, txt_path, transform=None): self.data = np.loadtxt(txt_path, delimiter=',') # 读取数据 self.transform = transform

def __getitem__(self, index):
    features = self.data[index, :-1]  # 获取特征值
    label = self.data[index, -1]  # 获取标签
    if self.transform:
        features = self.transform(features)
    return features, label

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

定义转换函数

def transform(features): return torch.tensor(features, dtype=torch.float32)

定义训练函数

def train(model, train_loader, optimizer, criterion): model.train() running_loss = 0.0 for features, labels in train_loader: optimizer.zero_grad() output = model(features[0], features[1]) loss = criterion(output, labels) loss.backward() optimizer.step() running_loss += loss.item() return running_loss / len(train_loader)

定义验证函数

def validate(model, val_loader, criterion): model.eval() running_loss = 0.0 correct = 0 total = 0 with torch.no_grad(): for features, labels in val_loader: output = model(features[0], features[1]) loss = criterion(output, labels) running_loss += loss.item() _, predicted = torch.max(output.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() val_loss = running_loss / len(val_loader) val_acc = correct / total return val_loss, val_acc

定义测试函数

def test(model, test_loader): model.eval() correct = 0 total = 0 with torch.no_grad(): for features, labels in test_loader: output = model(features[0], features[1]) _, predicted = torch.max(output.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() test_acc = correct / total return test_acc

设置随机种子

seed = 1234 torch.manual_seed(seed) torch.cuda.manual_seed(seed) np.random.seed(seed)

设置参数

batch_size = 32 learning_rate = 0.001 num_epochs = 10

加载数据集

train_dataset = MyDataset('训练集.txt', transform=transform) val_dataset = MyDataset('验证集.txt', transform=transform) test_dataset = MyDataset('测试集.txt', transform=transform)

创建数据加载器

train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

创建模型和优化器

model = FusionModel() optimizer = optim.Adam(model.parameters(), lr=learning_rate) criterion = nn.CrossEntropyLoss()

训练模型

best_val_acc = 0.0 for epoch in range(num_epochs): train_loss = train(model, train_loader, optimizer, criterion) val_loss, val_acc = validate(model, val_loader, criterion) if val_acc > best_val_acc: best_val_acc = val_acc torch.save(model.state_dict(), 'best_model.pt') print(f'Epoch [{epoch+1}/{num_epochs}], Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f}, Val Acc: {val_acc:.4f}')

加载最佳模型并进行测试

model.load_state_dict(torch.load('best_model.pt')) test_acc = test(model, test_loader) print(f'Test Accuracy: {test_acc:.4f}')

7718323310103103100252100278210086668563842773412547718323310103103100252190802010210086498008728027311007018309031030025123908020100101010071、在训练集、验证集和测试集三个txt文件夹中有如上格式的数据集每条样本前23位为特征值最后一位为分类标签标签共有8个

原文地址: http://www.cveoy.top/t/topic/i8G3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录