1、卷积神经网络(CNN)
卷积神经网络(Convolutional Neural Networks)被设计成通过多层阵列来处理数据。这种类型的神经网络用于图像识别或人脸识别等应用。
CNN与其他任何普通神经网络的主要区别在于,CNN将输入作为一个二维数组,直接对图像进行操作,而不是像其他神经网络那样专注于特征提取。
CNN的主导方法包括解决识别问题。像谷歌和Facebook这样的顶级公司已经投资了识别项目的研发项目,以更快地完成活动。
每个卷积神经网络包含三个基本思想:
- 局部感受野(Local respective fields)
- 卷积(Convolution)
- 池化(Pooling)
下面详细了解这些术语。
2、局部感受野(Local Respective Fields)
CNN利用了输入数据中存在的空间相关性。神经网络并发层中的每一层都连接着一些输入神经元。这个特殊的区域被称为局部接受区。它只关注隐藏的神经元。隐藏神经元将处理上述领域内的输入数据,而不实现特定边界外的变化。
下面提到了生成局部感受野(Local Respective Fields)的图表示:
3、卷积(Convolution)
在上图中,我们观察到每种连接,从一个层到另一层的移动,每个连接都学会了具有相关联的隐藏神经元的重量。 在这里,单个神经元从时刻执行偏移。 这个过程称为“卷积(Convolution)”。
从输入层到隐藏特征映射的连接的映射被定义为 “shared weights(参数共享)”,并且包括的偏差被称为“共享偏置(shared bias)”。
4、池化(Pooling)
卷积神经网络使用池化层,在CNN声明后立即定位。它将用户的输入作为特征图,生成卷积网络并生成压缩特征图。将层池化有助于用先前层的神经元创建层。
5、PyTorch的实现
以下步骤用于使用Pytorch创建卷积神经网络。
1)导入创建简单神经网络所需的包。
from torch.autograd import Variable
import torch.nn.functional as F
2)用卷积神经网络批量表示创建一个类。我们输入x的批形状尺寸为(3,32,32)。
class SimpleCNN(torch.nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
#Input channels = 3, output channels = 18
self.conv1 = torch.nn.Conv2d(3, 18, kernel_size = 3, stride = 1, padding = 1)
self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2, padding = 0)
#4608 input features, 64 output features (see sizing flow below)
self.fc1 = torch.nn.Linear(18 * 16 * 16, 64)
#64 input features, 10 output features for our 10 defined classes
self.fc2 = torch.nn.Linear(64, 10)
3)计算第一次卷积的激活大小从(3,32,32)到(18,32,32)。
尺寸的大小从(18,32,32)到(18,16,16)。重塑神经网络输入层的数据维数,使其大小从(18,16,16)变化为(1,4608)。
回想一下,-1从另一个给定的维度推断出这个维度。
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool(x)
x = x.view(-1, 18 * 16 *16)
x = F.relu(self.fc1(x))
#Computes the second fully connected layer (activation applied later)
#Size changes from (1, 64) to (1, 10)
x = self.fc2(x)
return(x)