GRU 分类模型在数据集上的应用
import\u0020torch\nimport\u0020torch.nn\u0020as\u0020nn\nimport\u0020torch.optim\u0020as\u0020optim\nfrom\u0020torch.utils.data\u0020import\u0020Dataset, DataLoader\nfrom\u0020sklearn.model_selection\u0020import\u0020train_test_split\n\n#\u0020自定义数据集类\nclass\u0020MyDataset(Dataset):\n\u0020\u0020def\u0020__init__(self, data):\n\u0020\u0020\u0020\u0020self.data\u0020=\u0020data\n\u0020\u0020\n\u0020\u0020def\u0020__len__(self):\n\u0020\u0020\u0020\u0020return\u0020len(self.data)\n\u0020\u0020\n\u0020\u0020def\u0020__getitem__(self, idx):\n\u0020\u0020\u0020\u0020sample\u0020=\u0020self.data[idx]\n\u0020\u0020\u0020\u0020x\u0020=\u0020torch.FloatTensor(sample[:-1])\n\u0020\u0020\u0020\u0020y\u0020=\u0020torch.LongTensor([sample[-1]])\n\u0020\u0020\u0020\u0020return\u0020x, y\n\n#\u0020定义GRU分类模型\nclass\u0020GRUClassifier(nn.Module):\n\u0020\u0020def\u0020__init__(self, input_size, hidden_size, num_classes):\n\u0020\u0020\u0020\u0020super(GRUClassifier, self).init()\n\u0020\u0020\u0020\u0020self.hidden_size\u0020=\u0020hidden_size\n\u0020\u0020\u0020\u0020self.gru\u0020=\u0020nn.GRU(input_size, hidden_size, batch_first=True)\n\u0020\u0020\u0020\u0020self.fc\u0020=\u0020nn.Linear(hidden_size, num_classes)\n\u0020\u0020\n\u0020\u0020def\u0020forward(self, x):\n\u0020\u0020\u0020\u0020output, \u0020=\u0020self.gru(x)\n\u0020\u0020\u0020\u0020output\u0020=\u0020output[:, -1, :]\n\u0020\u0020\u0020\u0020output\u0020=\u0020self.fc(output)\n\u0020\u0020\u0020\u0020return\u0020output\n\n#\u0020准备数据\ndata\u0020=\u0020[]\nwith\u0020open('data.txt', 'r')\u0020as\u0020f:\n\u0020\u0020for\u0020line\u0020in\u0020f:\n\u0020\u0020\u0020\u0020sample\u0020=\u0020list(map(float, line.strip().split(',')))\n\u0020\u0020\u0020\u0020data.append(sample)\n\u0020\u0020\n\ntrain_data, test_data\u0020=\u0020train_test_split(data, test_size=0.2, random_state=42)\ntrain_data, val_data\u0020=\u0020train_test_split(train_data, test_size=0.2, random_state=42)\n\ntrain_dataset\u0020=\u0020MyDataset(train_data)\nval_dataset\u0020=\u0020MyDataset(val_data)\ntest_dataset\u0020=\u0020MyDataset(test_data)\n\ntrain_loader\u0020=\u0020DataLoader(train_dataset, batch_size=32, shuffle=True)\nval_loader\u0020=\u0020DataLoader(val_dataset, batch_size=32, shuffle=False)\ntest_loader\u0020=\u0020DataLoader(test_dataset, batch_size=32, shuffle=False)\n\n#\u0020定义模型参数和优化器\ninput_size\u0020=\u0020len(data[0]) - 1\nhidden_size\u0020=\u0020128\nnum_classes\u0020=\u00208\n\nmodel\u0020=\u0020GRUClassifier(input_size, hidden_size, num_classes)\ncriterion\u0020=\u0020nn.CrossEntropyLoss()\noptimizer\u0020=\u0020optim.Adam(model.parameters(), lr=0.001)\n\n#\u0020训练模型\ndevice\u0020=\u0020torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel.to(device)\nbest_val_acc\u0020=\u00200.0\n\nfor\u0020epoch\u0020in\u0020range(10):\n\u0020\u0020model.train()\n\u0020\u0020train_correct\u0020=\u00200\n\u0020\u0020train_total\u0020=\u00200\n\u0020\u0020\n\u0020\u0020for\u0020inputs, labels\u0020in\u0020train_loader:\n\u0020\u0020\u0020\u0020inputs\u0020=\u0020inputs.to(device)\n\u0020\u0020\u0020\u0020labels\u0020=\u0020labels.squeeze().to(device)\n\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020optimizer.zero_grad()\n\u0020\u0020\u0020\u0020outputs\u0020=\u0020model(inputs)\n\u0020\u0020\u0020\u0020, predicted\u0020=\u0020torch.max(outputs.data, 1)\n\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020loss\u0020=\u0020criterion(outputs, labels)\n\u0020\u0020\u0020\u0020loss.backward()\n\u0020\u0020\u0020\u0020optimizer.step()\n\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020train_total\u0020+=\u0020labels.size(0)\n\u0020\u0020\u0020\u0020train_correct\u0020+=\u0020(predicted\u0020==\u0020labels).sum().item()\n\u0020\u0020\n\u0020\u0020train_acc\u0020=\u0020train_correct\u0020/\u0020train_total\n\u0020\u0020\n\u0020\u0020model.eval()\n\u0020\u0020val_correct\u0020=\u00200\n\u0020\u0020val_total\u0020=\u00200\n\u0020\u0020\n\u0020\u0020with\u0020torch.no_grad():\n\u0020\u0020\u0020\u0020for\u0020inputs, labels\u0020in\u0020val_loader:\n\u0020\u0020\u0020\u0020\u0020\u0020inputs\u0020=\u0020inputs.to(device)\n\u0020\u0020\u0020\u0020\u0020\u0020labels\u0020=\u0020labels.squeeze().to(device)\n\u0020\u0020\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020\u0020\u0020outputs\u0020=\u0020model(inputs)\n\u0020\u0020\u0020\u0020\u0020\u0020_, predicted\u0020=\u0020torch.max(outputs.data, 1)\n\u0020\u0020\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020\u0020\u0020val_total\u0020+=\u0020labels.size(0)\n\u0020\u0020\u0020\u0020\u0020\u0020val_correct\u0020+=\u0020(predicted\u0020==\u0020labels).sum().item()\n\u0020\u0020\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020\u0020\u0020val_acc\u0020=\u0020val_correct\u0020/\u0020val_total\n\u0020\u0020\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020\u0020\u0020if\u0020val_acc\u0020>\u0020best_val_acc:\n\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020best_val_acc\u0020=\u0020val_acc\n\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020torch.save(model.state_dict(), 'best_model.pt')\n\u0020\u0020\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020print('Epoch [{}/{}], Train Acc: {:.2f}, Val Acc: {:.2f}'.format(epoch+1, 10, train_acc, val_acc))\n\n#\u0020在测试集上评估模型\nmodel.load_state_dict(torch.load('best_model.pt'))\nmodel.eval()\n\ntest_correct\u0020=\u00200\ntest_total\u0020=\u00200\n\nwith\u0020torch.no_grad():\n\u0020\u0020for\u0020inputs, labels\u0020in\u0020test_loader:\n\u0020\u0020\u0020\u0020inputs\u0020=\u0020inputs.to(device)\n\u0020\u0020\u0020\u0020labels\u0020=\u0020labels.squeeze().to(device)\n\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020outputs\u0020=\u0020model(inputs)\n\u0020\u0020\u0020\u0020_, predicted\u0020=\u0020torch.max(outputs.data, 1)\n\u0020\u0020\u0020\u0020\n\u0020\u0020\u0020\u0020test_total\u0020+=\u0020labels.size(0)\n\u0020\u0020\u0020\u0020test_correct\u0020+=\u0020(predicted\u0020==\u0020labels).sum().item()\n\u0020\u0020\n\u0020\u0020test_acc\u0020=\u0020test_correct\u0020/\u0020test_total\n\u0020\u0020\n\u0020\u0020print('Test Acc: {:.2f}'.format(test_acc))
原文地址: https://www.cveoy.top/t/topic/pWGc 著作权归作者所有。请勿转载和采集!