{"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":"# 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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-12-13T11:15:42.543134Z","iopub.execute_input":"2022-12-13T11:15:42.544492Z","iopub.status.idle":"2022-12-13T11:15:42.549592Z","shell.execute_reply.started":"2022-12-13T11:15:42.544453Z","shell.execute_reply":"2022-12-13T11:15:42.548666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 导入PyTorch包\nimport torch\nimport numpy as np","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:15:42.895377Z","iopub.execute_input":"2022-12-13T11:15:42.896329Z","iopub.status.idle":"2022-12-13T11:15:44.902320Z","shell.execute_reply.started":"2022-12-13T11:15:42.896293Z","shell.execute_reply":"2022-12-13T11:15:44.900884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:15:44.904237Z","iopub.execute_input":"2022-12-13T11:15:44.904746Z","iopub.status.idle":"2022-12-13T11:15:44.909865Z","shell.execute_reply.started":"2022-12-13T11:15:44.904714Z","shell.execute_reply":"2022-12-13T11:15:44.908532Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 导入库\nimport torch.nn as nn  # 模型搭建\nimport torch.nn.functional as F  # 内部封装了非常多的计算函数\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\ntorch.manual_seed(1)\n","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:15:45.760417Z","iopub.execute_input":"2022-12-13T11:15:45.761288Z","iopub.status.idle":"2022-12-13T11:15:45.779305Z","shell.execute_reply.started":"2022-12-13T11:15:45.761245Z","shell.execute_reply":"2022-12-13T11:15:45.777490Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:15:46.731154Z","iopub.execute_input":"2022-12-13T11:15:46.731657Z","iopub.status.idle":"2022-12-13T11:15:46.737727Z","shell.execute_reply.started":"2022-12-13T11:15:46.731601Z","shell.execute_reply":"2022-12-13T11:15:46.736439Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('../input/Kannada-MNIST/train.csv')\ntest = pd.read_csv('../input/Kannada-MNIST/test.csv')\nsample_submission = pd.read_csv('../input/Kannada-MNIST/sample_submission.csv')\nsample_submission","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:15:47.745820Z","iopub.execute_input":"2022-12-13T11:15:47.746345Z","iopub.status.idle":"2022-12-13T11:15:51.863525Z","shell.execute_reply.started":"2022-12-13T11:15:47.746298Z","shell.execute_reply":"2022-12-13T11:15:51.862118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_label = train['label'].values\ntrain = train.iloc[:, 1:].values\ntest = test.iloc[:, 1:].values\n#test\n#iloc[:, 1:]前闭后开\n# 训练图片60000张\nprint(train.shape)\n# 测试图片5000张\nprint(test.shape)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:15:57.416863Z","iopub.execute_input":"2022-12-13T11:15:57.417555Z","iopub.status.idle":"2022-12-13T11:15:57.431570Z","shell.execute_reply.started":"2022-12-13T11:15:57.417511Z","shell.execute_reply":"2022-12-13T11:15:57.429752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mu = train.mean()\nstd = train.std()\n\ntrain = (train - mu) / std\ntest = (test - mu) / std\n\nvalid = train[50000:]\ntrain = train[:50000]\n\nvalid_label = train_label[50000:]\ntrain_label = train_label[:50000]","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:15:58.746261Z","iopub.execute_input":"2022-12-13T11:15:58.746683Z","iopub.status.idle":"2022-12-13T11:15:59.085072Z","shell.execute_reply.started":"2022-12-13T11:15:58.746645Z","shell.execute_reply":"2022-12-13T11:15:59.083412Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class MNISTDataset(Dataset):\n    \n    def __init__(self, x, y=None):\n        self.x = x\n        self.y = y\n    \n    def __len__(self):\n        return len(self.x)\n    \n    def __getitem__(self, item):\n        xi = torch.tensor(self.x[item]).float()\n        if self.y is None:\n            return xi\n        else:\n            yi = torch.tensor(self.y[item]).long()   #float类型用于连续变量，long类型用于整数变量\n            # 注意，多分类需要用到CrossEntropyLoss\n            return xi, yi","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:15:59.437138Z","iopub.execute_input":"2022-12-13T11:15:59.437556Z","iopub.status.idle":"2022-12-13T11:15:59.445988Z","shell.execute_reply.started":"2022-12-13T11:15:59.437512Z","shell.execute_reply":"2022-12-13T11:15:59.444837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ds = MNISTDataset(train, train_label)\nvalid_ds = MNISTDataset(valid, valid_label)\n\ntest_ds = MNISTDataset(test)\n\ntrain_dl = DataLoader(train_ds, shuffle=True, batch_size=16)\nvalid_dl = DataLoader(valid_ds, shuffle=True, batch_size=16)\ntest_dl = DataLoader(test_ds, shuffle=False, batch_size=16)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:16:00.645521Z","iopub.execute_input":"2022-12-13T11:16:00.646056Z","iopub.status.idle":"2022-12-13T11:16:00.652942Z","shell.execute_reply.started":"2022-12-13T11:16:00.646017Z","shell.execute_reply":"2022-12-13T11:16:00.651926Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):\n    \"\"\"绘制图像列表\"\"\"\n    figsize = (num_cols * scale, num_rows * scale)\n    _, axes = plt.subplots(num_rows, num_cols, figsize=figsize)\n    axes = axes.flatten()\n    imgs = imgs.reshape(-1, 28, 28)\n    for i, (ax, img) in enumerate(zip(axes, imgs)):\n        if torch.is_tensor(img):\n            # 图片张量\n            ax.imshow(img.numpy())\n        else:\n            # PIL图片\n            ax.imshow(img)\n        ax.axes.get_xaxis().set_visible(False)\n        ax.axes.get_yaxis().set_visible(False)\n        if titles:\n            ax.set_title(titles[i])\n    return axes\n\n\nfor x, y in train_dl:\n    break\nshow_images(x, 4, 4)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:16:01.622863Z","iopub.execute_input":"2022-12-13T11:16:01.623588Z","iopub.status.idle":"2022-12-13T11:16:02.220719Z","shell.execute_reply.started":"2022-12-13T11:16:01.623540Z","shell.execute_reply":"2022-12-13T11:16:02.218775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:16:02.407746Z","iopub.execute_input":"2022-12-13T11:16:02.408142Z","iopub.status.idle":"2022-12-13T11:16:02.413377Z","shell.execute_reply.started":"2022-12-13T11:16:02.408109Z","shell.execute_reply":"2022-12-13T11:16:02.412162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 使用PyTorch中nn这个库来构建逻辑回归模型\nclass LogisticRegressionModel(nn.Module):\n    def __init__(self, n_feature):\n        super().__init__()    # 必须执行的标准步骤\n        self.linear = nn.Linear(n_feature, 1)   # 线性层\n        self.sigmoid = nn.Sigmoid()             # sigmoid  \n\n    def forward(self, x):\n        x = self.linear(x)\n        pred = self.sigmoid(x)\n        return pred\n\nmodel = LogisticRegressionModel(n_feature=2)\nprint(model)\n\n# 使用optim 提供了不同的梯度下降优化器，包括SGD, RMSProp, Adam等，这里我们采用最基本的随机梯度下降优化器SGD\noptimizer = torch.optim.SGD(\n    model.parameters(), # 需要优化的模型参数\n    lr=0.1          # 学习率\n)\n\n# 损失函数，采用2分类损失函 Binary Classification Error loss\nloss_func = torch.nn.BCELoss()","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:16:03.603681Z","iopub.execute_input":"2022-12-13T11:16:03.604281Z","iopub.status.idle":"2022-12-13T11:16:03.615354Z","shell.execute_reply.started":"2022-12-13T11:16:03.604246Z","shell.execute_reply":"2022-12-13T11:16:03.613767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 定义模型\nclass Net(torch.nn.Module):\n    def __init__(self):\n        super(Net, self).__init__()\n        self.fc1 = torch.nn.Linear(784, 256)\n        self.relu = torch.nn.ReLU()\n        self.fc3 = torch.nn.Linear(256, 10)\n    \n\n    def forward(self, x):\n        x = self.fc1(x)\n        x = self.relu(x)\n        logits = self.fc3(x)\n        return logits\n    \nnet = Net()\nnet\n","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:16:08.084737Z","iopub.execute_input":"2022-12-13T11:16:08.085172Z","iopub.status.idle":"2022-12-13T11:16:08.098972Z","shell.execute_reply.started":"2022-12-13T11:16:08.085142Z","shell.execute_reply":"2022-12-13T11:16:08.096586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"optimizer = torch.optim.Adam(net.parameters(), lr=0.0003)\nloss_func = torch.nn.CrossEntropyLoss()  # 使用交叉熵损失函数\n\n# 设置迭代次数\n#enumerate enumerate(sequence, [start=0]) 其中参数为: sequence一个序列\nfor epoch in range(5):\n    model.train()\n    for batch_idx, (data, target) in enumerate(train_dl):\n        cal_data = net(data)\n        # 将计算的数据与目标数据求误差损失\n        loss = loss_func(cal_data, target) ##一直更新？一个data的len16 ？\n\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        # 每隔200*batcsize(200) = 40000 打印输出结果  train_dl的 batch_size=16 \n        if batch_idx % 200 == 0:  #batch_index是每次取16个数据返回一个编号\n            print('训练: {} [{}/{} ({:.0f}%)]\\t Loss: {:.6f}'.format(\n                epoch, batch_idx * len(data), len(train_dl.dataset),\n                       100. * batch_idx / len(train_dl), loss.item())) #loss.item()?\n    \n    # 验证\n    model.eval()\n    test_loss = 0\n    correct = 0\n    for data, target in valid_dl:\n        logits = net(data)\n        test_loss += loss_func(logits, target).item()\n        # 取出预测最大值的索引编号，即预测值\n        pred = logits.data.argmax(dim=1)\n        # 统计正确预测的个数\n        correct += pred.eq(target.data).sum()\n\n    test_loss /= len(valid_dl.dataset)\n    # 打印输出测试误差及准确率\n    print('\\n测试: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(\n        test_loss, correct, len(valid_dl.dataset),\n        100. * correct / len(valid_dl.dataset)))","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:16:09.026187Z","iopub.execute_input":"2022-12-13T11:16:09.026807Z","iopub.status.idle":"2022-12-13T11:16:44.673745Z","shell.execute_reply.started":"2022-12-13T11:16:09.026761Z","shell.execute_reply":"2022-12-13T11:16:44.672166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 预测测试集合\nnet.eval()\npreds = []\nfor data in test_dl:\n    logits = net(data)\n    preds.append(logits.argmax(dim=1).cpu().numpy())  # 选择预测概率最高的类别作为预测结果","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:16:44.676203Z","iopub.execute_input":"2022-12-13T11:16:44.676544Z","iopub.status.idle":"2022-12-13T11:16:44.832079Z","shell.execute_reply.started":"2022-12-13T11:16:44.676514Z","shell.execute_reply":"2022-12-13T11:16:44.831007Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = np.concatenate(preds)\n","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:16:44.833472Z","iopub.execute_input":"2022-12-13T11:16:44.833812Z","iopub.status.idle":"2022-12-13T11:16:44.839598Z","shell.execute_reply.started":"2022-12-13T11:16:44.833780Z","shell.execute_reply":"2022-12-13T11:16:44.837981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds.shape","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:16:45.829335Z","iopub.execute_input":"2022-12-13T11:16:45.829792Z","iopub.status.idle":"2022-12-13T11:16:45.836335Z","shell.execute_reply.started":"2022-12-13T11:16:45.829761Z","shell.execute_reply":"2022-12-13T11:16:45.834907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission['label'] = preds\nsample_submission.to_csv('./submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:17:43.999798Z","iopub.execute_input":"2022-12-13T11:17:44.000955Z","iopub.status.idle":"2022-12-13T11:17:44.015455Z","shell.execute_reply.started":"2022-12-13T11:17:44.000907Z","shell.execute_reply":"2022-12-13T11:17:44.014456Z"},"trusted":true},"execution_count":null,"outputs":[]}]}