当前位置:   article > 正文

pytorch——卷积神经网络_pytorch卷积神经网络

pytorch卷积神经网络

目录

一.课程内容

 二.代码复现

三.补充


一.课程内容

类似这种彩色图片就是多通道图片,如图:有三层(通常是红绿蓝)然后在这个基础上去除一小块像素块,开始遍历,得到的值包含所有像素的信息

例如上图的单通道的图片 卷积操作:是相应的区域做数乘,即对应位置相乘并相加。

 对于多通道,多通道有几层,那么卷积核就要有几个。多通道的计算方式就如图上。

 这样就把多通道变为了单通道,假设需要m通道输出,就需要m个(3*w*h)卷积核来计算。

对于特定的输出和输入,需要的卷积核的大小: 

n:通道数 k_sie:可以随意选择相应的大小  m:卷积核的数量    

 还可以使用填充,增加步长。

这里:存在数学关系

若图像为正方形:设输入图像尺寸为WxW,卷积核尺寸为FxF,步幅为S,Padding使用P(图片被填充了几圈),经过该卷积层后输出的图像尺寸为NxN:

N=\frac{W-F+2P}{S}+1

池化or下采样--减少数据

然后利用卷积和池化对minist处理。

 二.代码复现

  1. import torch
  2. in_c,out_c=5,10
  3. width,height=100,100
  4. k_size=3
  5. batch_size=1
  6. input=torch.randn(batch_size,in_c,width,height)
  7. #当我去掉batch_size时他从思维变成了三维的张量,说明batch_size对他进行了打包,当我把batch_size改为2时并没有发生变化,我不明白
  8. juanji=torch.nn.Conv2d(in_c,out_c,kernel_size=k_size)
  9. output=juanji(input)
  10. print(input.shape)
  11. print(output.shape)
  12. print(juanji.weight.shape)#卷积层权重的形状

另外两个就不写了,只是加了步长和扩充。

  1. import torch
  2. input=[3,4,6,5,2,4,6,8,1,6,7,8,9,7,4,6]
  3. input=torch.Tensor(input).view(1,1,4,4)
  4. maxpooling_layer=torch.nn.MaxPool2d(kernel_size=2)#相当于步长为2
  5. output=maxpooling_layer(input)
  6. print(output)
  1. from ast import Return
  2. from operator import itemgetter
  3. from pickletools import optimize
  4. from unittest import result
  5. from winreg import REG_FULL_RESOURCE_DESCRIPTOR
  6. from torchvision import transforms
  7. from torchvision import datasets
  8. from torch.utils.data import Dataset #抽象类,不能有实例化对象,只能被继承
  9. from torch.utils.data import DataLoader
  10. import numpy.matlib
  11. import torch
  12. import numpy as np
  13. import torch.optim as optim
  14. import torch.nn.functional as F
  15. import matplotlib.pyplot as plt
  16. batch_size=64
  17. transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081))])
  18. train_dataset = datasets.MNIST(root='../data/mnist',train=True, download=True, transform=transform)
  19. train_loader=DataLoader(train_dataset,shuffle=True,batch_size=batch_size)
  20. test_dataset=datasets.MNIST(root='../data/mnist',train=False, download=True, transform=transform)
  21. test_loader=DataLoader(test_dataset,shuffle=False,batch_size=batch_size)
  22. class Model(torch.nn.Module):
  23. def __init__(self) :
  24. super(Model,self).__init__()
  25. self.Conv1=torch.nn.Conv2d(1,10,kernel_size=5)
  26. self.Conv2=torch.nn.Conv2d(10,20,kernel_size=5)
  27. self.pooling=torch.nn.MaxPool2d(2)
  28. self.linear=torch.nn.Linear(320,10)
  29. def forward(self,x):
  30. batch_size=x.size(0)
  31. x=F.relu(self.pooling(self.Conv1(x)))
  32. x=F.relu(self.pooling(self.Conv2(x)))
  33. x=x.view(batch_size,-1)
  34. x=self.linear(x)
  35. return x
  36. model=Model()
  37. device=torch.device("cuda:0"if torch.cuda.is_available()else"cpu")#使用GPU进行计算
  38. model.to(device)#把model模型放进去
  39. sunshi=torch.nn.CrossEntropyLoss()
  40. youhua=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
  41. def train(epoch):
  42. running_loss=0.0
  43. for batch_idx, data in enumerate(train_loader,0):
  44. input,target=data
  45. input,target=input.to(device),target.to(device)#这里的数据(原数据)也要迁移过去
  46. output=model(input)
  47. loss=sunshi(output,target)
  48. loss.backward()
  49. youhua.step()
  50. youhua.zero_grad()
  51. running_loss+=loss.item()
  52. if batch_idx%300==299 :
  53. print('[%d,%5d]loss:%.3f'%(epoch+1,batch_idx+1,running_loss/300))
  54. running_loss=0.0
  55. corect=[]
  56. def test():
  57. correct=0
  58. total=0
  59. with torch.no_grad():
  60. for data in test_loader:
  61. image,labels=data
  62. image,labels=image.to(device),labels.to(device)
  63. output=model(image)
  64. _,predicted= torch.max(output.data,dim=1)
  65. total+=labels.size(0)
  66. correct+=(predicted==labels).sum().item()
  67. print("正确率:%d %%"%(100*correct/total))
  68. corect.append(100*correct/total)
  69. ep=[]
  70. if __name__=='__main__':
  71. for epoch in range(10):
  72. ep.append(epoch)
  73. train(epoch)
  74. test()
  75. plt.plot(ep,corect)
  76. plt.xlabel("epoch")
  77. plt.ylabel("正确率")
  78. plt.show()

 作业:

  1. class Model(torch.nn.Module):
  2. def __init__(self) :
  3. super(Model,self).__init__()
  4. self.Conv1=torch.nn.Conv2d(1,10,kernel_size=3)#经过变换,会输出10*26*26((28-3+0)/1+1)
  5. self.Conv2=torch.nn.Conv2d(10,20,kernel_size=2)
  6. self.Conv3=torch.nn.Conv2d(20,10,kernel_size=3)
  7. self.pooling=torch.nn.MaxPool2d(2)
  8. self.linear1=torch.nn.Linear(40,30)
  9. self.linear2=torch.nn.Linear(30,20)
  10. self.linear3=torch.nn.Linear(20,10)
  11. def forward(self,x):
  12. batch_size=x.size(0)
  13. x=F.relu(self.pooling(self.Conv1(x)))
  14. x=F.relu(self.pooling(self.Conv2(x)))
  15. x=F.relu(self.pooling(self.Conv3(x)))
  16. x=x.view(batch_size,-1)
  17. x=self.linear1(x)
  18. x=self.linear2(x)
  19. x=self.linear3(x)
  20. return x

三.补充

1.关于卷积池化

(54条消息) [CNN] 卷积、反卷积、池化、反池化_nana-li的博客-CSDN博客_奇数池化

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

闽ICP备14008679号