神经网络的基本结构

卷积层

  • Conv2d()函数:
  • in_channels : 输入数据通道数
  • out_channels : 输出数据通道数
  • kernel_size : 卷积核的大小
  • stride : 步长
  • padding : 填充大小
  • 示例代码:
  1. import torch
  2. import torchvision
  3. from torch.utils.data import DataLoader
  4. from torch import nn
  5. from torch.nn import Conv2d
  6. from torch.utils.tensorboard import SummaryWriter
  7. test_dataset = torchvision.datasets.CIFAR10(root="./download_data",
  8. train=False,transform=torchvision.transforms.ToTensor(),download=True)
  9. dataloader = DataLoader(test_dataset,batch_size=64)
  10. class SecondTime(nn.Module):
  11. def __init__(self):
  12. super().__init__()
  13. self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
  14. def forward(self,input):
  15. input = self.conv1(input)
  16. return input
  17. second = SecondTime()
  18. # print(second)
  19. writer = SummaryWriter("logs")
  20. step = 0
  21. for data in dataloader:
  22. img,label = data
  23. output = second(img)
  24. for i in range(10):
  25. output = torch.reshape(img, (-1,3,32,32)) # 第一个参数不知道该如何设置时可以设置为-1
  26. output =second(output)
  27. # img = torch.reshape(img,(-1,3,32,32))
  28. print(img.shape) # torch.Size([64, 3, 32, 32])
  29. writer.add_images("input",img,step)
  30. output = torch.reshape(img, (-1,3,32,32)) # 第一个参数不知道该如何设置时可以设置为-1
  31. print(output.shape) # torch.Size([64, 6, 30, 30])
  32. writer.add_images("output",output,step)
  33. # 因为conv2d中设置了不同的channel数,所以channel改变为6
  34. step+=1

池化层

  • 池化类似于卷积,也是输入图像后利用池化核进行矩阵运算
  • MaxPool2d
  • stride : 默认值等于池化核的大小,类似于步长
  • padding : 和卷积层一样
  • dilation : 具体GIF图演示:GIF图演示
  • 池化层的作用:保留数据的特征并且减少数据量,为了提高计算速度
    一个通俗的解释:视频的输入格式为1080p输出为720p就类似于一个池化过程,
    减少了数据量,加速了数据的传播
  • 示例代码:
  1. import torch
  2. import torchvision
  3. from torch import nn
  4. from torch.nn import modules, MaxPool2d
  5. from torch.utils.data import DataLoader
  6. from torch.utils.tensorboard import SummaryWriter
  7. test_dataset = torchvision.datasets.CIFAR10(root="./download_data",train=False,
  8. transform=torchvision.transforms.ToTensor(),download=True)
  9. dataloader = DataLoader(test_dataset,batch_size=64)
  10. input = torch.tensor([[1,2,0,3,1],
  11. [0,1,2,3,1],
  12. [1,2,1,0,0],
  13. [5,2,3,1,1],
  14. [2,1,0,1,1]],dtype=torch.float32) # 要加上float32类型,否则会报类型错误
  15. input = torch.reshape(input,(-1,1,5,5)) # channel=1,h=5,w=5
  16. print(input.shape)
  17. class max_pool(nn.Module):
  18. def __init__(self):
  19. super(max_pool,self).__init__()
  20. # self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)
  21. self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
  22. # ceil_mode 的用处自己去查
  23. def forward(self,input):
  24. output = self.maxpool1(input)
  25. return output
  26. test_pool = max_pool()
  27. # output = test_pool(input)
  28. # print(output)
  29. writer = SummaryWriter("logs")
  30. step = 0
  31. for data in dataloader:
  32. img,label = data
  33. # img = torch.reshape(img,(-1,1,32,32))
  34. writer.add_images("pool",img,step)
  35. output = test_pool(img)
  36. writer.add_images("pool_after",output,step)
  37. # 可以看到输出效果,图片被马赛克处理了一般
  38. step += 1
  39. writer.close()

非线性激活

ReLU(inplace = bool)

  • inplace=True时,不对原变量进行替换,直接更改原变量的值
  • inplace=False时,对原变量进行替换,生成一个新的变量
  • ReLU示例代码:
  1. import torch
  2. from torch import nn
  3. from torch.nn import ReLU
  4. input = torch.tensor([[1,-0.5],
  5. [-1,3]])
  6. input = torch.reshape(input,(-1,1,2,2))
  7. print(input)
  8. class nn_relu(nn.ReLU):
  9. def __init__(self):
  10. super(nn_relu,self).__init__()
  11. self.relu = ReLU(inplace=True)
  12. def forward(self,input):
  13. input = self.relu(input)
  14. return input
  15. nn = nn_relu()
  16. output = nn(input)
  17. print(output)

