{"id":32,"date":"2021-05-05T13:27:17","date_gmt":"2021-05-05T05:27:17","guid":{"rendered":"http:\/\/139.224.63.49\/?p=32"},"modified":"2021-05-05T13:27:17","modified_gmt":"2021-05-05T05:27:17","slug":"lstm%e6%9d%a5%e5%81%9amnist%e7%9a%84%e5%88%86%e7%b1%bb","status":"publish","type":"post","link":"http:\/\/iamnear.top\/?p=32","title":{"rendered":"lstm\u6765\u505amnist\u7684\u5206\u7c7b"},"content":{"rendered":"\n<p>\u4e4b\u524d\u4e00\u76f4\u5bf9recurrent neural network\u4e0d\u4e86\u89e3\uff0c\u6240\u4ee5\u6700\u8fd1\u7814\u7a76pytorch\u7684\u6587\u6863\uff0c\u8bd5\u7740\u81ea\u5df1\u7528rnn\u6765\u505amnist\u7684\u5206\u7c7b\uff0c\u4ee3\u7801\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import matplotlib.pyplot as plt\nimport numpy as np\n\nimport torch\nimport torchvision\nimport torchvision.transforms as transforms\n\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\n\nfrom torch.utils.tensorboard import SummaryWriter\nimport datetime\n\n\n# %%\ntrainset = torchvision.datasets.MNIST('.\/mnist_data',download=True,train=True)\ntestset = torchvision.datasets.MNIST('.\/mnist_data',download=True,train=False)\n\n\n# %%\ndevice = 'cuda:0'\ndef trans(data):\n    ims = &#91;np.array(i&#91;0]) for i in data]\n    ims = np.stack(ims)\n    ims = ims\/255\n    labels = np.array(&#91;i&#91;1] for i in data])\n    ims = torch.from_numpy(ims).float()\n    labels = torch.from_numpy(labels).long()\n    return ims.to(device),labels.to(device)\n\n\n# %%\ntrainloader = torch.utils.data.DataLoader(trainset, batch_size=500,\n                                        shuffle=True,collate_fn=trans)\n\ntestloader = torch.utils.data.DataLoader(testset, batch_size=500,\n                                        shuffle=False,collate_fn=trans)\n\n\n# %%\nclass RNNModel(nn.Module):\n    def __init__(self):\n        super(RNNModel,self).__init__()\n        self.rnn = nn.LSTM(input_size=28,hidden_size=400,num_layers=1,batch_first=True,bidirectional=False)\n        self.linear = nn.Linear(in_features=400,out_features=10)\n    def forward(self,input):\n        #inputshape : N*28*28\n        input = input.permute(0,2,1)\n        o,(h,c) = self.rnn(input)\n        #print('o:',o.shape)\n        #print('h:',h.shape)\n        #print('c:',c.shape)\n        output = torch.flatten(h.permute(1,0,2),1,2)\n        output = self.linear(output)\n        output = F.relu(output)\n        return output\n\n\n# %%\nmodel = RNNModel().to(device)\nfor x,y in trainloader:\n    plt.imshow(x&#91;0].cpu().numpy())\n    o = model(x)\n    print(o.shape)\n    break\n\n\n# %%\nmodel = RNNModel().to(device)\noptimizer = torch.optim.Adam(model.parameters())\ncriterion = torch.nn.CrossEntropyLoss()\nepoch = 30\nwriter = SummaryWriter('.\/runs\/rnn_mnist '+str(datetime.datetime.now()).replace(':','_'))\nfor epoch_idx in range(epoch):\n    for index,(x,y) in enumerate(trainloader):\n        output = model(x)\n        loss = criterion(output,y)\n        model.zero_grad()\n        loss.backward()\n        optimizer.step()\n        writer.add_scalar('train\/loss',loss.item(),epoch_idx*len(trainloader)+index)\n    with torch.no_grad():\n        correct_cnt = 0\n        test_mean_loss = 0\n        for index,(x,y) in enumerate(testloader):\n            output = model(x)\n            loss = criterion(output,y)\n            correct_cnt += torch.sum(torch.argmax(output,dim=1)==y).item()\n            writer.add_scalar('test\/loss',loss.item(),epoch_idx*len(testloader)+index)\n            test_mean_loss += loss.item()\n        writer.add_scalar('test\/loss_per_epoch',test_mean_loss\/len(testloader),epoch_idx)\n        writer.add_scalar('test\/acc',correct_cnt\/len(testloader)\/testloader.batch_size,epoch_idx)\n\n\n# %%<\/code><\/pre>\n\n\n\n<p>\u8dd1\u7684\u65f6\u5019\u7528\u7684\u5c31\u662f\u5982\u4e0a\u7684\u53c2\u6570\uff0c\u76f8\u540c\u7684\u53c2\u6570\u8dd1\u4e86\u56db\u56de\uff0c\u7ed3\u679c\u5982\u4e0b<\/p>\n\n\n\n<p>train loss:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"263\" src=\"http:\/\/139.224.63.49\/wp-content\/uploads\/2021\/05\/train_loss.png\" alt=\"\" class=\"wp-image-34\" srcset=\"http:\/\/iamnear.top\/wp-content\/uploads\/2021\/05\/train_loss.png 400w, http:\/\/iamnear.top\/wp-content\/uploads\/2021\/05\/train_loss-300x197.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure>\n<\/div><\/div>\n\n\n\n<p>test loss:<\/p>\n<\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"263\" src=\"http:\/\/139.224.63.49\/wp-content\/uploads\/2021\/05\/test_loss-1.png\" alt=\"\" class=\"wp-image-35\" srcset=\"http:\/\/iamnear.top\/wp-content\/uploads\/2021\/05\/test_loss-1.png 400w, http:\/\/iamnear.top\/wp-content\/uploads\/2021\/05\/test_loss-1-300x197.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure>\n\n\n\n<p>test loss per epoch:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"263\" src=\"http:\/\/139.224.63.49\/wp-content\/uploads\/2021\/05\/test_loss_per_epoch.png\" alt=\"\" class=\"wp-image-36\" srcset=\"http:\/\/iamnear.top\/wp-content\/uploads\/2021\/05\/test_loss_per_epoch.png 400w, http:\/\/iamnear.top\/wp-content\/uploads\/2021\/05\/test_loss_per_epoch-300x197.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure>\n\n\n\n<p>test acc:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"263\" src=\"http:\/\/139.224.63.49\/wp-content\/uploads\/2021\/05\/test_acc.png\" alt=\"\" class=\"wp-image-37\" srcset=\"http:\/\/iamnear.top\/wp-content\/uploads\/2021\/05\/test_acc.png 400w, http:\/\/iamnear.top\/wp-content\/uploads\/2021\/05\/test_acc-300x197.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure>\n\n\n\n<p>\u540c\u6837\u7684\u53c2\u6570\uff0c\u8fd0\u884c\u56db\u56de\uff0c\u5176\u4e2d\u4e09\u56de\u90fd\u53ef\u4ee5\u8fbe\u523098.5%\u4ee5\u4e0a\u7684\u51c6\u786e\u7387\uff0c\u4f46\u662f\u6709\u4e00\u56de\u51c6\u786e\u7387\u505c\u7559\u5728\u4e8680%\uff0c\u53ef\u80fd\u7ee7\u7eed\u8bad\u7ec3\u66f4\u591a\u4e2aepoch\u80fd\u8ba9\u5b83\u4e5f\u540c\u6837\u523098.5%\u4ee5\u4e0a\u5427\u3002\u540c\u6837\u7684\u53c2\u6570\u548cepoch\u6570\uff0c\u8bad\u7ec3\u7ed3\u679c\u6709\u5dee\u5f02\uff0c\u8bf4\u660e\u8fd8\u662f\u6709\u4e00\u5b9a\u7684\u968f\u673a\u6027\u7684\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e4b\u524d\u4e00\u76f4\u5bf9recurrent neural network\u4e0d\u4e86\u89e3\uff0c\u6240\u4ee5\u6700\u8fd1\u7814\u7a76pytorch\u7684\u6587\u6863\uff0c&hellip; <a href=\"http:\/\/iamnear.top\/?p=32\" class=\"more-link read-more\" rel=\"bookmark\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">lstm\u6765\u505amnist\u7684\u5206\u7c7b<\/span><i class=\"fa fa-arrow-right\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":{"0":"post-32","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"hentry","6":"category-machine-learning","7":"h-entry","9":"h-as-article"},"_links":{"self":[{"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/posts\/32","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/iamnear.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=32"}],"version-history":[{"count":1,"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/posts\/32\/revisions"}],"predecessor-version":[{"id":38,"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/posts\/32\/revisions\/38"}],"wp:attachment":[{"href":"http:\/\/iamnear.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=32"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/iamnear.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=32"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/iamnear.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=32"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}