CNN卷积神经网络结构

卷积神经网络通常是由四部分组成:输入层、卷积层、下采样层、全连接层和输出层。典型的卷积神经网络中,开始的几层一般是卷积层和下采样层交替出现,靠近输出层的最后几层通常是全连接层,其结构如图2-4所示。一幅原始二维图像输入卷积神经网络网络进入卷积层后,将会被卷积核函数作用提取到输入图像的局部特征,这些局部特征一旦被提取之后,它们之间的位置关系也会随之确定下来。一个卷积核对应一种特征,对同一幅图像采用相同卷积核提取不同位置的相同特征构成一幅特征图,这方式称作卷积神经网的权值共享。通过增加卷积核个数,对输入图像同一位置提取不同的特征,由此构成不同的特征图,这些不同的特征图经过组合作为卷积层的输出。权值共享和下采样不仅减少了网络的参数个数,而且对输入数据具有一定的位移不变和缩放不变性。卷积层后接着是下采样层,下采样层对卷积层的特征图进行了子采样。卷积神经网络最末几层是全连接层,它将最后产生的特征图连接起来,调节输出节点数并得到分类结果。

 

卷积层

在一个卷积层中,上一层特征图(Feature Map)被一个可学习的卷积核进行卷积,组合这些卷积运算,把获得的结果输入到一个激活函数,最终得到一个输出特征图:

其中,为卷积层l的第j个特征图,为卷积层lj个通道的净激活,为选择的输入特征图的集合,f (·)为激活函数,通常为sigmoid和tanh函数,为第l-1层的第i个特征图与第l层的第j个特征图的卷积核,为第j个特征图的偏置,“*”是卷积操作。

下采样层

通过下采样操作,输入特征图的尺寸将变小,输出特征图的计算公式如下所示:

 

其中,是下采样层l的第j个通道的净激活,是下采样层l的第j个特征图的权重,为其对应的偏置。down (·)为下采样函数,采用滑动窗口方法将输入特征图划分为多个互相不重叠的n×n大小的图像块,接着再对每个图像块内的像素进行求和、均值或者最大值,这样输出特征图就缩小了n倍。

全连接层

全连接网络中,所有二维图像的特征图被拼接成一维向量输入到全连接网络中。全连接层l的输出可由如下公式计算得出:

 其中,为全连接层l的净激活,为全连接层的权值,为全连接层的偏置。

 

### CNN 卷积神经网络结构图架构可视化 对于希望了解或展示卷积神经网络(CNN)内部工作原理的研究人员和开发者来说,有多种资源可用于创建CNN的结构图并对其进行可视化。一个特别有用的在线工具是NN-SVG (http://alexlenail.me/NN-SVG/index.html),该平台允许用户生成包括但不限于卷积神经网络在内的各种类型的神经网络架构图像[^1]。 通过NN-SVG, 用户能够自定义不同参数来调整所要呈现出来的模型样式,比如层数、每层节点数量以及是否显示权重等细节信息。这不仅有助于直观地理解复杂网络的设计模式,而且还可以作为教学材料帮助初学者更好地掌握相关概念。 此外,在具体实现方面,如果想要更深入探究某一层级的具体行为,如观察经过每一层变换后的特征图变化情况,则可以采用激活可视化的方法。这种方法通常借助编程环境如MATLAB完成,它能有效揭示出各层滤波器捕捉到了哪些视觉特性[^2]。 最后值得注意的是,在整个CNN框架里,除了前面提到用于提取局部特性的卷积层外,还有负责最终决策判断任务的重要组成部分——全连接层(Fully Connected Layers, FCs)[^3]。这些FCs接收来自前序处理阶段产生的高级抽象表征,并将其转换成对应于类别标签的概率分布向量形式输出。 ```python import matplotlib.pyplot as plt from tensorflow.keras.models import Model def plot_activation_maps(model, input_image): layer_outputs = [layer.output for layer in model.layers[:8]] activation_model = Model(inputs=model.input, outputs=layer_outputs) activations = activation_model.predict(input_image) images_per_row = 16 for layer_name, layer_activation in zip([layer.name for layer in model.layers], activations): n_features = layer_activation.shape[-1] size = layer_activation.shape[1] n_cols = n_features // images_per_row display_grid = np.zeros((size * n_cols, images_per_row * size)) for col in range(n_cols): for row in range(images_per_row): channel_image = layer_activation[0,:, :,col*images_per_row +row ] channel_image -= channel_image.mean() channel_image /=channel_image.std() + 1e-5 channel_image *= 64 channel_image += 128 channel_image = np.clip(channel_image, 0, 255).astype('uint8') display_grid[col*size : (col+1)*size, row*size:(row+1)*size]=channel_image scale = 1./size plt.figure(figsize=(scale*display_grid.shape[1], scale*display_grid.shape[0])) plt.title(layer_name) plt.grid(False) plt.imshow(display_grid, aspect='auto', cmap='viridis') ``` 此代码片段展示了如何利用Python中的TensorFlow库获取指定中间层的激活值,并绘制相应的热力图以便分析各个通道上的响应强度差异。这对于研究者探索特定应用场景下的最佳实践非常有价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值