卷积神经网络
说明
- 卷积神经网络就是特征提取器,前一部分叫Feature Extraction,后一部分叫classification。
- 卷积神经网络的过程是:卷积(线性变换,提取出重要的特征)、激活函数(非线性变换)、池化(对提取的特征进行压缩);这个过程经过若干次后,用view打平成一维向量,然后送入全连接层。
import torch
#输入的通道数为5,输出通道数为10
in_channels,out_channels=5,10
#图片大小为100*100
width,height=100,100
#卷积核的大小为3*3
kernel_size=3
#一批
batch_size=1
#构造输入特征
#构造一个通道数为5,大小为100*100的数据
input=torch.randn(batch_size,
in_channels,
width,
height
)
#构造卷积层
conv_layer=torch.nn.Conv2d(
in_channels,
out_channels,
kernel_size=kernel_size
)
output=conv_layer(input)
#输入特征维度为1*5*100*100
print(input.shape)
#输入特征维度为1*10*98*98
print(output.shape)
#
print(conv_layer.weight.shape)
最大池化
import torch
input=[1,2,3,4,
5,6,7,8,
8,9,7,4,
5,7,3,7]
#输入数据要转化为张量类型且卷积层要求输入输出是四维张量,1批1通道的4*4的数据
input=torch.Tensor(input).view(1,1,4,4)
#最大池化,池化面积为2*2
maxpooling_layer=torch.nn.MaxPool2d(kernel_size=2)
output=maxpooling_layer(input)
print(output)
如下图所示将一个12828维度的图片输入卷积神经网络,经过1055卷积层卷积后,维度变为102424,在经过22池化层的最大池化,维度变成1012*12,再经过一次卷积和池化,最后压缩成一维向量
class Net(torch.nn.Model):
def __init__(self):
super(Net,self).__init__()
self.conv1=torch.nn.Conv2d(1,10,kernel_size=5)
self.conv2=torch.nn.Conv2d(10,20,kernel_size=5)
self.pooling=torch.nn.MaxPool2d(2)
self.fc=torch.nn.Linear(320,10)
def forward(self,x):
#Flatten data from (n,1,28,28) to (n,784)
batch_size=x.size(0)
x=F.relu(self.pooling(self.conv1(x)))
x=F.relu(self.pooling(self.conv2(x)))
x=x.view(batch_size,-1)#Flatten
x=self.fc(x)
return x
model=Net()