Sigmoid()

  • 无参数
  • 示例代码:
  1. import torch
  2. import torchvision
  3. from torch import nn
  4. from torch.nn import ReLU, Sigmoid
  5. from torch.utils.data import DataLoader
  6. from torch.utils.tensorboard import SummaryWriter
  7. '''
  8. input = torch.tensor([[1,-0.5],
  9. [-1,3]])
  10. input = torch.reshape(input,(-1,1,2,2))
  11. print(input)
  12. '''
  13. test_dataset = torchvision.datasets.CIFAR10(root="./download_data",train=False,
  14. transform=torchvision.transforms.ToTensor(),download=True)
  15. dataloader = DataLoader(test_dataset,batch_size=64)
  16. class nn_relu(nn.ReLU):
  17. def __init__(self):
  18. super(nn_relu,self).__init__()
  19. self.relu = ReLU(inplace=True)
  20. self.sigmoid = Sigmoid()
  21. def forward(self,input):
  22. # input = self.relu(input)
  23. input = self.sigmoid(input)
  24. return input
  25. nn = nn_relu()
  26. writer = SummaryWriter("logs")
  27. step = 0
  28. for data in dataloader:
  29. img,label = data
  30. img = torch.reshape(img,(-1,3,32,32))
  31. writer.add_images("sigmoid",img,step)
  32. output = nn(img)
  33. writer.add_images("sigmoid2",output,step)
  34. # 注意是images
  35. # 显示效果为:图片整体颜色变灰色
  36. step += 1
  37. writer.close()

线性层LinearLayers

  • 线性变化,简单的形容就是把一个矩阵拉长成一条线

7_3.jpg

  • torch.flatten(img) : 把一个矩阵摊平
  • 示例代码:
  1. import torch
  2. import torchvision
  3. from torch import nn
  4. from torch.nn import ReLU, Sigmoid, Linear
  5. from torch.utils.data import DataLoader
  6. from torch.utils.tensorboard import SummaryWriter
  7. test_dataset = torchvision.datasets.CIFAR10(root="./download_data",train=False,
  8. transform=torchvision.transforms.ToTensor(),download=True)
  9. dataloader = DataLoader(test_dataset,batch_size=64)
  10. class linear(nn.Module):
  11. def __init__(self):
  12. super(linear,self).__init__()
  13. self.linear = Linear(196608,10)
  14. def forward(self,input):
  15. input = self.linear(input)
  16. return input
  17. l = linear()
  18. for data in dataloader:
  19. img,label = data
  20. print(img.shape)
  21. # img = torch.reshape(img,(1,1,1,-1))
  22. output = torch.flatten(img)
  23. print(output.shape)
  24. output = l(output)
  25. print(output.shape)
  26. '''
  27. 运行结果:
  28. torch.Size([64, 3, 32, 32])
  29. torch.Size([196608])
  30. torch.Size([10])
  31. 图片最后被拉平为10
  32. '''

Sequential 结合实战

  • 可以简化代码:
  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 Liucy(nn.Module):
  6. def __init__(self):
  7. super(Liucy,self).__init__()
  8. '''
  9. self.conv = Conv2d(3,32,5,padding=2)
  10. self.max_pool = MaxPool2d(2)
  11. self.conv2 = Conv2d(32,32,5,padding=2)
  12. self.max_pool2 = MaxPool2d(2)
  13. self.conv3 = Conv2d(64,32,5,padding=2)
  14. self.max_pool3 = MaxPool2d(2)
  15. self.flatten = Flatten()
  16. self.linear1 = Linear(1024,64)
  17. self.linear2 = Linear(64,10)
  18. '''
  19. self.modle = Sequential(
  20. Conv2d(3, 32, 5, padding=2),
  21. MaxPool2d(2),
  22. Conv2d(32, 32, 5, padding=2),
  23. MaxPool2d(2),
  24. Conv2d(32, 64, 5, padding=2),
  25. MaxPool2d(2),
  26. Flatten(),
  27. Linear(1024, 64),
  28. Linear(64, 10)
  29. )
  30. def forward(self,x):
  31. '''
  32. x = self.conv(x)
  33. x = self.max_pool(x)
  34. x = self.conv2(x)
  35. x = self.max_pool2(x)
  36. x = self.conv3(x)
  37. x = self.max_pool3(x)
  38. x = self.flatten(x)
  39. x = self.linear1(x)
  40. x = self.linear2(x)
  41. '''
  42. x = self.modle(x)
  43. return x
  44. liu = Liucy()
  45. print(liu)
  46. x = torch.ones((64,3,32,32))
  47. output = liu(x)
  48. print(output.shape)
  49. writer = SummaryWriter("logs")
  50. writer.add_graph(liu,x)
  51. writer.close()