什么是卷积?
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) #做一个具有是十类的分类任务,所以结果就是10
def 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=True
download=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=False
download=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 np
def imshow(img):
img=img/2+0.5
npimg= 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)))