• pytorch-11.卷积神经网络(高级篇)


    Inception Moudel

     

    1. import torch
    2. from torchvision import transforms
    3. from torchvision import datasets
    4. from torch.utils.data import DataLoader
    5. import torch.nn.functional as F
    6. import torch.optim as optim
    7. batch_size = 64
    8. transform = transforms.Compose([
    9. transforms.ToTensor(),
    10. transforms.Normalize((0.1307),(0.3081))
    11. ])
    12. train_dataset = datasets.MNIST(root='../dataset/mnist/',train=True,download=True,transform=transform)
    13. train_loader = DataLoader(train_dataset,shuffle = True,batch_size=batch_size)
    14. test_dataset = datasets.MNIST(root='../dataset/mnist/',train=False,download=True,transform=transform)
    15. test_loader = DataLoader(train_dataset,shuffle = False,batch_size=batch_size)
    16. class InceptionA(torch.nn.Module):
    17. def __init__(self,in_channels):
    18. super(InceptionA, self).__init__()
    19. self.branch1x1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)
    20. self.branch5x5_1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)
    21. self.branch5x5_2 = torch.nn.Conv2d(16,24,kernel_size=5,padding=2)
    22. self.branch3x3_1 = torch.nn.Conv2d(in_channels, 16, kernel_size=1)
    23. self.branch3x3_2 = torch.nn.Conv2d(16,24, kernel_size=3,padding=1)
    24. self.branch3x3_3 = torch.nn.Conv2d(24, 24, kernel_size=3,padding=1)
    25. self.branch_pool = torch.nn.Conv2d(in_channels,24,kernel_size=1)
    26. def forward(self,x):
    27. branch1x1 = self.branch1x1(x)
    28. branch5x5 = self.branch5x5_1(x)
    29. branch5x5 = self.branch5x5_2(branch5x5)
    30. branch3x3 = self.branch3x3_1(x)
    31. branch3x3 = self.branch3x3_2(branch3x3)
    32. branch3x3 = self.branch3x3_3(branch3x3)
    33. branch_pool =F.avg_pool2d(x,kernel_size=3,stride=1,padding=1)
    34. branch_pool = self.branch_pool(branch_pool)
    35. outputs = [branch1x1,branch5x5,branch3x3,branch_pool]
    36. return torch.cat(outputs,dim=1) #batch channel W H dim=1即沿着channel的维度拼起来
    37. class Net(torch.nn.Module):
    38. def __init__(self):
    39. super(Net, self).__init__()
    40. self.conv1 = torch.nn.Conv2d(1,10,kernel_size=5)
    41. self.conv2 = torch.nn.Conv2d(88,20,kernel_size=5) # input_channel , output_channel
    42. self.incep1 = InceptionA(in_channels=10)
    43. self.incep2 = InceptionA(in_channels=20)
    44. self.mp = torch.nn.MaxPool2d(2)
    45. self.fc = torch.nn.Linear(1408,10)
    46. def forward(self,x):
    47. batch_size = x.size(0)
    48. x = F.relu(self.mp(self.conv1(x)))
    49. x = self.incep1(x)
    50. x = F.relu(self.mp(self.conv2(x)))
    51. x = self.incep2(x)
    52. x = x.view(batch_size,-1)
    53. x = self.fc(x)
    54. return x
    55. model = Net()
    56. device = torch.device("cuda:0"if torch.cuda.is_available() else "cpu")
    57. model.to(device)
    58. criterion = torch.nn.CrossEntropyLoss()
    59. optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
    60. def train(epoch):
    61. running_loss = 0.0
    62. for batch_idx,data in enumerate(train_loader,0):
    63. inputs, target = data
    64. inputs, target = inputs.to(device),target.to(device) #送到GPU
    65. optimizer.zero_grad()
    66. #forward + backward + update
    67. outputs = model(inputs)
    68. loss = criterion(outputs,target)
    69. loss.backward()
    70. optimizer.step()
    71. running_loss +=loss.item()
    72. if batch_idx % 300 ==299:
    73. print('[%d,%5d]loss:%.3f'%(epoch+1,batch_idx+1,running_loss/300))
    74. running_loss = 0
    75. def test():
    76. correct = 0
    77. total = 0
    78. with torch.no_grad():
    79. for data in test_loader:
    80. images,labels = data
    81. images, labels = images.to(device), labels.to(device) # 送到GPU
    82. outputs = model(images)
    83. _,predicted = torch.max(outputs.data,dim=1) #dim=1维度1,行是第0个维度,列是第1个维度
    84. total +=labels.size(0)
    85. correct +=(predicted==labels).sum().item()
    86. print('Accuracy on test set:%d %%'%(100*correct/total) )
    87. if __name__ == '__main__':
    88. for epoch in range(10):
    89. train(epoch)
    90. test()

     结果:

    [1,  300]loss:0.880
    [1,  600]loss:0.198
    [1,  900]loss:0.144
    Accuracy on test set:96 %
    [2,  300]loss:0.111
    [2,  600]loss:0.099
    [2,  900]loss:0.090
    Accuracy on test set:97 %
    [3,  300]loss:0.078
    [3,  600]loss:0.071
    [3,  900]loss:0.076
    Accuracy on test set:98 %
    [4,  300]loss:0.062
    [4,  600]loss:0.065
    [4,  900]loss:0.057
    Accuracy on test set:98 %
    [5,  300]loss:0.055
    [5,  600]loss:0.057
    [5,  900]loss:0.052
    Accuracy on test set:98 %
    [6,  300]loss:0.047
    [6,  600]loss:0.049
    [6,  900]loss:0.050
    Accuracy on test set:98 %
    [7,  300]loss:0.045
    [7,  600]loss:0.046
    [7,  900]loss:0.043
    Accuracy on test set:98 %
    [8,  300]loss:0.040
    [8,  600]loss:0.037
    [8,  900]loss:0.041
    Accuracy on test set:98 %
    [9,  300]loss:0.038
    [9,  600]loss:0.038
    [9,  900]loss:0.034
    Accuracy on test set:99 %
    [10,  300]loss:0.035
    [10,  600]loss:0.034
    [10,  900]loss:0.034
    Accuracy on test set:99 %

    Process finished with exit code 0
     


    Residual Block

    Residual Block解决了梯度消失的问题

     

    1. import torch
    2. from torchvision import transforms
    3. from torchvision import datasets
    4. from torch.utils.data import DataLoader
    5. import torch.nn.functional as F
    6. import torch.optim as optim
    7. batch_size = 64
    8. transform = transforms.Compose([
    9. transforms.ToTensor(),
    10. transforms.Normalize((0.1307),(0.3081))
    11. ])
    12. train_dataset = datasets.MNIST(root='../dataset/mnist/',train=True,download=True,transform=transform)
    13. train_loader = DataLoader(train_dataset,shuffle = True,batch_size=batch_size)
    14. test_dataset = datasets.MNIST(root='../dataset/mnist/',train=False,download=True,transform=transform)
    15. test_loader = DataLoader(train_dataset,shuffle = False,batch_size=batch_size)
    16. class ResidualBlock(torch.nn.Module):
    17. def __init__(self,channels):
    18. super(ResidualBlock, self).__init__()
    19. self.channels = channels
    20. self.conv1 = torch.nn.Conv2d(channels,channels,kernel_size=3,padding=1)
    21. self.conv2 = torch.nn.Conv2d(channels,channels,kernel_size=3,padding=1)
    22. def forward(self,x):
    23. y = F.relu(self.conv1(x))
    24. y = self.conv2(y)
    25. return F.relu(x+y)
    26. class Net(torch.nn.Module):
    27. def __init__(self):
    28. super(Net, self).__init__()
    29. self.conv1 = torch.nn.Conv2d(1, 16, kernel_size=5)
    30. self.conv2 = torch.nn.Conv2d(16, 32, kernel_size=5) # input_channel , output_channel
    31. self.rblock1 = ResidualBlock(16)
    32. self.rblock2 = ResidualBlock(32)
    33. self.mp = torch.nn.MaxPool2d(2)
    34. self.fc = torch.nn.Linear(512, 10)
    35. def forward(self,x):
    36. in_size = x.size(0)
    37. x = self.mp(F.relu(self.conv1(x)))
    38. x = self.rblock1(x)
    39. x = self.mp(F.relu(self.conv2(x)))
    40. x = self.rblock2(x)
    41. x = x.view(in_size,-1)
    42. x = self.fc(x)
    43. return x
    44. model = Net()
    45. device = torch.device("cuda:0"if torch.cuda.is_available() else "cpu")
    46. model.to(device)
    47. criterion = torch.nn.CrossEntropyLoss()
    48. optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
    49. def train(epoch):
    50. running_loss = 0.0
    51. for batch_idx,data in enumerate(train_loader,0):
    52. inputs, target = data
    53. inputs, target = inputs.to(device),target.to(device) #送到GPU
    54. optimizer.zero_grad()
    55. #forward + backward + update
    56. outputs = model(inputs)
    57. loss = criterion(outputs,target)
    58. loss.backward()
    59. optimizer.step()
    60. running_loss +=loss.item()
    61. if batch_idx % 300 ==299:
    62. print('[%d,%5d]loss:%.3f'%(epoch+1,batch_idx+1,running_loss/300))
    63. running_loss = 0
    64. def test():
    65. correct = 0
    66. total = 0
    67. with torch.no_grad():
    68. for data in test_loader:
    69. images,labels = data
    70. images, labels = images.to(device), labels.to(device) # 送到GPU
    71. outputs = model(images)
    72. _,predicted = torch.max(outputs.data,dim=1) #dim=1维度1,行是第0个维度,列是第1个维度
    73. total +=labels.size(0)
    74. correct +=(predicted==labels).sum().item()
    75. print('Accuracy on test set:%d %%'%(100*correct/total) )
    76. if __name__ == '__main__':
    77. for epoch in range(10):
    78. train(epoch)
    79. test()

    结果:

    [1,  300]loss:0.499
    [1,  600]loss:0.159
    [1,  900]loss:0.123
    Accuracy on test set:96 %
    [2,  300]loss:0.089
    [2,  600]loss:0.083
    [2,  900]loss:0.080
    Accuracy on test set:97 %
    [3,  300]loss:0.064
    [3,  600]loss:0.062
    [3,  900]loss:0.062
    Accuracy on test set:98 %
    [4,  300]loss:0.052
    [4,  600]loss:0.052
    [4,  900]loss:0.050
    Accuracy on test set:98 %
    [5,  300]loss:0.042
    [5,  600]loss:0.043
    [5,  900]loss:0.044
    Accuracy on test set:98 %
    [6,  300]loss:0.035
    [6,  600]loss:0.040
    [6,  900]loss:0.037
    Accuracy on test set:98 %
    [7,  300]loss:0.033
    [7,  600]loss:0.033
    [7,  900]loss:0.033
    Accuracy on test set:98 %
    [8,  300]loss:0.029
    [8,  600]loss:0.029
    [8,  900]loss:0.031
    Accuracy on test set:99 %
    [9,  300]loss:0.024
    [9,  600]loss:0.028
    [9,  900]loss:0.026
    Accuracy on test set:99 %
    [10,  300]loss:0.025
    [10,  600]loss:0.023
    [10,  900]loss:0.025
    Accuracy on test set:99 %

    Process finished with exit code 0
     

  • 相关阅读:
    【光学】基于matlab迈克尔逊干涉仪动态仿真【含Matlab源码 2054期】
    .NET Emit 入门教程:第二部分:构建动态程序集(追加构建静态程序集教程)
    动态规划合集
    python 常见文件读取
    C++ extern关键字理解
    vue 常用指令
    常用设计模式——模板方法模式
    九、多项式朴素贝叶斯算法(Multinomial NB,Multinomial Naive Bayes)(有监督学习)
    Mycat分库分表
    使用API Monitor工具巧妙探测C++程序中监听某端口的模块
  • 原文地址:https://blog.csdn.net/m0_65188455/article/details/126215558