使用 PyTorch GRU 模型进行八类分类:完整代码示例
import\u0020torch\nimport\u0020torch.nn\u0020as\u0020nn\nfrom\u0020torch.utils.data\u0020import\u0020Dataset,\u0020DataLoader\n\n#\u0020Define\u0020the\u0020model\u0020architecture\nclass\u0020GRUClassifier(nn.Module):\n\u0020\u0020def\u0020__init__(self,\u0020input_size,\u0020hidden_size,\u0020num_classes):\n\u0020\u0020\u0020\u0020super(GRUClassifier,\u0020self).init()\n\u0020\u0020\u0020\u0020self.hidden_size\u0020=\u0020hidden_size\n\u0020\u0020\u0020\u0020self.gru\u0020=\u0020nn.GRU(input_size,\u0020hidden_size,\u0020batch_first=True)\n\u0020\u0020\u0020\u0020self.fc\u0020=\u0020nn.Linear(hidden_size,\u0020num_classes)\n\n\u0020\u0020def\u0020forward(self,\u0020x):\n\u0020\u0020\u0020\u0020h0\u0020=\u0020torch.zeros(1,\u0020x.size(0),\u0020self.hidden_size).to(x.device)\n\u0020\u0020\u0020\u0020out,\u0020_\u0020=\u0020self.gru(x,\u0020h0)\n\u0020\u0020\u0020\u0020out\u0020=\u0020self.fc(out[:,\u0020-1,\u0020:])\u0020#\u0020Take\u0020the\u0020last\u0020hidden\u0020state\n\u0020\u0020\u0020\u0020return\u0020out\n\n#\u0020Define\u0020the\u0020dataset\u0020class\nclass\u0020CustomDataset(Dataset):\n\u0020\u0020def\u0020__init__(self,\u0020data_file):\n\u0020\u0020\u0020\u0020self.data\u0020=\u0020[]\n\u0020\u0020\u0020\u0020with\u0020open(data_file,\u0020'r')\u0020as\u0020file:\n\u0020\u0020\u0020\u0020\u0020\u0020for\u0020line\u0020in\u0020file:\n\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020line\u0020=\u0020line.strip().split(',')\n\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020features\u0020=\u0020[float(x)\u0020for\u0020x\u0020in\u0020line[:-1]]\n\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020label\u0020=\u0020int(line[-1])\n\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020self.data.append((features,\u0020label))\n\n\u0020\u0020def\u0020__getitem__(self,\u0020index):\n\u0020\u0020\u0020\u0020return\u0020torch.tensor(self.data[index][0]),\u0020torch.tensor(self.data[index][1])\n\n\u0020\u0020def\u0020__len__(self):\n\u0020\u0020\u0020\u0020return\u0020len(self.data)\n\n#\u0020Set\u0020hyperparameters\ninput_size\u0020=\u002023\nhidden_size\u0020=\u002064\nnum_classes\u0020=\u00208\nbatch_size\u0020=\u00204\nnum_epochs\u0020=\u002010\n\n#\u0020Create\u0020the\u0020model\nmodel\u0020=\u0020GRUClassifier(input_size,\u0020hidden_size,\u0020num_classes)\n\n#\u0020Define\u0020the\u0020loss\u0020function\u0020and\u0020optimizer\ncriterion\u0020=\u0020nn.CrossEntropyLoss()\noptimizer\u0020=\u0020torch.optim.Adam(model.parameters())\n\n#\u0020Create\u0020the\u0020dataset\u0020and\u0020data\u0020loader\ndataset\u0020=\u0020CustomDataset('data.txt')\ndataloader\u0020=\u0020DataLoader(dataset,\u0020batch_size=batch_size,\u0020shuffle=True)\n\n#\u0020Training\u0020loop\nfor\u0020epoch\u0020in\u0020range(num_epochs):\n\u0020\u0020for\u0020batch_features,\u0020batch_labels\u0020in\u0020dataloader:\n\u0020\u0020\u0020\u0020optimizer.zero_grad()\n\u0020\u0020\u0020\u0020outputs\u0020=\u0020model(batch_features)\n\u0020\u0020\u0020\u0020loss\u0020=\u0020criterion(outputs,\u0020batch_labels)\n\u0020\u0020\u0020\u0020loss.backward()\n\u0020\u0020\u0020\u0020optimizer.step()\n\n\u0020\u0020#\u0020Print\u0020the\u0020loss\u0020for\u0020each\u0020epoch\n\u0020\u0020print(f'Epoch\u0020[{epoch+1}/{num_epochs}],\u0020Loss:\u0020{loss.item()}')\n\n#\u0020Test\u0020the\u0020model\nwith\u0020torch.no_grad():\n\u0020\u0020total_correct\u0020=\u00200\n\u0020\u0020total_samples\u0020=\u00200\n\u0020\u0020for\u0020batch_features,\u0020batch_labels\u0020in\u0020dataloader:\n\u0020\u0020\u0020\u0020outputs\u0020=\u0020model(batch_features)\n\u0020\u0020\u0020\u0020_,\u0020predicted\u0020=\u0020torch.max(outputs.data,\u00201)\n\u0020\u0020\u0020\u0020total_samples\u0020+=\u0020batch_labels.size(0)\n\u0020\u0020\u0020\u0020total_correct\u0020+=\u0020(predicted\u0020==\u0020batch_labels).sum().item()\n\n\u0020\u0020accuracy\u0020=\u0020total_correct\u0020/\u0020total_samples\n\u0020\u0020print(f'Test\u0020Accuracy:\u0020{accuracy}')
原文地址: https://www.cveoy.top/t/topic/pvyc 著作权归作者所有。请勿转载和采集!