{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":16017,"databundleVersionId":708189,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:00:48.323208Z","iopub.execute_input":"2025-09-08T13:00:48.323467Z","iopub.status.idle":"2025-09-08T13:00:48.329105Z","shell.execute_reply.started":"2025-09-08T13:00:48.323448Z","shell.execute_reply":"2025-09-08T13:00:48.328532Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom torch import nn\nimport pandas as pd\n%matplotlib inline\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom torch.utils.data import Dataset,DataLoader\nimport torchvision\nfrom torchvision.transforms import v2\nimport os","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:09.987641Z","iopub.execute_input":"2025-09-08T13:16:09.987894Z","iopub.status.idle":"2025-09-08T13:16:09.993369Z","shell.execute_reply.started":"2025-09-08T13:16:09.987878Z","shell.execute_reply":"2025-09-08T13:16:09.992675Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dir=\"/kaggle/input/Kannada-MNIST\"\noriginal_train=pd.read_csv(os.path.join(dir,\"train.csv\"))\noriginal_test=pd.read_csv(os.path.join(dir,\"test.csv\"))\nall_data=pd.concat((original_train.iloc[:,1:],original_test.iloc[:,1:]),axis=0)\nall_data=all_data.values.astype(np.float32).reshape(-1,1,28,28)\n\ntrain=original_train.shape[0]\ndata_train=all_data[:train]\ndata_test=all_data[train:]\ndata_target=original_train.iloc[:,0].values.astype(np.int64)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:10.168789Z","iopub.execute_input":"2025-09-08T13:16:10.168979Z","iopub.status.idle":"2025-09-08T13:16:12.635724Z","shell.execute_reply.started":"2025-09-08T13:16:10.168965Z","shell.execute_reply":"2025-09-08T13:16:12.635191Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 处理数据\ntransforms_train=v2.Compose([\n    v2.Resize(40),\n    v2.RandomResizedCrop(28,scale=(0.8,1.1),ratio=(1,1)),\n    v2.RandomAffine(degrees=15,translate=(0.1,0.1),scale=(0.9,1.1),shear=10),]\n)\nclass dataset(Dataset):\n    def __init__(self,x,y=None,transform=None):\n        self.x=x\n        self.y=y\n        self.transform=transform\n\n    def __len__(self):\n        return len(self.x)\n\n    def __getitem__(self,idx):\n        x  , y=self.x[idx],self.y[idx] if self.y is not None else None\n        if self.transform is not None:\n            x=self.transform(x)\n        return x , y","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:12.636998Z","iopub.execute_input":"2025-09-08T13:16:12.637360Z","iopub.status.idle":"2025-09-08T13:16:12.643401Z","shell.execute_reply.started":"2025-09-08T13:16:12.637335Z","shell.execute_reply":"2025-09-08T13:16:12.642638Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 显示 10张图像\ndef display (data,target):\n    _,axes=plt.subplots(nrows=2,ncols=5,figsize=(8,6))\n    for i in range(2):\n        for j in range(5):\n            axes[i,j].imshow(data[i*5+j].squeeze(0),cmap=\"viridis\")\n            axes[i,j].set_title(f\"Num_{target[i*5+j]}\")\n    plt.tight_layout()\ndisplay(data_train,data_target)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:12.644101Z","iopub.execute_input":"2025-09-08T13:16:12.644367Z","iopub.status.idle":"2025-09-08T13:16:13.732058Z","shell.execute_reply.started":"2025-09-08T13:16:12.644344Z","shell.execute_reply":"2025-09-08T13:16:13.731241Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 基本参数设置\nbatch_size=64\nepochs=10\nnum_classes=10\ndevice=\"cuda\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:13.733541Z","iopub.execute_input":"2025-09-08T13:16:13.733773Z","iopub.status.idle":"2025-09-08T13:16:13.737497Z","shell.execute_reply.started":"2025-09-08T13:16:13.733756Z","shell.execute_reply":"2025-09-08T13:16:13.736833Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 划分数据集\nfrom sklearn.model_selection import train_test_split\n\ndata_train=torch.tensor(data_train,device=device,dtype=torch.float32)\ndata_target=torch.tensor(data_target,device=device,dtype=torch.int64)\ndata_test=torch.tensor(data_test,device=device,dtype=torch.float32)\nx_train,x_val,y_train,y_val=train_test_split(data_train,data_target)\nx_train.shape,x_val.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:13.738184Z","iopub.execute_input":"2025-09-08T13:16:13.738367Z","iopub.status.idle":"2025-09-08T13:16:13.945275Z","shell.execute_reply.started":"2025-09-08T13:16:13.738353Z","shell.execute_reply":"2025-09-08T13:16:13.944546Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_iter=DataLoader(dataset(x_train,y_train,transform=transforms_train),batch_size,shuffle=True)\nval_iter=DataLoader(dataset(x_val,y_val),batch_size,shuffle=False)\ntest_iter=DataLoader(dataset(data_test),batch_size,shuffle=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:13.946398Z","iopub.execute_input":"2025-09-08T13:16:13.946641Z","iopub.status.idle":"2025-09-08T13:16:13.951120Z","shell.execute_reply.started":"2025-09-08T13:16:13.946596Z","shell.execute_reply":"2025-09-08T13:16:13.950475Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 定义模型\n\nmodel=nn.Sequential(\n    nn.Conv2d(1,16,3,padding=1),\n    nn.Conv2d(16,32,3,padding=1),\n    nn.BatchNorm2d(32),\n    nn.ReLU(),\n    nn.AvgPool2d((4,4)),\n\n    nn.Flatten(),\n    nn.Linear(7*7*32,128),\n    nn.ReLU(),\n    nn.Dropout(0.2),\n    \n    nn.Linear(128,32),\n    nn.ReLU(),\n    nn.Linear(32,16),\n    nn.ReLU(),\n    nn.Dropout(0.4),\n\n    nn.Linear(16,num_classes)\n)\n\ndef init_weight(m):\n    if isinstance(m,nn.Linear):\n        nn.init.xavier_uniform_(m.weight)\n        nn.init.zeros_(m.bias)\n    elif isinstance(m,nn.Conv2d):\n        nn.init.kaiming_normal_(m.weight)\n        nn.init.zeros_(m.bias)\n    elif isinstance(m,nn.BatchNorm2d):\n        nn.init.constant_(m.weight,1)\n        nn.init.constant_(m.bias,0)\n        \nmodel.apply(init_weight)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:14.048782Z","iopub.execute_input":"2025-09-08T13:16:14.049430Z","iopub.status.idle":"2025-09-08T13:16:14.062031Z","shell.execute_reply.started":"2025-09-08T13:16:14.049407Z","shell.execute_reply":"2025-09-08T13:16:14.061265Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"optim=torch.optim.Adam(model.parameters(),lr=1e-3,weight_decay=1e-4)\nscheduler=torch.optim.lr_scheduler.ReduceLROnPlateau(optim,mode=\"min\",factor=0.5,patience=1)\nloss=nn.CrossEntropyLoss()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:14.278524Z","iopub.execute_input":"2025-09-08T13:16:14.279035Z","iopub.status.idle":"2025-09-08T13:16:14.283363Z","shell.execute_reply.started":"2025-09-08T13:16:14.279012Z","shell.execute_reply":"2025-09-08T13:16:14.282664Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def accuracy(net,data_iter):\n    net.eval()\n    with torch.no_grad():\n        accurate=all_num=0\n        for x,y in data_iter:\n            x,y=x.to(device),y.to(device)\n            pred=net(x).argmax(dim=1)\n            accurate+=(pred==y).sum().item()\n            all_num+=len(y)\n    net.train()\n    return accurate/all_num","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:32:30.827791Z","iopub.execute_input":"2025-09-08T13:32:30.828029Z","iopub.status.idle":"2025-09-08T13:32:30.832461Z","shell.execute_reply.started":"2025-09-08T13:32:30.828014Z","shell.execute_reply":"2025-09-08T13:32:30.831879Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def compute_loss(net,data_iter):\n    net.eval()\n    with torch.no_grad():\n        l=all_num=0\n        for x,y in data_iter:\n            x,y=x.to(device),y.to(device)\n            l_epoch=loss(net(x),y)\n            l+=l_epoch.item()*len(y)\n            all_num+=len(y)\n    net.train()\n    return l/all_num","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:16.692385Z","iopub.execute_input":"2025-09-08T13:16:16.692576Z","iopub.status.idle":"2025-09-08T13:16:16.696604Z","shell.execute_reply.started":"2025-09-08T13:16:16.692562Z","shell.execute_reply":"2025-09-08T13:16:16.696073Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 开始训练\nfrom sklearn.metrics import accuracy_score\nmodel.train()\nmodel.to(device)\ntrain_loss_record=[]\nval_loss_record=[]\ntrain_acc=[]\n\nfor epoch in range(epochs):\n    l_epoch=0\n    train_num=0\n    for x,y in train_iter:\n        x,y=x.to(device),y.to(device)\n        optim.zero_grad()\n        pred=model(x)\n        l=loss(pred,y)\n        l.backward()\n        l_epoch+=l.item()*len(y)\n        train_num+=len(y)\n        optim.step()\n\n    l_epoch/=train_num\n    train_epoch_acc=accuracy(model,train_iter)\n    val_loss=compute_loss(model,val_iter)\n    scheduler.step(val_loss)\n    \n    train_loss_record.append(l_epoch)\n    val_loss_record.append(val_loss)\n    train_acc.append(train_epoch_acc)\n    \n    print(f\"<{epoch+1}>  正在训练\")\n    print(f\"<训练损失>：{l_epoch}\")\n    print(f\"<验证损失>：{val_loss}\")\n    print(f\"<训练精度>：{train_epoch_acc}\")\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:16:18.384034Z","iopub.execute_input":"2025-09-08T13:16:18.384315Z","iopub.status.idle":"2025-09-08T13:28:56.316453Z","shell.execute_reply.started":"2025-09-08T13:16:18.384292Z","shell.execute_reply":"2025-09-08T13:28:56.315647Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample=pd.read_csv(os.path.join(dir,\"Dig-MNIST.csv\")) \nsample_train=sample.iloc[:,1:].values.astype(np.float32)\nsample_label=sample.iloc[:,0].values.astype(np.int64) \n\nsample_train=torch.tensor(sample_train,dtype=torch.float32).reshape(-1,1,28,28)\nsample_label=torch.tensor(sample_label,dtype=torch.long)\nsample_iter=DataLoader(dataset(sample_train,sample_label),batch_size,shuffle=False)\naccuracy(model,sample_iter)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:33:22.287152Z","iopub.execute_input":"2025-09-08T13:33:22.287394Z","iopub.status.idle":"2025-09-08T13:33:22.926542Z","shell.execute_reply.started":"2025-09-08T13:33:22.287378Z","shell.execute_reply":"2025-09-08T13:33:22.925978Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 开始预测\nfrom torch.utils.data import TensorDataset\nmodel.eval()\nwith torch.no_grad():\n    temp=[]\n    for x in DataLoader(TensorDataset(data_test.reshape(-1,1,28,28)),batch_size,shuffle=False):\n        pred=model(x[0])\n        pred=pred.argmax(dim=1)\n        temp.append(pred.cpu().numpy())\n    temp=np.concatenate(temp,axis=0)\n    sub_=pd.read_csv(os.path.join(dir,\"sample_submission.csv\"))\n    sub_[\"label\"]=temp\n    sub_.to_csv(\"/kaggle/working/submission.csv\",index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T13:44:32.902603Z","iopub.execute_input":"2025-09-08T13:44:32.903292Z","iopub.status.idle":"2025-09-08T13:44:32.989084Z","shell.execute_reply.started":"2025-09-08T13:44:32.903270Z","shell.execute_reply":"2025-09-08T13:44:32.988561Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# os.remove(os.path.join(dir,\"/kaggle/working/submission1.csv\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-08T14:03:04.778973Z","iopub.execute_input":"2025-09-08T14:03:04.779707Z","iopub.status.idle":"2025-09-08T14:03:04.783375Z","shell.execute_reply.started":"2025-09-08T14:03:04.779682Z","shell.execute_reply":"2025-09-08T14:03:04.782654Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}