什么是卷积神经网络
卷积网络一般由卷积层、汇聚层和全连接层构成
和全连接网络对比来看,卷积层中的每个神经元都之和前一层中某个局部窗口内的神经元相连,构成一个局部连接网络
卷积层
卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器
卷积网络主要应用在图像处理上,图像是二维结构,因此为了更充分地利用图像的局部信息,通常将神经元组织委员三维结构的神经层,其规格为M * N * D,分别为长、宽和深度
假设一个卷积层的结构如下:
- 输入特征映射组(三维张量)
- 输出特征映射组(三维张量)
- 卷积核(四维张量)
计算过程如下:
汇聚层
也叫池化层,作用是进行特征选择,降低特征数量
常用的池化函数有两种:
构建基本的神经网络结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| depth = [4, 8] class ConvNet(nn.Module): def __init__(self): super(ConvNet, self).__init__() '''注意,定义组件并没有真正搭建这些组件,只是把基本建筑砖块先找好''' self.conv1 = nn.Conv2d(1, 4, 5, padding = 2) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(depth[0], depth[1], 5, padding = 2) self.fc1 = nn.Linear(image_size // 4 * image_size // 4 * depth[1] , 512) self.fc2 = nn.Linear(512, num_classes)
def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool(x) x = F.relu(self.conv2(x)) x = self.pool(x) x = x.view(-1, image_size // 4 * image_size // 4 * depth[1]) x = F.relu(self.fc1(x))
x = F.dropout(x, training=self.training) x = self.fc2(x) x = F.log_softmax(x, dim = 0) return x def retrieve_features(self, x): feature_map1 = F.relu(self.conv1(x)) x = self.pool(feature_map1) feature_map2 = F.relu(self.conv2(x)) return (feature_map1, feature_map2)
|