当前位置:   article > 正文

pytorch小土堆_小土堆pytorch

小土堆pytorch

深度学习代码

一、数据集部分

Dataset、DataLoader、transforms、SummaryWriter

二、建模部分

torch.nn包:Linear()、Conv2d()、MaxPool2d() 、Sigmoid()、ReLU()、BatchNorm2d()、Flatten()、Sequential()

三、前向传播、反向传播部分

损失器、优化器

训练:前向、反向、训练

  1. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
  2. Sequential(
  3. Conv2d(3, 32, 5, padding=2),#输入通道、输出通道、卷积核、padding
  4. MaxPool2d(2),#池化
  5. Conv2d(32, 32, 5, padding=2),
  6. MaxPool2d(2),
  7. Conv2d(32, 64, 5, padding=2),
  8. MaxPool2d(2),
  9. Flatten(),#展平
  10. Linear(1024, 64),#输入特征、输出特征
  11. Linear(64, 10)
  12. )

数据集

一、dir()与help()

dir()函数与help()函数
dir() 查看包里有什么
help() 查看怎么使用     help(Dataset)
Dataset??    查看怎么使用 
ctrl按住类查看
![在这里插入图片描述](https://img-blog.csdnimg.cn/c96ab9c59d4c4c43b789283a88ce9d61.png)

二、python文件、控制台、jupyter区别

 三、Dataset与DataLoader类

Dataset

1.创建一个myData类,继承Dataset类
2.重要函数
(1)初始化函数__init__():得到所有样本以及标签
(2)获取样本对函数__getitem__():获取样本对,模型直接通过这一函数获得一对样本对{x:y}

(3)返回数据集长度__len__()

3.路径函数
(1)os.path.join()将多个路径拼接
(2)os.listdir()将路径下的所有文件名组成一个列表
```

4.Dataset对象相加,即可使得多个数据集拼接;Dataset对象中可以使用root_dir和label_dir找到同标签的所有数据集

DataLoader

test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)

#writer.add_images可以一幅图输出多张图片

  1. import torchvision
  2. # 准备的测试数据集
  3. from torch.utils.data import DataLoader
  4. from torch.utils.tensorboard import SummaryWriter
  5. test_data = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor())
  6. test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)
  7. # 测试数据集中第一张图片及target
  8. img, target = test_data[0]
  9. print(img.shape)
  10. print(target)
  11. writer = SummaryWriter("dataloader")
  12. for epoch in range(2):
  13. step = 0
  14. for data in test_loader:
  15. imgs, targets = data
  16. # print(imgs.shape)
  17. # print(targets)
  18. writer.add_images("Epoch: {}".format(epoch), imgs, step)
  19. step = step + 1
  20. writer.close()


四、tensorboard

1.SummaryWriter类

能够绘制train_loss的图像,保存在logs文件夹里

(1)代码:

  1. #coding=utf-8
  2. '''
  3. 1.SummaryWriter类
  4. writer=SummaryWriter("logs") #logs指的是文件夹
  5. writer.add_scalar("y=2x", 2*i, i) #图像名,描点连直线画图
  6. writer.add_image("train", img_array, 1, dataformats='HWC') #train是图像名;img_array必须是numpy或者tensor型;1指的是step,把step改成2再次运行后,train图像可以左右拖动
  7. '''
  8. from torch.utils.tensorboard import SummaryWriter
  9. import numpy as np
  10. from PIL import Image
  11. writer = SummaryWriter("logs")
  12. image_path = "../hymenoptera_data/train/bees/205835650_e6f2614bee.jpg"
  13. image_path1 = "../hymenoptera_data/train/ants/0013035.jpg"
  14. img_PIL = Image.open(image_path)
  15. img_array = np.array(img_PIL)
  16. print(type(img_array))
  17. print(img_array.shape)#可以看出是(H,W,C)型
  18. img_PIL1 = Image.open(image_path1)
  19. img_array1 = np.array(img_PIL1)
  20. #
  21. #logs文件夹中保存训练的数据集
  22. writer.add_image("train", img_array, 1, dataformats='HWC')
  23. writer.add_image("train", img_array1, 2, dataformats='HWC')
  24. #logs文件中保存画图信息
  25. # y = 2x
  26. for i in range(100):
  27. writer.add_scalar("y=2x", 2*i, i)#"y=2x"对应一副图像,再来一次不改变""里图像名的话会在原图像上画,线会叠加
  28. writer.close()

 (2)同路径的终端下输入(其中port是指定服务器,默认是6006,若冲突则更换):

tensorboard --logdir=logs --port=6007

点击后显示:

2.__call__函数可以使得对象当函数用

 注意

 五、tranforms

 1.transforms用法

 2.ToTensor()使用

  1. T=transforms.ToTensor()  #创建一个对象
  2. input_tensor=T(input)#将numpy转化为tensor对象,将hwc转为chw

3.Normalize()使用

标准化,将像素值映射到-1到1之间

4.Resize()使用

改变图像大小,输入的是PIL或者tensor,输入与输出格式对应

5.Compose()使用

 将多个操作组合在一起,注意前面对象的输出一定要对应后面对象的输入

transform = transforms.Compose([transforms.Resize(400), transforms.ToTensor()])

建模

一、torch.nn包

二、torch.nn.Module类 

1.任何模型需要继承Module类,并且实现__init__()以及forward()

2.调试代码

三、torch.nn.Cov2d()函数

1.卷积:对于3通道图像,卷积核通道数必须等于图像通道数

最原始的图像数据类型应该是BCHW类型的数据,卷积操作不改变B

 input=torch.reshape(input,(1,1,2,2))#将input转化为BCHW类型,作为输入层

所以计算CWH变化时,先对一个样本进行计算

conv1 = torch.nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)

四、torch.nn.MaxPool2d()函数——下采样,即池化

最大池化的目的是保留原始数据特征情况下,减小数据量

maxpool1 = torch.nn.MaxPool2d(kernel_size=3, ceil_mode=False)

五、非线性激活函数

  1. 1.torch.nn.Sigmoid()
  2. 2.torch.nn.ReLU()

六、正则化层——可以加快网络训练速度

  1. m=torch.nn.BatchNorm2d(100,affine=False)#正则化对象
  2. input=torch.randn(20,100,35,45)#BCHW类型数据
  3. output=m(input)#将input正则化

七、线性层

  1. torch.nn.Flatten(img)#将张量展平为一维的
  2. linear1=torch.nn.Linear(in_features,out_features)#线性层改变特征数量

八、Sequential函数

1.简单的网络结构

  1. import torch
  2. from torch import nn
  3. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
  4. from torch.utils.tensorboard import SummaryWriter
  5. class Tudui(nn.Module):
  6. def __init__(self):
  7. super(Tudui, self).__init__()
  8. self.model1 = Sequential(
  9. Conv2d(3, 32, 5, padding=2),
  10. MaxPool2d(2),
  11. Conv2d(32, 32, 5, padding=2),
  12. MaxPool2d(2),
  13. Conv2d(32, 64, 5, padding=2),
  14. MaxPool2d(2),
  15. Flatten(),
  16. Linear(1024, 64),
  17. Linear(64, 10)
  18. )
  19. def forward(self, x):
  20. x = self.model1(x)
  21. return x
  22. tudui = Tudui()#生成一个模型对象
  23. input = torch.ones((64, 3, 32, 32))#输入数据,必须是(B,C,H,W)类型
  24. output = tudui(input)
  25. print(output.shape)
  26. #可视化构造图
  27. writer = SummaryWriter("../logs_seq")
  28. writer.add_graph(tudui, input)
  29. writer.close()

模型可视化结果:

前向传播与反向传播

一、前向传播求得y_hat以及loss

  1. #损失器对象
  2. loss = L1Loss(reduction='sum')
  3. loss_mse = nn.MSELoss()
  4. loss_cross = nn.CrossEntropyLoss()#交叉熵
  5. #计算损失
  6. l=loss(y,y_hat)

二、反向传播

loss.backward()#求解计算图内所有的梯度

三、优化器——梯度置0,梯度更新

四、训练

  1. import torch
  2. import torchvision
  3. from torch import nn
  4. from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
  5. from torch.optim.lr_scheduler import StepLR
  6. from torch.utils.data import DataLoader
  7. dataset = torchvision.datasets.CIFAR10("../data", train=False, transform=torchvision.transforms.ToTensor(),
  8. download=True)
  9. dataloader = DataLoader(dataset, batch_size=1)
  10. class Tudui(nn.Module):
  11. def __init__(self):
  12. super(Tudui, self).__init__()
  13. self.model1 = Sequential(
  14. Conv2d(3, 32, 5, padding=2),
  15. MaxPool2d(2),
  16. Conv2d(32, 32, 5, padding=2),
  17. MaxPool2d(2),
  18. Conv2d(32, 64, 5, padding=2),
  19. MaxPool2d(2),
  20. Flatten(),
  21. Linear(1024, 64),
  22. Linear(64, 10)
  23. )
  24. def forward(self, x):
  25. x = self.model1(x)
  26. return x
  27. loss = nn.CrossEntropyLoss()
  28. tudui = Tudui()
  29. optim = torch.optim.SGD(tudui.parameters(), lr=0.01)
  30. for epoch in range(20):
  31. running_loss = 0.0
  32. for data in dataloader:
  33. imgs, targets = data
  34. outputs = tudui(imgs)
  35. result_loss = loss(outputs, targets)
  36. optim.zero_grad()
  37. result_loss.backward()
  38. optim.step()
  39. running_loss = running_loss + result_loss
  40. print(running_loss)

现有模型的使用、修改、保存、加载

一、添加与修改

 二、保存

  1. vgg16 = torchvision.models.vgg16(pretrained=False)
  2. # 保存方式1,模型结构+模型参数
  3. torch.save(vgg16, "vgg16_method1.pth")
  4. # 保存方式2,模型参数(官方推荐)
  5. torch.save(vgg16.state_dict(), "vgg16_method2.pth")

三、加载

  1. #方式1加载模型
  2. model = torch.load('tudui_method1.pth')
  3. print(model)
  4. #方式2
  5. vgg16 = torchvision.models.vgg16(pretrained=False)
  6. vgg16.load_state_dict(torch.load("vgg16_method2.pth"))
  7. print(vgg16)

完整的模型训练、测试

  1. # -*- coding: utf-8 -*-
  2. import torchvision
  3. from torch.utils.tensorboard import SummaryWriter
  4. from model import *
  5. # 准备数据集
  6. from torch import nn
  7. from torch.utils.data import DataLoader
  8. train_data = torchvision.datasets.CIFAR10(root="../data", train=True, transform=torchvision.transforms.ToTensor(),
  9. download=True)
  10. test_data = torchvision.datasets.CIFAR10(root="../data", train=False, transform=torchvision.transforms.ToTensor(),
  11. download=True)
  12. # length 长度
  13. train_data_size = len(train_data)
  14. test_data_size = len(test_data)
  15. # 如果train_data_size=10, 训练数据集的长度为:10
  16. print("训练数据集的长度为:{}".format(train_data_size))
  17. print("测试数据集的长度为:{}".format(test_data_size))
  18. # 利用 DataLoader 来加载数据集
  19. train_dataloader = DataLoader(train_data, batch_size=64)
  20. test_dataloader = DataLoader(test_data, batch_size=64)
  21. # 创建网络模型
  22. tudui = Tudui()
  23. # 损失函数
  24. loss_fn = nn.CrossEntropyLoss()
  25. # 优化器
  26. # learning_rate = 0.01
  27. # 1e-2=1 x (10)^(-2) = 1 /100 = 0.01
  28. learning_rate = 1e-2
  29. optimizer = torch.optim.SGD(tudui.parameters(), lr=learning_rate)
  30. # 设置训练网络的一些参数
  31. # 记录训练的次数
  32. total_train_step = 0
  33. # 记录测试的次数
  34. total_test_step = 0
  35. # 训练的轮数
  36. epoch = 10
  37. # 添加tensorboard
  38. writer = SummaryWriter("../logs_train")
  39. for i in range(epoch):
  40. print("-------第 {} 轮训练开始-------".format(i+1))
  41. # 训练步骤开始
  42. tudui.train()
  43. for data in train_dataloader:
  44. imgs, targets = data
  45. outputs = tudui(imgs)
  46. loss = loss_fn(outputs, targets)
  47. # 优化器优化模型
  48. optimizer.zero_grad()
  49. loss.backward()
  50. optimizer.step()
  51. total_train_step = total_train_step + 1
  52. if total_train_step % 100 == 0:
  53. print("训练次数:{}, Loss: {}".format(total_train_step, loss.item()))
  54. writer.add_scalar("train_loss", loss.item(), total_train_step)
  55. # 测试步骤开始
  56. tudui.eval()
  57. total_test_loss = 0
  58. total_accuracy = 0
  59. with torch.no_grad():
  60. for data in test_dataloader:
  61. imgs, targets = data
  62. outputs = tudui(imgs)
  63. loss = loss_fn(outputs, targets)
  64. total_test_loss = total_test_loss + loss.item()
  65. accuracy = (outputs.argmax(1) == targets).sum()
  66. total_accuracy = total_accuracy + accuracy
  67. print("整体测试集上的Loss: {}".format(total_test_loss))
  68. print("整体测试集上的正确率: {}".format(total_accuracy/test_data_size))
  69. writer.add_scalar("test_loss", total_test_loss, total_test_step)
  70. writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step)
  71. total_test_step = total_test_step + 1
  72. torch.save(tudui, "tudui_{}.pth".format(i))
  73. print("模型已保存")
  74. writer.close()

  使用GPU训练

1.

2.方式1

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

3.方式2

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

 4.gpu训练保存的模型在cpu上跑

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/51845
推荐阅读
相关标签
  

闽ICP备14008679号