{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":34375,"databundleVersionId":3405142,"sourceType":"competition"},{"sourceId":9104286,"sourceType":"datasetVersion","datasetId":5857},{"sourceId":208093232,"sourceType":"kernelVersion"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#水果\n\n\nimport torch\nfrom torchvision.transforms import v2\nfrom torchvision.datasets import ImageFolder\nfrom torch.utils.data import DataLoader,random_split \n\n\n\n\ntrans_compose =v2.Compose([\n    v2.ToTensor(),\n    v2.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),\n    v2.Resize(size=(100,100)),\n   \n    \n        ])\n\n\nfolder = ImageFolder('/kaggle/input/fruits/fruits-360_dataset_100x100/fruits-360/Training',transform=trans_compose)\n#自动数据框架\ntrain, test = random_split(folder, (70000   ,70491-70000 ) )   #超参数\ndata_loader3 = torch.utils.data.DataLoader(dataset=train,batch_size=200, shuffle=True,num_workers=3)    #batch_size=1459,分批读取的量 超参数\ndata_loader4 = torch.utils.data.DataLoader(dataset=test,batch_size=200, shuffle=True,num_workers=3)\n\nfolder\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-16T02:54:40.710593Z","iopub.execute_input":"2024-12-16T02:54:40.711003Z","iopub.status.idle":"2024-12-16T02:55:13.298643Z","shell.execute_reply.started":"2024-12-16T02:54:40.710954Z","shell.execute_reply":"2024-12-16T02:55:13.297706Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport torch.nn as nn\n#模型框架\nclass MyNet (nn.Module):\n    #启动计算模块\n    def __init__(self):\n        super(MyNet,self).__init__()\n        \n        self.L1 = nn.Conv2d(3,32,5,2,2)   #启动线性计算模块  # X.shape[1]是X的列\n        self.B1 = nn.BatchNorm2d(32)\n        self.L2 = nn.Conv2d(32,64,3,2,1) \n        self.B2 = nn.BatchNorm2d(64)\n        self.L3 = nn.Conv2d(64,128,3,2,1) \n        self.B3 = nn.BatchNorm2d(128)\n        self.L4 = nn.Conv2d(128,256,3,2,1) \n        self.B4 = nn.BatchNorm2d(256)\n       #水果\n        self.L = nn.Linear(12544,141) \n     \n    def forward(self,x):\n        out = self.L1(x)  \n        out = self.B1(out)\n        out = torch.relu(out)   #relu  sigmoid\n        \n        out = self.L2(out)\n        out = self.B2(out)\n        out = torch.relu(out)\n        \n        out = self.L3(out)\n        out = self.B3(out)\n        out = torch.relu(out)\n\n        out = self.L4(out)\n        out = self.B4(out)\n        out = torch.relu(out)\n        \n        out = torch.flatten(out,start_dim=1)\n        \n        out = self.L(out)  \n        \n        return out\n    \nmodel = MyNet().cuda()\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T02:55:13.300401Z","iopub.execute_input":"2024-12-16T02:55:13.301120Z","iopub.status.idle":"2024-12-16T02:55:13.334068Z","shell.execute_reply.started":"2024-12-16T02:55:13.301080Z","shell.execute_reply":"2024-12-16T02:55:13.333388Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":" for batchX, batchY in data_loader3:\n     batchX=batchX.cuda()\n     batchY=batchY.cuda() \n     out = model(batchX)\n     break\n    \nout.shape  \n\n    \n\n  ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T02:55:13.335036Z","iopub.execute_input":"2024-12-16T02:55:13.335368Z","iopub.status.idle":"2024-12-16T02:55:14.161485Z","shell.execute_reply.started":"2024-12-16T02:55:13.335327Z","shell.execute_reply":"2024-12-16T02:55:14.160449Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n\nimport os\np = ''\n\nif os.path.exists(p) == True:\n    model = torch.load(p)\n    model = model.cuda()\n    model.train()\n    print('加载完成!')\n    \n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T02:55:14.163450Z","iopub.execute_input":"2024-12-16T02:55:14.163767Z","iopub.status.idle":"2024-12-16T02:55:14.168578Z","shell.execute_reply.started":"2024-12-16T02:55:14.163738Z","shell.execute_reply":"2024-12-16T02:55:14.167644Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torchmetrics\n\nlossf = nn.CrossEntropyLoss()    #loss函数  #启动LOSS计算框架\noptimizer = torch.optim.SGD(model.parameters(), lr=0.1)   #启动更新w0的框架  #超参数\n#高粱 metricsf = torchmetrics.Accuracy(task='multiclass',num_classes=100).cuda()     #torchmetrics函数  #启动计算评估指标的模块\nmetricsf = torchmetrics.Accuracy(task='multiclass',num_classes=141).cuda() \n\nfor i in range(50):                  #超参数   #AI学习多少遍\n    for batchX, batchY in data_loader3:      #比赛 for batchX, batchY in data_loader3:  #从X和Y取一批数值  # for batchX, batchY in data_loader3:#加自己的\n        batchX=batchX.cuda()\n        batchY=batchY.cuda()\n       \n        \n        out = model(batchX)                 #计算YP\n        out = torch.squeeze(out)            #去除YP的shape中的1，因为要和Y保持一致\n        loss = lossf(out, batchY)           #计算LOSS\n\n        loss.backward()                    #计算梯度\n        optimizer.step()                   #更新W和w0\n        optimizer.zero_grad()              #清空梯度\n \n        metricsf(out, batchY)              #计算评估指标\n    print(loss, metricsf.compute())   #打印loss和评估指标\n    metricsf.reset()                         #清空评估指标\n    \ntorch.save(model,'model.pth')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T02:55:14.169740Z","iopub.execute_input":"2024-12-16T02:55:14.170376Z","iopub.status.idle":"2024-12-16T04:31:13.953402Z","shell.execute_reply.started":"2024-12-16T02:55:14.170347Z","shell.execute_reply":"2024-12-16T04:31:13.952316Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport torchmetrics\n\nmetricsf = torchmetrics.Accuracy(task='multiclass',num_classes=141).cuda()   #torchmetrics函数  #启动计算评估指标的模块\n#metricsf = torchmetrics.Accuracy(task='multiclass',num_classes=100).cuda()\nmodel.eval()\n\nfor i in range(50):      #(150)                  #超参数   #AI学习多少遍 \n    for batchX, batchY in data_loader4:\n        batchX=batchX.cuda()\n        batchY=batchY.cuda()\n        \n        \n        out = model(batchX)                 #计算YP\n        out = torch.squeeze(out)            #去除YP的shape中的1，因为要和Y保持一致\n       \n       \n        metricsf(out, batchY)              #计算评估指标\n    print(metricsf.compute())   #打印loss和评估指标\n    metricsf.reset()   #清空评估指\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T04:31:13.955057Z","iopub.execute_input":"2024-12-16T04:31:13.955949Z","iopub.status.idle":"2024-12-16T04:32:28.403671Z","shell.execute_reply.started":"2024-12-16T04:31:13.955908Z","shell.execute_reply":"2024-12-16T04:32:28.402528Z"}},"outputs":[],"execution_count":null}]}