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