什么是卷积?

1、简单说来卷积就是混合两种信息的流程。
2、本质是一种数学运算。
举例说明:
比如我们要卷积一个图像,那么第一桶信息就是:三个矩阵(RGB三通道),其中每一个值都在0~255之间。
第二桶就是卷积核(kernel):单个浮点数矩阵,可以想象卷积核的大小和模式为一个搅拌图像的方法。卷积核输出的是一个修改后的图像。称为feature map。

一个公式:

某矩阵经过卷积后的尺寸大小:N=((W-F+2P)/S)+1

比如下面例子: 输入图片的大小为W:3232 卷积核大小F:55 padding P:00 步长S:11 得到的结果就是:N等于28 最终的结果是:162828 (16的来源就是卷积核16个,得到的是16个通道。)

  1. class LeNet(nn.Module):
  2. def __init__(self):
  3. super(LeNet, self).__init__()
  4. self.conv1=nn.Conv2d(3,16,5) #3表示输入层的深度(通道)。16表示采用16个卷积核。5表示卷积核的大小(5*5)
  5. self.pool1=nn.MaxPool2d(2,2) #经过下采样之后,矩阵的大小变为原来的一半(变成16*14*14)
  6. self.conv2=nn.Conv2d(16,32,5) #输入的深度已经变成了16,经过第一个卷积层,(32*10*10)
  7. self.pool2=nn.MaxPool2d(2,2) #再次经过下采样,可以得到(32*5*5)
  8. self.fc1=nn.Linear(32*5*5,120) #展开为一维向量,这里定义了三层全连接层。120是全连接层节点个数
  9. self.fc2=nn.Linear(120,84) #
  10. self.fc3=nn.Linear(84,10) #做一个具有是十类的分类任务,所以结果就是10
  11. def forward(self, x): #这里是正向传播的过程。
  12. x=F.relu(self.conv1(x)) #图片经过第一个卷积层,然后通过relu激活函数。
  13. x=self.pool1(x) #经过第一个池化层。
  14. x=F.relu(self.conv2(x)) #第二个卷积层。
  15. x=F.view(-1, 32*5*5) #经过view函数就自动展平,-1代表第一个维度。
  16. x=F.relu(self.fc1(x)) #经过一个全连接层
  17. x=F.relu(self.fc2(x)) #经过第二个全连接层
  18. x=self.fc3(x) #第三个全连接层,不需要softmax函数,已经内置。
  1. transform = transforms.Compose(
  2. [transform.ToTensor(),
  3. transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))]
  4. # 标准化是指:output=(input-0.5)/0.5
  5. # 反标准化是指:input=output*0.5+0.5=output/2+0.5
  6. )
  7. trainset = torchvision.datasets.CIFAR10(root=./data, train=True
  8. download=Flase, transform=transform)
  9. trainloader=torch.utils.data.Dataloader(trainset, batch_size=36,
  10. shuffle=True, num_workers=0)
  11. # windows 系统下,num_workers只能设置为0,其他系统可以考虑其他值
  12. # 叫做载入数据的线程数。
  13. testset = torchvision.datasets.CIFAR10(root=./data, train=False
  14. download=Flase, transform=transform)
  15. testloader=torch.utils.data.Dataloader(trainset, batch_size=10000,
  16. shuffle=True, num_workers=0)
  17. test_data_iter = iter(testloader) # 把数据集转换成一个可以迭代的迭代器。
  18. # 转换为迭代器的作用就是可以医用.next()函数
  19. # 找到下一批数据
  20. test_image, test_label=test_data_iter.next()
  21. classes=('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')
  22. # python语法,如果是圆括号括起来的话,里面的值是不可以改变的。下标从0开始。
  23. #查看下载的图片,需要用到两个包。一个是matplotlib.pyplot as plt,一般我们这样写
  24. #另一个就是numpy包,numpy as np
  25. def imshow(img):
  26. img=img/2+0.5
  27. npimg= img.numpy()
  28. plt.imshow(np,transpose(npimg,(1,2,0)))
  29. plt.show()
  30. imshow(torchvision.utils.make_grad(test_image))
  31. print(' ',join('%5s'% classes[test_label[j]] for j in range(4)))