• 【pytorch】模型常用函数(conv2d、linear、loss、maxpooling等)


    1、二维卷积函数——cnv2d():

    1. '''
    2. in_channels (int): 输入通道数
    3. out_channels (int): 输出通道数
    4. kernel_size (int or tuple): 卷积核大小
    5. stride (int or tuple, optional): 步长 Default: 1
    6. padding (int, tuple or str, optional): 填充 Default: 0
    7. padding_mode (str, optional): 填充模式 Default: 'zeros'
    8. dilation (int or tuple, optional): Default: 1
    9. groups (int, optional): Default: 1
    10. bias (bool, optional): 偏置 Default: ``True``
    11. '''

    从数据集中加载数据(batch_size=64)

    1. dataset = torchvision.datasets.CIFAR10(root="./train_dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
    2. dataloader = DataLoader(dataset,batch_size=64)

     建立2维卷积网络模型

    1. class Diviner(nn.Module):
    2. def __init__(self):
    3. super(Diviner,self).__init__()
    4. self.conv1 = Conv2d(in_channels=3,out_channels=6, kernel_size=(3,3) , stride=(1,1),padding=0)
    5. def forward(self,x):
    6. x = self.conv1(x)
    7. return x

    实例化网络模型,并将卷积后得到的图片在tensorboard中展示 

    1. diviner = Diviner()
    2. writer = SummaryWriter("conv")
    3. step = 0
    4. for data in dataloader:
    5. imgs,target = data
    6. output = diviner(imgs)
    7. writer.add_images("input",imgs,step)
    8. output = torch.reshape(output,(-1,3,30,30))
    9. writer.add_images("output",output,step)
    10. step = step + 1
    11. writer.close()

    694f99e0d142406eb2533339dfc1c329.png 72b8586a3155425bba970645f04f4085.png

     2、线性层函数——Linear()

    1. '''
    2. in_features: size of each input sample
    3. out_features: size of each output sample
    4. bias: If set to ``False``, the layer will not learn an additive bias. Default: ``True``
    5. '''

    加载数据集(略)

     建立线性网络模型

    1. class Diviner(nn.Module):
    2. def __init__(self):
    3. super(Diviner, self).__init__()
    4. self.linear1 = Linear(196608,10)
    5. def forward(self,input):
    6. output = self.linear1(input)
    7. return output

    3、最大池化函数——maxpooling()

     加载数据集(略)

     建立最大池化层网络模型

    1. class Diviner(nn.Module):
    2. def __init__(self):
    3. super(Diviner, self).__init__()
    4. self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)
    5. def forward(self,input):
    6. output = self.maxpool1(input)
    7. return output

     实例化网络模型,并将池化后得到的图片在tensorboard中展示 

    1. writer = SummaryWriter("maxpooling")
    2. step = 0
    3. for data in dataloader:
    4. imgs,targets = data
    5. output = diviner(imgs)
    6. writer.add_images("input", imgs, step)
    7. writer.add_images("output",output,step)
    8. step = step + 1
    9. writer.close()

     d5e6cacfc26c43549be0e347d456bbee.png8db187777305456e9df6fe8db1609d14.png

    4、激活函数——sigmoid()、relu()

      加载数据集(略)

     建立激活函数网络模型

    1. class Diviner(nn.Module):
    2. def __init__(self):
    3. super(Diviner, self).__init__()
    4. self.relu1 = ReLU()
    5. self.sigmoid1 = Sigmoid()
    6. def forward(self, input):
    7. output = self.sigmoid1(input)
    8. return output

      实例化网络模型,并将激活后得到的图片在tensorboard中展示 

    1. diviner = Diviner()
    2. step = 0
    3. writer = SummaryWriter("relu")
    4. for data in dataloader:
    5. imgs,targets = data
    6. output = diviner(imgs)
    7. writer.add_images("relu",output,step)
    8. step = step + 1
    9. writer.close()

    652f1b771f474cc8b13ae8603efff1c0.png

     5、损失函数——loss()

      加载数据集(略)

     建立一个网络模型

    1. class Diviner(nn.Module):
    2. def __init__(self):
    3. super(Diviner, self).__init__()
    4. self.modle1 = Sequential(
    5. Conv2d(3, 32, (5, 5), padding=2),
    6. MaxPool2d(2),
    7. Conv2d(32, 32, (5, 5), padding=2),
    8. MaxPool2d(2),
    9. Conv2d(32, 64, (5, 5), padding=2),
    10. MaxPool2d(2),
    11. Flatten(),
    12. Linear(1024, 64),
    13. Linear(64, 10)
    14. )
    15. def forward(self,x):
    16. x = self.modle1(x)
    17. return x

    实例化网络模型,定义损失函数和优化器(反向传播) 

    1. diviner = Diviner()
    2. loss = nn.CrossEntropyLoss()
    3. optim = torch.optim.SGD(diviner.parameters(),lr=0.05)

    我们进行迭代,并记录损失值 

    1. for epoch in range(20):
    2. running_loss = 0.0
    3. for data in dataloader:
    4. imgs,targets = data
    5. outputs =diviner(imgs)
    6. result_loss = loss(outputs,targets)
    7. optim.zero_grad()
    8. result_loss.backward()
    9. optim.step()
    10. running_loss += result_loss
    11. print(running_loss)

    6、使用GPU进行完整模型训练

    1. import torch
    2. import torchvision
    3. #准备数据集
    4. from torch import nn
    5. from torch.utils.data import DataLoader
    6. from torch.utils.tensorboard import SummaryWriter
    7. train_data = torchvision.datasets.CIFAR10(root="./train_dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True)
    8. test_data = torchvision.datasets.CIFAR10(root="./train_dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
    9. train_data_size = len(train_data)
    10. test_data_size = len(test_data)
    11. print("训练数据库的长度{}".format(train_data_size))
    12. print("测试数据库的长度{}".format(test_data_size))
    13. #利用dataloader来加载数据集
    14. train_dataloader = DataLoader(train_data,batch_size=64)
    15. test_dataloader = DataLoader(test_data,batch_size=64)
    16. #创建网络模型
    17. class Diviner(nn.Module):
    18. def __init__(self):
    19. super(Diviner, self).__init__()
    20. self.model = nn.Sequential(
    21. nn.Conv2d(3, 32, (5, 5), (1, 1), 2),
    22. nn.MaxPool2d(2),
    23. nn.Conv2d(32, 32, (5, 5), (1, 1), 2),
    24. nn.MaxPool2d(2),
    25. nn.Conv2d(32, 64, (5, 5), (1, 1), 2),
    26. nn.MaxPool2d(2),
    27. nn.Flatten(),
    28. nn.Linear(64 * 4 * 4, 64),
    29. nn.Linear(64, 10)
    30. )
    31. def forward(self, input):
    32. x = self.model(input)
    33. return x
    34. diviner = Diviner()
    35. diviner = diviner.cuda() #模型
    36. #损失函数
    37. loss_fn = nn.CrossEntropyLoss()
    38. loss_fn = loss_fn.cuda() #损失函数
    39. #优化器
    40. learn_rate = 0.01
    41. optimizer = torch.optim.SGD(diviner.parameters(),lr=learn_rate)
    42. #设置训练网络的一些参数
    43. #记录训练的次数
    44. total_train_step = 0
    45. #记录测试的次数
    46. total_test_step = 0
    47. #训练的轮次
    48. epoch = 10
    49. writer = SummaryWriter("train")
    50. for i in range(epoch):
    51. print("-------第{}轮训练开始了-------".format(i+1))
    52. #训练步骤开始:
    53. diviner.train() #非必要,在特定层
    54. for data in train_dataloader:
    55. imgs,targets = data
    56. #数据
    57. imgs = imgs.cuda()
    58. targets = targets.cuda()
    59. outputs = diviner(imgs)
    60. loss = loss_fn(outputs,targets)
    61. #优化器模型
    62. optimizer.zero_grad()
    63. loss.backward()
    64. optimizer.step()
    65. total_train_step += 1
    66. if(total_train_step%100 == 0):
    67. print("训练次数:{},loss:{}".format(total_train_step,loss))
    68. writer.add_scalar("train_loss",loss.item(),total_train_step)
    69. #测试步骤开始:
    70. diviner.eval() #非必要 在特定层
    71. total_test_loss = 0
    72. total_accuracy = 0
    73. with torch.no_grad():
    74. for data in test_dataloader:
    75. imgs,targets = data
    76. imgs = imgs.cuda()
    77. targets = targets.cuda()
    78. outputs = diviner(imgs)
    79. loss = loss_fn(outputs,targets)
    80. total_test_loss += loss
    81. accuracy = (outputs.argmax(1) == targets).sum()
    82. total_accuracy += accuracy
    83. print("整体测试集上的loss:{}".format(total_test_loss))
    84. print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size))
    85. writer.add_scalar("test_loss",total_test_loss,total_test_step)
    86. writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step)
    87. total_test_step += 1
    88. #保存模型
    89. torch.save(diviner,"diviner_{}".format(i))
    90. writer.close()

    4fdff2e5e5e44777bf174e5796f5772f.png f7470e3737214c089cb643bedfb4c560.png

    最后一轮数据: 

    1. -------第10轮训练开始了-------
    2. 训练次数:7100,loss:1.2293018102645874
    3. 训练次数:7200,loss:0.9501622319221497
    4. 训练次数:7300,loss:1.0970317125320435
    5. 训练次数:7400,loss:0.8500756025314331
    6. 训练次数:7500,loss:1.195753812789917
    7. 训练次数:7600,loss:1.2974092960357666
    8. 训练次数:7700,loss:0.8670048117637634
    9. 训练次数:7800,loss:1.2882726192474365
    10. 整体测试集上的loss:197.17103576660156
    11. 整体测试集上的正确率:0.5577999949455261

     

     

  • 相关阅读:
    零代码编程:用ChatGPT批量调整文件名称中的词汇顺序
    计算机网络【CN】TCP报文段格式【20B】
    梯度下降算法(Gradient Descent)
    Unlikely argument type for equals(): SysUser seems to be unrelated to String
    linux vim用法
    【BOOST C++ 16 语言扩展】(4) Boost.Conversion
    LeetCode讲解篇之面试题 01.08. 零矩阵
    Java 文件 & 文件操作
    系统架构设计:3 软件架构建模技术与应用
    13-网络篇-局域网与外网通信
  • 原文地址:https://blog.csdn.net/qq_47982709/article/details/132947628