Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2600|回复: 15

python 卷积神经网络

[复制链接]

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
发表于 2023-5-16 12:19:27 | 显示全部楼层 |阅读模式
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-16 12:23:24 | 显示全部楼层
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-16 13:23:54 | 显示全部楼层
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-16 14:26:20 | 显示全部楼层
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-16 14:56:16 | 显示全部楼层
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-16 15:06:45 | 显示全部楼层
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-16 22:43:34 | 显示全部楼层
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-24 09:23:29 | 显示全部楼层
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-24 15:54:26 | 显示全部楼层
  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as F
  4. import torch.optim as optim
  5. from torchvision import datasets,transforms
  6. BATCH_SIZE=16
  7. DEVICE=torch.device("cuda"if torch.cuda.is_available()else"cpu")
  8. EPOCHS=10
  9. pipeline =transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))])
  10. from torch.utils.data import DataLoader
  11. train_set=datasets.MNIST("data",train=True,download=True,transform=pipeline)
  12. test_set=datasets.MNIST("data",train=False,download=True,transform=pipeline)
  13. train_loader=DataLoader(train_set,batch_size=BATCH_SIZE,shuffle=True)
  14. test_loader=DataLoader(train_set,batch_size=BATCH_SIZE,shuffle=True)
  15. class Digit(nn.Module):
  16.     def __init__(self):
  17.         super().__init__()
  18.         self.convl=nn.Conv2d(1,10,5)
  19.         self.conv2=nn.Conv2d(10,20,3)
  20.         self.fcl=nn.Linear(20*10*10,500)
  21.         self.fc2=nn.Linear(500,10)
  22.     def forward(self,x):
  23.         input_size=x.size(0)#batch_size
  24.         x=self.convl(x)  #输入:batch*1*28*28,输出:batch*10*24*24(28-5+1)
  25.         x=F.relu(x)#保持shape不变 激活层
  26.         x=F.max_pool2d(x,2,2)#池化层  对图片进行压缩   输入:batch*10*24*24
  27.         #输出 batch*10*12*12
  28.         x=self.conv2(x)#输入:batch*10*12*12  输出:batch*20*(12-3+1)-(12-3+1)
  29.         x=F.relu(x)
  30.         #拉伸
  31.         x=x.view(input_size,-1)  #-1  自动计算维度20*10*10=2000
  32.         #进入全连接层
  33.         x=self.fcl(x)#输入:batch*2000  输出batch*500
  34.         x=F.relu(x)
  35.         x=self.fc2(x)#输入batch*500  输出:batch*10
  36.         output=F.log_softmax(x,dim=1)#计算分类,每个数字的概率值
  37.         return output

  38. #定义优化器
  39. model=Digit().to(DEVICE)
  40. optimizer = optim.Adam(model.parameters())
  41. #定义训练方法
  42. def train_model(model,device,train_loader,optimizer,epoch):
  43.     model.train()
  44.     for batch_index,(data,target) in enumerate(train_loader):
  45.         data,target=data.to(device),target.to(device)#部署到device上去
  46.          #梯度初始化为0
  47.         optimizer.zero_grad()
  48.         #训练后的结果
  49.         output=model(data)
  50.         #计算损失
  51.         loss=F.cross_entropy(output,target)#交叉熵损失函数
  52.         #找到概率值最大的下标
  53.         pred=output.max(1,keepdim=True)
  54.         #反向传播
  55.         loss.backward()
  56.         #参数优化
  57.         optimizer.step()
  58.         if batch_index%3000==0:
  59.             print("Train Epoch : {} \t Loss:{:.6f}".format(epoch,loss.item()))

  60. #定义测试方法
  61. def test_model(model,device,test_loader):
  62.     #模拟验证
  63.     model.eval()
  64.     #正确率
  65.     correct=0.0
  66.     #测试损失
  67.     test_loss=0.0
  68.     with torch.no_grad():#不会计算梯度,也不会进行反向传播
  69.         for data, target in test_loader:
  70.             #部署到device上
  71.             data,target=data.to(device),target.to(device)
  72.             #测试数据
  73.             output=model(data)
  74.             #测试损失
  75.             test_loss+=F.cross_entropy(output,target).item()
  76.             #找到概率值最大的索引
  77.             pred=output.max(1,keepdim=True)[1]#值 索引
  78.             #另外两种方法 pred=torch.max(output,dim=1)
  79.             #pred=output.argmax(dim=1)
  80.             #累计正确的数目
  81.             correct+=pred.eq(target.view_as(pred)).sum().item()
  82.         test_loss/=len(test_loader.dataset)
  83.         print("Test-Average loss:{:.4f},Accuracy:{:.3f}\n".format(test_loss,100.0*correct/len(test_loader.dataset)))

  84. #调用方法
  85. for epoch in range(1,EPOCHS+1):
  86.     train_model(model,DEVICE,train_loader,optimizer,epoch)
  87.     test_model(model,DEVICE,test_loader)
复制代码
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-24 18:22:16 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-4-13 00:43 , Processed in 0.038563 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表