{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torchvision import datasets,transforms\nimport torch.utils.data as Data\nfrom torch.utils.data import DataLoader,Dataset\nimport torchvision\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np\nbatch_size=200\nlr=0.001\nepochs=5\ntrain_data=pd.read_csv(\"/kaggle/input/Kannada-MNIST/train.csv\")\ntest_data=pd.read_csv(\"/kaggle/input/Kannada-MNIST/test.csv\")\nimg_label=train_data[\"label\"].values.astype(np.int64)\nimg_train=train_data.drop([\"label\"],axis=1).values.astype(np.float32)\nimg_test=test_data.drop([\"id\"],axis=1).values.astype(np.float32)\ntrain_dataset=Data.TensorDataset(torch.tensor(img_train),torch.tensor(img_label))\ntest_dataset=Data.TensorDataset(torch.tensor(img_test))\ntrain_loader=Data.DataLoader(dataset=train_dataset,\n                       batch_size=batch_size,\n                      shuffle=True,\n                      num_workers=2)\ntest_loader=Data.DataLoader(dataset=test_dataset,\n                       batch_size=batch_size,\n                      shuffle=False,\n                      num_workers=2)\nclass Net(torch.nn.Module):\n    def __init__(self):\n        super(Net,self).__init__()\n        self.flatten=nn.Flatten()  # 对指定维度展平，输入维度为（batch,28,28）\n        self.hidden=torch.nn.Linear(784,256) # 隐藏层\n        self.out=torch.nn.Linear(256,10) #输出层\n    def forward(self,x):\n        x=self.flatten(x)  # 将1到-1维展平\n        x=self.hidden(x)\n        x=F.relu(x)\n        x=self.out(x)\n        return x\nnet=Net()\noptimizer=torch.optim.Adam(net.parameters(),lr=0.0003) #优化器\nloss_func=torch.nn.CrossEntropyLoss()  # 交叉熵损失\nfor epoch in range(epochs):\n    for batch_idx,(data,target) in enumerate(train_loader):\n        cal_data=net(data)\n        loss=loss_func(cal_data,target)\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        #每隔200*batchsize(200)=40k打印输出结果\n        if batch_idx%200==0:\n            print(' 训练: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'\n                  .format(epoch, batch_idx * len(data), \n                  len(train_loader.dataset),100.* batch_idx / len(train_loader), \n                 loss.item()))\n    # 计算训练集上误差率\n    train_loss=0\n    correct=0\n    for data,target in train_loader:\n        logits=net(data)\n        train_loss+=loss_func(logits,target).item()\n        # 取出预测最大值的索引，作为预测输出\n        pred=logits.data.argmax(dim=1)\n        # 统计预测正确的个数\n        #torch.eq可对两个张量进行逐元素比较,比较结果相加则为一个batch_size中正确的个数\n        correct+=pred.eq(target.data).sum()\n    train_loss/=len(train_loader.dataset)  # 每个样本的loss都算入了loss，因此除总样本量\n    print('\\n 测试: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(\n     train_loss, correct, len(train_loader.dataset),\n     100. * correct / len(train_loader.dataset)))\npreds=np.zeros((0,1))\nfor data in test_loader:\n    batch_pred=net(data[0]).data.argmax(dim=1).reshape(200,1)\n    batch_pred=batch_pred.numpy()\n    preds=np.concatenate([preds,batch_pred],axis=0)\nsubmission=pd.read_csv(\"/kaggle/input/Kannada-MNIST/sample_submission.csv\")\nsubmission[\"label\"]=preds\nsubmission.to_csv(\"/kaggle/working/sample_submission.csv\",index=False)","metadata":{},"execution_count":null,"outputs":[]}]}