{"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 pandas as pd#导入csv文件的库\nimport math\nimport numpy as np#进行矩阵运算的库\nimport matplotlib.pyplot as plt#作图的库\nimport torch#一个深度学习的库Pytorch\nimport torch.nn as nn#neural network,神经网络\nimport torch.optim as optim#一个实现了各种优化算法的库\nimport torch.nn.functional as F#神经网络函数库\nimport warnings#避免一些可以忽略的报错\nwarnings.filterwarnings('ignore')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-07-07T08:04:23.316000Z","iopub.execute_input":"2023-07-07T08:04:23.316341Z","iopub.status.idle":"2023-07-07T08:04:24.796717Z","shell.execute_reply.started":"2023-07-07T08:04:23.316311Z","shell.execute_reply":"2023-07-07T08:04:24.795771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#设置随机种子\nimport random\ntorch.backends.cudnn.deterministic = True#将cudnn框架中的随机数生成器设为确定性模式\ntorch.backends.cudnn.benchmark = False#关闭CuDNN框架的自动寻找最优卷积算法的功能，以避免不同的算法对结果产生影响\ntorch.manual_seed(42)\nnp.random.seed(42)\nrandom.seed(42)","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:04:24.798561Z","iopub.execute_input":"2023-07-07T08:04:24.799366Z","iopub.status.idle":"2023-07-07T08:04:24.809075Z","shell.execute_reply.started":"2023-07-07T08:04:24.799332Z","shell.execute_reply":"2023-07-07T08:04:24.808070Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=pd.read_csv(\"/kaggle/input/cifar-10dataset/CIFAR-10/train.csv\")\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:04:24.811395Z","iopub.execute_input":"2023-07-07T08:04:24.812306Z","iopub.status.idle":"2023-07-07T08:04:52.235056Z","shell.execute_reply.started":"2023-07-07T08:04:24.812274Z","shell.execute_reply":"2023-07-07T08:04:52.234196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datay=train['label'].values\ntrain=train.drop(['Unnamed: 0','label',],axis=1)\ndataX=train.values.reshape(-1,3,32,32)/255.0-0.5","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:04:52.237892Z","iopub.execute_input":"2023-07-07T08:04:52.238225Z","iopub.status.idle":"2023-07-07T08:04:53.156989Z","shell.execute_reply.started":"2023-07-07T08:04:52.238192Z","shell.execute_reply":"2023-07-07T08:04:53.156057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#划分训练集和测试集的函数\ndef train_test_split(dataX,datay,shuffle=True,percentage=0.8):\n    \"\"\"\n    将训练数据X和标签y以numpy.array数组的形式传入\n    划分的比例定为训练集:测试集=8:2\n    \"\"\"\n    if shuffle:\n        random_num=[index for index in range(len(dataX))]\n        np.random.shuffle(random_num)\n        dataX=dataX[random_num]\n        datay=datay[random_num]\n    split_num=int(len(dataX)*percentage)\n    train_X=dataX[:split_num]\n    train_y=datay[:split_num]\n    test_X=dataX[split_num:]\n    test_y=datay[split_num:]\n    return train_X,train_y,test_X,test_y","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:04:53.158406Z","iopub.execute_input":"2023-07-07T08:04:53.158874Z","iopub.status.idle":"2023-07-07T08:04:53.166393Z","shell.execute_reply.started":"2023-07-07T08:04:53.158839Z","shell.execute_reply":"2023-07-07T08:04:53.165501Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_X,train_y,valid_X,valid_y=train_test_split(dataX,datay,percentage=0.9)\nlabel_count=np.max(train_y)+1\nfor index in range(label_count):\n    print(f\"np.sum(train_y==index)={np.sum(train_y==index)}\")\nprint(f\"train_X.shape:{train_X.shape},valid_X.shape:{valid_X.shape}\")","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:04:53.167750Z","iopub.execute_input":"2023-07-07T08:04:53.168697Z","iopub.status.idle":"2023-07-07T08:04:55.125421Z","shell.execute_reply.started":"2023-07-07T08:04:53.168665Z","shell.execute_reply":"2023-07-07T08:04:55.124415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cfgs={\n    'vgg19':[64,64,'M',128,128,'M',256,256,256,256,'M',512,512,512,512,'M',512,512,512,512,'M']\n}\ndef make_feature(cfg):\n    feature_layers=[]#特征图\n    front=3#上一层的参数\n    for v in cfg:#遍历vgg的每层网络结构\n        if v==\"M\":#如果是最大池化层\n            feature_layers.append(nn.MaxPool2d(2,2))#池化核大小为2,步长为2\n        else:\n            feature_layers.append(nn.Conv2d(front,v,kernel_size=3,stride=1,padding=1))\n            feature_layers.append(nn.BatchNorm2d(v))\n            front=v\n            feature_layers.append(nn.GELU())\n    return nn.Sequential(*feature_layers)\nclass VGG(nn.Module):\n    def __init__(self):\n        #继承父类的所有方法\n        super(VGG,self).__init__()\n        \n        self.flag=0\n        self.center_array=[]\n        \n        self.conv=make_feature(cfgs['vgg19'])\n        \n        self.fc=nn.Sequential(\n        nn.Linear(512,2048),\n        nn.BatchNorm1d(2048),\n        nn.Dropout(0.2),\n        nn.Tanh(),\n        nn.Linear(2048,1024),\n        nn.BatchNorm1d(1024),\n        nn.GELU(),\n        nn.Linear(1024,10),\n        )   \n        \n    def circle_padding(sellf,image, pad=1):\n        \"\"\"\n        input: torch.Tensor image (batch_size, channels, height, width)\n        output: pad_image (batch_size, channels, height+2*pad, width+2*pad)\n        \"\"\"\n        b, c, h, w = image.shape\n        pad_image = torch.zeros((b, c, h+2*pad, w+2*pad), device=image.device)\n\n        pad_image[:, :, pad:h+pad, pad:w+pad] = image\n        pad_image[:, :, 0:pad, pad:w+pad] = image[:, :, -pad:, :]\n        pad_image[:, :, -pad:, pad:w+pad] = image[:, :, 0:pad, :]\n        pad_image[:, :, pad:h+pad, 0:pad] = image[:, :, :, -pad:]\n        pad_image[:, :, pad:h+pad, -pad:] = image[:, :, :, 0:pad]\n        pad_image[:, :, 0:pad, 0:pad] = image[:, :, -pad:, -pad:]\n        pad_image[:, :, -pad:, -pad:] = image[:, :, 0:pad, 0:pad]\n        pad_image[:, :, 0:pad, -pad:] = image[:, :, -pad:, 0:pad]\n        pad_image[:, :, -pad:, 0:pad] = image[:, :, 0:pad, -pad:]\n\n        return pad_image\n    def get_centering_array(self,image):\n        if self.flag==0:\n            #传入的是np.array的数组\n            batch_size,channels,row,col=image.shape\n            center_x=row/2\n            center_y=col/2\n            array=torch.randn(row,col).to(device)\n            for i in range(row):\n                for j in range(col):\n                    array[i][j]=math.sqrt(1- ( (i-center_x)**2+(j-center_y)**2)/( center_x**2+center_y**2 )/10)\n            self.flag=1\n            self.center_array=array\n        return image*self.center_array\n        \n    def forward(self,input):\n\n        output=self.circle_padding(input)\n        output=self.get_centering_array(output)\n        #卷积神经网络\n        output=self.conv(output)\n        output=output.view(-1,512)#reshape\n        #全连接层,原论文是4096\n        output=self.fc(output)\n        output=F.log_softmax(output/5,dim=1)\n        return output","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:04:55.127121Z","iopub.execute_input":"2023-07-07T08:04:55.127492Z","iopub.status.idle":"2023-07-07T08:04:55.148236Z","shell.execute_reply.started":"2023-07-07T08:04:55.127457Z","shell.execute_reply":"2023-07-07T08:04:55.147247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\ndevice='cuda' if torch.cuda.is_available() else\"cpu\"\n\nprint(f\"device:{device}\")\n\nvalid_X1=torch.Tensor(valid_X).to(device)\nnetC=VGG()\n\ntrain_accs=[]#存储训练集的准确率\nvalid_accs=[]#存储测试集的准确率\n#训练周期为5000次\nnum_epochs=5000\nbatch_size=100#一次训练100张图片\n#优化器\noptimizer=optim.Adam(netC.parameters(),lr=0.00025,betas=(0.5,0.999))\n#损失函数\ncriterion=nn.NLLLoss()\n\nnetC.to(device)\n\nweight_decay=0.00001#L1正则化的权重\n\nfor epoch in range(num_epochs):\n    \n    random_num=[index for index in range(len(train_X))]\n    np.random.shuffle(random_num)\n    \n    train_X=train_X[random_num]\n    \n    train_y=train_y[random_num]\n    \n    train_X1=torch.Tensor(train_X[:batch_size]).to(device)\n    train_y1=torch.Tensor(train_y[:batch_size]).long().to(device)\n    #训练\n    netC.train()\n    #将数据放进去训练\n    output=netC(train_X1).to(device)\n    #计算每次的损失函数\n    loss=criterion(output,train_y1).to(device)\n    #L1正则化\n    l1_regularization = torch.tensor(0.).to(device)\n    for param in netC.parameters():\n        l1_regularization += torch.norm(param, 1)\n    loss += weight_decay * l1_regularization\n    #反向传播\n    loss.backward()\n    #优化器进行优化(梯度下降,降低误差)\n    optimizer.step()\n    #将梯度清空\n    optimizer.zero_grad()\n    if epoch%50==0:\n        netC.eval()\n        with torch.no_grad():\n            output=netC(train_X1).to(device)\n            output=output.detach().cpu().numpy()\n            train_pred=np.argmax(output,axis=1)\n\n            output=netC(valid_X1).to(device)\n            output=output.detach().cpu().numpy()\n            valid_pred=np.argmax(output,axis=1)\n        \n        train_acc=np.sum(train_pred==train_y[:batch_size])/len(train_y[:batch_size])\n        valid_acc=np.sum(valid_pred==valid_y)/len(valid_y)\n\n        train_accs.append(train_acc)\n        valid_accs.append(valid_acc)\n        print(f\"epoch:{epoch},loss:{loss}\\n train_acc:{train_acc},valid_acc:{valid_acc}\")","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:04:55.149949Z","iopub.execute_input":"2023-07-07T08:04:55.150384Z","iopub.status.idle":"2023-07-07T08:37:19.629559Z","shell.execute_reply.started":"2023-07-07T08:04:55.150353Z","shell.execute_reply":"2023-07-07T08:37:19.628494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"percentage=0.2#剪枝的比例\nparameter=[]#每层的参数\nchange_cfgs=[]\nparameter_sorted=np.array([])\nfor name,module in netC.named_modules():\n    if isinstance(module,nn.BatchNorm2d): \n        parameter.append(module.weight.detach().cpu().numpy())\n        parameter_sorted=np.concatenate((parameter_sorted,module.weight.detach().cpu().numpy()),axis=0)\nparameter_sorted,index_sorted=torch.sort(torch.abs(torch.Tensor(parameter_sorted)))\nsplit_weight=parameter_sorted[int(percentage*len(parameter_sorted))]#小于这个数字的特征图不要\nfor i in range(len(parameter)):\n    for j in range(len(parameter[i])):\n        if abs(parameter[i][j])<split_weight:\n            parameter[i][j]=0\nfor index in range(len(parameter)):\n    change_cfgs.append(np.sum(parameter[index]!=0) )\n    print(f\"np.sum(parameter[index]!=0)={np.sum(parameter[index]!=0)}\")\nprint(change_cfgs)","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:37:19.631125Z","iopub.execute_input":"2023-07-07T08:37:19.631488Z","iopub.status.idle":"2023-07-07T08:37:19.721042Z","shell.execute_reply.started":"2023-07-07T08:37:19.631455Z","shell.execute_reply":"2023-07-07T08:37:19.720114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#存储卷积层和batchNorm层剪枝剩下的参数\nlayer=0#记录一下这是第几层\ntotal_parameter=[]\nfor name,module in netC.named_modules():\n    if isinstance(module,nn.Conv2d):\n        conv_parameter=[]\n        conv_weight=module.weight.detach().cpu().numpy()\n        for index in range(len(conv_weight)):\n            if parameter[layer][index]:#如果这个特征图重要\n                #conv_weight[index]\n                weight=conv_weight[index]\n                remain_weight=[]\n                if layer==0:\n                    remain_weight=weight\n                for j in range(len(weight)):\n                    if layer and parameter[layer-1][j]:#上一层的这个位置重要吗?\n                        remain_weight.append(weight[j])\n                conv_parameter.append(np.array(remain_weight))\n        #print(f\"conv_weight[index].shape:{conv_weight[index].shape}\")\n        total_parameter.append(conv_parameter)\n    if isinstance(module,nn.BatchNorm2d): \n        bn_parameter=[]\n        bn_weight=module.weight.detach().cpu().numpy()\n        for index in range(len(bn_weight)):\n            if parameter[layer][index]:#如果这个特征图重要\n                bn_parameter.append(bn_weight[index])\n        total_parameter.append(bn_parameter)\n        layer+=1\nprint(f\"len(total_parameter):{len(total_parameter)}\")","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:37:19.724207Z","iopub.execute_input":"2023-07-07T08:37:19.724549Z","iopub.status.idle":"2023-07-07T08:37:21.706581Z","shell.execute_reply.started":"2023-07-07T08:37:19.724525Z","shell.execute_reply":"2023-07-07T08:37:21.705502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cfgs={\n    'vgg19':[64, 64,'M', 128, 128,'M',  256, 256, 256, 256, 'M', 454, 365, 374, 326, 'M', 339, 315, 382, 441,'M']\n}\ndef make_feature(cfg):\n    feature_layers=[]#特征图\n    front=3#上一层的参数\n    for v in cfg:#遍历vgg的每层网络结构\n        if v==\"M\":#如果是最大池化层\n            feature_layers.append(nn.MaxPool2d(2,2))#池化核大小为2,步长为2\n        else:\n            feature_layers.append(nn.Conv2d(front,v,kernel_size=3,stride=1,padding=1))\n            feature_layers.append(nn.BatchNorm2d(v))\n            front=v\n            feature_layers.append(nn.GELU())\n    return nn.Sequential(*feature_layers)\nclass prune_VGG(nn.Module):\n    def __init__(self):\n        #继承父类的所有方法\n        super(prune_VGG,self).__init__()\n        \n        self.flag=0\n        self.center_array=[]\n        \n        self.conv=make_feature(cfgs['vgg19'])\n        \n        self.fc=nn.Sequential(\n        nn.Linear(441,2048),\n        nn.BatchNorm1d(2048),\n        nn.Dropout(0.2),\n        nn.Tanh(),\n        nn.Linear(2048,1024),\n        nn.BatchNorm1d(1024),\n        nn.GELU(),\n        nn.Linear(1024,10),\n        )   \n        \n    def circle_padding(sellf,image, pad=1):\n        \"\"\"\n        input: torch.Tensor image (batch_size, channels, height, width)\n        output: pad_image (batch_size, channels, height+2*pad, width+2*pad)\n        \"\"\"\n        b, c, h, w = image.shape\n        pad_image = torch.zeros((b, c, h+2*pad, w+2*pad), device=image.device)\n\n        pad_image[:, :, pad:h+pad, pad:w+pad] = image\n        pad_image[:, :, 0:pad, pad:w+pad] = image[:, :, -pad:, :]\n        pad_image[:, :, -pad:, pad:w+pad] = image[:, :, 0:pad, :]\n        pad_image[:, :, pad:h+pad, 0:pad] = image[:, :, :, -pad:]\n        pad_image[:, :, pad:h+pad, -pad:] = image[:, :, :, 0:pad]\n        pad_image[:, :, 0:pad, 0:pad] = image[:, :, -pad:, -pad:]\n        pad_image[:, :, -pad:, -pad:] = image[:, :, 0:pad, 0:pad]\n        pad_image[:, :, 0:pad, -pad:] = image[:, :, -pad:, 0:pad]\n        pad_image[:, :, -pad:, 0:pad] = image[:, :, 0:pad, -pad:]\n\n        return pad_image\n    def get_centering_array(self,image):\n        if self.flag==0:\n            #传入的是np.array的数组\n            batch_size,channels,row,col=image.shape\n            center_x=row/2\n            center_y=col/2\n            array=torch.randn(row,col).to(device)\n            for i in range(row):\n                for j in range(col):\n                    array[i][j]=math.sqrt(1- ( (i-center_x)**2+(j-center_y)**2)/( center_x**2+center_y**2 )/10)\n            self.flag=1\n            self.center_array=array\n        return image*self.center_array\n        \n    def forward(self,input):\n\n        output=self.circle_padding(input)\n        output=self.get_centering_array(output)\n        #卷积神经网络\n        output=self.conv(output)\n        output=output.view(-1,441)#reshape\n        #全连接层,原论文是4096\n        output=self.fc(output)\n        output=F.log_softmax(output/5,dim=1)\n        return output","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:39:06.991016Z","iopub.execute_input":"2023-07-07T08:39:06.992117Z","iopub.status.idle":"2023-07-07T08:39:07.012417Z","shell.execute_reply.started":"2023-07-07T08:39:06.992069Z","shell.execute_reply":"2023-07-07T08:39:07.011489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"netC1=prune_VGG()\nlayer=0\nfor name,module in netC1.named_modules():\n    if isinstance(module,nn.Conv2d) or isinstance(module,nn.BatchNorm2d):  \n        module.weight.data=torch.Tensor(total_parameter[layer]).clone()\n        print(f\"module.weight.shape:{module.weight.shape}\\n total_parameter[layer].shape:{np.array(total_parameter[layer]).shape:}\")\n        layer+=1","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:39:12.271592Z","iopub.execute_input":"2023-07-07T08:39:12.272252Z","iopub.status.idle":"2023-07-07T08:39:23.482507Z","shell.execute_reply.started":"2023-07-07T08:39:12.272212Z","shell.execute_reply":"2023-07-07T08:39:23.481480Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\ntrain_accs=[]#存储训练集的准确率\nvalid_accs=[]#存储测试集的准确率\n#训练周期为5000次\nnum_epochs=5000\nbatch_size=100#一次训练100张图片\n#优化器\noptimizer=optim.Adam(netC1.parameters(),lr=0.0002,betas=(0.5,0.999))\n#损失函数\ncriterion=nn.NLLLoss()\n\nnetC1.to(device)\n\nfor epoch in range(num_epochs):\n    \n    random_num=[index for index in range(len(train_X))]\n    np.random.shuffle(random_num)\n    \n    train_X=train_X[random_num]\n    train_y=train_y[random_num]\n    \n    train_X1=[]\n    for index in range(batch_size):\n        train_X1.append(train_X[index])\n    train_X1=np.array(train_X1)\n    \n    train_X1=torch.Tensor(train_X1).to(device)\n    train_y1=torch.Tensor(train_y[:batch_size]).long().to(device)\n    #训练\n    netC1.train()\n    #将数据放进去训练\n    output=netC1(train_X1).to(device)\n    #计算每次的损失函数\n    loss=criterion(output,train_y1).to(device)\n    #反向传播\n    loss.backward()\n    #优化器进行优化(梯度下降,降低误差)\n    optimizer.step()\n    #将梯度清空\n    optimizer.zero_grad()\n    if epoch%50==0:\n        netC1.eval()\n        with torch.no_grad():\n            output=netC1(train_X1).to(device)\n            output=output.detach().cpu().numpy()\n            train_pred=np.argmax(output,axis=1)\n\n            output=netC1(valid_X1).to(device)\n            output=output.detach().cpu().numpy()\n            valid_pred=np.argmax(output,axis=1)\n        \n        train_acc=np.sum(train_pred==train_y[:batch_size])/len(train_y[:batch_size])\n        valid_acc=np.sum(valid_pred==valid_y)/len(valid_y)\n\n        train_accs.append(train_acc)\n        valid_accs.append(valid_acc)\n        print(f\"epoch:{epoch},loss:{loss}\\n train_acc:{train_acc},valid_acc:{valid_acc}\")","metadata":{"execution":{"iopub.status.busy":"2023-07-07T08:39:34.494213Z","iopub.execute_input":"2023-07-07T08:39:34.494919Z","iopub.status.idle":"2023-07-07T09:10:02.431701Z","shell.execute_reply.started":"2023-07-07T08:39:34.494886Z","shell.execute_reply":"2023-07-07T09:10:02.430735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs=[i*50 for i in range(len(train_accs))]\nplt.title(\"CIFAR-10_prune\")\nplt.plot(epochs,train_accs,marker=\"o\",label=\"train_accs\")\nplt.plot(epochs,valid_accs,marker=\"x\",label=\"valid_accs\")\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-07T09:10:05.166481Z","iopub.execute_input":"2023-07-07T09:10:05.166840Z","iopub.status.idle":"2023-07-07T09:10:05.471844Z","shell.execute_reply.started":"2023-07-07T09:10:05.166812Z","shell.execute_reply":"2023-07-07T09:10:05.470957Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test=pd.read_csv(\"/kaggle/input/cifar-10dataset/CIFAR-10/test.csv\")\ntest.head()","metadata":{"execution":{"iopub.status.busy":"2023-07-07T09:10:11.548094Z","iopub.execute_input":"2023-07-07T09:10:11.549117Z","iopub.status.idle":"2023-07-07T09:10:17.217896Z","shell.execute_reply.started":"2023-07-07T09:10:11.549069Z","shell.execute_reply":"2023-07-07T09:10:17.216805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test=test.drop(['Unnamed: 0'],axis=1)\ntest_X=test.values.reshape(-1,3,32,32)/255.0-0.5","metadata":{"execution":{"iopub.status.busy":"2023-07-07T09:10:17.219794Z","iopub.execute_input":"2023-07-07T09:10:17.220857Z","iopub.status.idle":"2023-07-07T09:10:17.411557Z","shell.execute_reply.started":"2023-07-07T09:10:17.220819Z","shell.execute_reply":"2023-07-07T09:10:17.410593Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_label=[]\nfor i in range(len(test_X)):\n    netC.eval()\n    with torch.no_grad():\n        image=test_X[i]\n        pred=netC(torch.Tensor([image]).to(device))[0]\n        pred=np.argmax(pred.detach().cpu().numpy())\n        test_label.append(pred)","metadata":{"execution":{"iopub.status.busy":"2023-07-07T09:10:19.808686Z","iopub.execute_input":"2023-07-07T09:10:19.809033Z","iopub.status.idle":"2023-07-07T09:11:03.600636Z","shell.execute_reply.started":"2023-07-07T09:10:19.809007Z","shell.execute_reply":"2023-07-07T09:11:03.599646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#写入文件\nimport csv\nhead=[\"index\",\"label\"]\ndata=[]\nfor index in range(len(test_label)):\n    data.append([index,test_label[index]])\nwith open(\"CIFAR-10_VGG_prune_submission.csv\",'w',newline='') as f:\n    writer=csv.writer(f)\n    writer.writerow(head)\n    writer.writerows(data)","metadata":{"execution":{"iopub.status.busy":"2023-07-07T09:11:03.602160Z","iopub.execute_input":"2023-07-07T09:11:03.602513Z","iopub.status.idle":"2023-07-07T09:11:03.630238Z","shell.execute_reply.started":"2023-07-07T09:11:03.602480Z","shell.execute_reply":"2023-07-07T09:11:03.629426Z"},"trusted":true},"execution_count":null,"outputs":[]}]}