• 深度学习编程入门deep-learning-for-image-processing-master 关于图片分类test1_official_demo的学习


    这个小文件夹有三个部分组成,分别有model,predict和train

    首先从train开始学习

    1. import torch
    2. import torchvision
    3. import torch.nn as nn
    4. from model import LeNet
    5. import torch.optim as optim
    6. import torchvision.transforms as transforms
    7. def main():
    8. transform = transforms.Compose(
    9. [transforms.ToTensor(),
    10. transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
    11. # 50000张训练图片
    12. # 第一次使用时要将download设置为True才会自动去下载数据集
    13. train_set = torchvision.datasets.CIFAR10(root='./data', train=True,
    14. download=False, transform=transform)
    15. train_loader = torch.utils.data.DataLoader(train_set, batch_size=36,
    16. shuffle=True, num_workers=0)
    17. # 10000张验证图片
    18. # 第一次使用时要将download设置为True才会自动去下载数据集
    19. val_set = torchvision.datasets.CIFAR10(root='./data', train=False,
    20. download=False, transform=transform)
    21. val_loader = torch.utils.data.DataLoader(val_set, batch_size=5000,
    22. shuffle=False, num_workers=0)
    23. val_data_iter = iter(val_loader)
    24. val_image, val_label = val_data_iter.next()
    25. # classes = ('plane', 'car', 'bird', 'cat',
    26. # 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
    27. net = LeNet()
    28. loss_function = nn.CrossEntropyLoss()
    29. optimizer = optim.Adam(net.parameters(), lr=0.001)
    30. for epoch in range(5): # loop over the dataset multiple times
    31. running_loss = 0.0
    32. for step, data in enumerate(train_loader, start=0):
    33. # get the inputs; data is a list of [inputs, labels]
    34. inputs, labels = data
    35. # zero the parameter gradients
    36. optimizer.zero_grad()
    37. # forward + backward + optimize
    38. outputs = net(inputs)
    39. loss = loss_function(outputs, labels)
    40. loss.backward()
    41. optimizer.step()
    42. # print statistics
    43. running_loss += loss.item()
    44. if step % 500 == 499: # print every 500 mini-batches
    45. with torch.no_grad():
    46. outputs = net(val_image) # [batch, 10]
    47. predict_y = torch.max(outputs, dim=1)[1]
    48. accuracy = torch.eq(predict_y, val_label).sum().item() / val_label.size(0)
    49. print('[%d, %5d] train_loss: %.3f test_accuracy: %.3f' %
    50. (epoch + 1, step + 1, running_loss / 500, accuracy))
    51. running_loss = 0.0
    52. print('Finished Training')
    53. save_path = './Lenet.pth'
    54. torch.save(net.state_dict(), save_path)
    55. if __name__ == '__main__':
    56. main()

    主函数中,首先是transform

    def main():

      transform=transform.Compose([transforms.Totensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])这里看你的想法添加操作,比如旋转、切割等等

      train_set=torchvision.datasets.CIFAR10(root='./data',train=True,download=False, transform=transform)设置训练数据

      train_loader=torch.utils.data.Dataloader(train_set, batch_size=36,shuffle=True,num_workers=0)

    加载数据集

    val_sset=torchvision.dataset.CIFAR10(root=./data/,train=false,download=false,transform=transform)这里可以和训练使用不一样的transform

    val_loader=torch.utils.data.Dataloader(val_set,natch_size=50000,shuffle=false,num_worker=0)

    val_data_iter=iter(val_loader)

    val_image,val_label=val_data_iter.next()每次取一个,相当于之前那个dataset的作用

    # classes = ('plane', 'car', 'bird', 'cat',
    #            'deer', 'dog', 'frog', 'horse', 'ship', 'truck')d
    定义网络
    

    net=lenet()

    loss_function=nn.CrossEntroyLoss()设置损失函数

    optimizer=optim.Adam(net.parameters(),lr=0.001)

    for epoch in range(5)开始训练

      running_loss=0.0

     for step,data in enumerate(train_loader,start=0):

       inputs,labels=data

    [inputs, labels]

      optimizer.zero_grad()

     outputs=net(inputs)

     loss=loss_function(outputs,labels)

     loss.backward()

     optimizer.step()

     running_loss+=loss.item()

     这里都是常规操作,记住就行

     if step %500==499:开始验证

       with torch.no_grad():

        outputs=net(val_image)

      predict_y=torch.max(outputs,dim=1)[1]

      accuary=torch.eq(predict_y,val_label).sum().item()/val_label.size(0)

      running_loss=0.0

    保存模型

    save_path='./lenet.pth'

    torch.save(net.state_dict(),save.path)

    接下来看predict.py

    1. import torch
    2. import torchvision.transforms as transforms
    3. from PIL import Image
    4. from model import LeNet
    5. def main():
    6. transform = transforms.Compose(
    7. [transforms.Resize((32, 32)),
    8. transforms.ToTensor(),
    9. transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
    10. classes = ('plane', 'car', 'bird', 'cat',
    11. 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
    12. net = LeNet()
    13. net.load_state_dict(torch.load('Lenet.pth'))
    14. im = Image.open('1.jpg')
    15. im = transform(im) # [C, H, W]
    16. im = torch.unsqueeze(im, dim=0) # [N, C, H, W]
    17. with torch.no_grad():
    18. outputs = net(im)
    19. predict = torch.max(outputs, dim=1)[1].numpy()
    20. print(classes[int(predict)])
    21. if __name__ == '__main__':
    22. main()

        

    def main():

      transform=transform.Compose([transforms.Resize((32,32)),transforms.ToTensor(),

                                                          transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])

     classes=('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

     net=LeNet()

     net.load_state_dict(torch.load('Lenet.pth'))

     im=Image.open('1.jpg')

     im=transform(im)

     im=torch.unsqueeze(im,dim=0)

     with torch.no_grad():

       outputs=net(im)

       predict=torch.max(   outputs,dim=1)[1].numpy()

    最后是moedl

    本文中的模型是简单的lenet

    1. import torch.nn as nn
    2. import torch.nn.functional as F
    3. class LeNet(nn.Module):
    4. def __init__(self):
    5. super(LeNet, self).__init__()
    6. self.conv1 = nn.Conv2d(3, 16, 5)
    7. self.pool1 = nn.MaxPool2d(2, 2)
    8. self.conv2 = nn.Conv2d(16, 32, 5)
    9. self.pool2 = nn.MaxPool2d(2, 2)
    10. self.fc1 = nn.Linear(32*5*5, 120)
    11. self.fc2 = nn.Linear(120, 84)
    12. self.fc3 = nn.Linear(84, 10)
    13. def forward(self, x):
    14. x = F.relu(self.conv1(x)) # input(3, 32, 32) output(16, 28, 28)
    15. x = self.pool1(x) # output(16, 14, 14)
    16. x = F.relu(self.conv2(x)) # output(32, 10, 10)
    17. x = self.pool2(x) # output(32, 5, 5)
    18. x = x.view(-1, 32*5*5) # output(32*5*5)
    19. x = F.relu(self.fc1(x)) # output(120)
    20. x = F.relu(self.fc2(x)) # output(84)
    21. x = self.fc3(x) # output(10)
    22. return x

    这个网络非常简单,由卷积、池化、全连接这些层构成

    class LeNet(nn.Module):

      def __init__(self):

        super(LeNet,self).__init__()

       self.conv1=nn.Conv2d(3,16,5)

      self.pool1=nn.MaxPool2d(2,2)

      self.conv2d=nn/Conv2d(16,32,5)

      self.pool2=nn.MaxPool2d(2,2)

      self.fc1=nn.Linear(32**5,120)

      self.fc2=nn.Linear(120,84)

      self.fc3=nn.Linear(84,10)

    def forward(self,x):

       x=F.relu(self.conv1(x)

      x=self.pool1(x)

      x=F.relu(self.conv2d(X)

     x=self.pool2(x)

     x=x.view(-1,32*5*5)调整尺寸

    x=F.relu(self.fc1(x))

    x=F.relu(self.fc2(x))

    x=self.fc3(x)

    return x

  • 相关阅读:
    Flink日志收集到数据库/kafka
    深度拆解 OpenCoWork:一个本地多智能体桌面平台的架构设计与实现
    CSS(六)定位+元素的显示隐藏
    c# 哈希表(Hash Table)
    企业运维之服务管理 -- promethues
    关于图纸的吸附布局、全屏填充、适配内容来做图元根据图纸页面在不同窗口显示尺寸下自适应
    物理机--VMWare安装、配置虚拟化centos7系统流程
    关于iNand的分区(fdisk命令的源码分析)
    接口压力测试 jmeter--进阶篇(三)
    阿里云日志上报乱码问题记录
  • 原文地址:https://blog.csdn.net/kling_bling/article/details/126390620