CNN(卷积层convolutional layer,激励层activating layer,池化层pooling,全连接层fully connected)

本文深入探讨了卷积神经网络(CNN)的工作原理,包括其产生的背景、如何通过部分连接和权重共享进行高效的特征提取,以及卷积、激励层、池化层的作用。并详细解释了卷积核、激活图、max pooling和average pooling的概念。

CNN产生的原因:当使用全连接的神经网络时,因为相邻两层之间的神经元都是有边相连的,当输入层的特征纬度非常高时(譬如图片),全连接网络需要被训练的参数就会非常多(参数太多,训练缓慢),CNN可以通过训练少量的参数从而进行特征提取。


上图每一个边就代表一个需要训练的参数,可以直观的感受到需要训练的参数太多了。

CNN的优点:1.相邻两层神经元部分相连。2.且同一层神经元的w(权重)和b(偏移)是共享的。

卷积:用一个核(矩阵)和图片相乘,相当于进行低通道滤波,因此这个核也被称为滤波器。当对一个图进行卷积,在特定的曲线和周边区域,得到的值很高,在其他区域,值相对较低,因此卷积得到的结果也叫激活图。

为什么说CNN相邻两层神经元部分相连:因为上一层和下一层通过卷积核来连接,譬如一个2*2的卷积核,它和输入进行乘法得到下一层的一个神经元的值: 4-->1,因此在这个例子里,上层的四个神经元对应下层的一个神经元,所以叫相邻两层神经元部分相连。

为什么说CNN同一层神经元的权值共享:因为上层和下层仅仅通过卷积核来操作,一层神经元仅仅依赖于这个卷积核,没有其他需要依赖的参数,所以该层的权值就是这个卷积核的大小和步长。(换句话说,训练的就是这个卷积核)

feature map:将一个卷积核对输入数据进行扫描得到的下层神经元矩阵。

激励层:主要对卷积层的输出进行一个非线性映射,一般为ReLu函数。

使用ReLu时,应调小learning rate,防止出现很多梯度为零的神经元
如果不能解决learning rate的问题,就使用Leaky ReLu、PReLu来替代
不建议使用sigmoid函数,用tanh替代
池化层:当卷积核很小时,得到的feature map还是很大,可以通过池化层来进行降维操作,一般有两种方式:

max pooling:取池化视野中的最大值
Average pooling:取池化视野中的平均值
池化视野类似于卷积核的local receptive field



转自:https://blog.youkuaiyun.com/whyymlm/article/details/79739840 

可以使用多种工具来绘制典型卷积神经网络(包含输入层、卷积层、激活函数、池化层全连接层输出层)的图,以下分别介绍使用 `Graphviz` `PyTorchViz` 两种方式。 ### 使用 Graphviz `Graphviz` 是一个开源的图形可视化工具,`graphviz` 库可以在 Python 中方便地调用它。 ```python from graphviz import Digraph import matplotlib.pyplot as plt from PIL import Image # 创建一个有向图 dot = Digraph(comment='Convolutional Neural Network') # 设置分辨率 dot.attr(dpi='300') # 添加节点 dot.node('input', 'Input Layer') dot.node('conv', 'Convolutional Layer') dot.node('activation', 'Activation Function') dot.node('pooling', 'Pooling Layer') dot.node('fc', 'Fully Connected Layer') dot.node('output', 'Output Layer') # 添加边 dot.edge('input', 'conv') dot.edge('conv', 'activation') dot.edge('activation', 'pooling') dot.edge('pooling', 'fc') dot.edge('fc', 'output') # 渲染图形 img_path = 'cnn_graph' dot.render(img_path, format='png', cleanup=True, view=False) # 使用 matplotlib 显示图像 img = Image.open(f'{img_path}.png') plt.rcParams['figure.dpi'] = 300 plt.imshow(img) plt.axis('off') plt.show() ``` ### 使用 PyTorchViz `PyTorchViz` 可以根据 PyTorch 模型生成可视化图。 ```python import torch import torch.nn as nn from torchviz import make_dot # 定义一个简单的卷积神经网络模型 class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1) self.relu1 = nn.ReLU() self.pool1 = nn.MaxPool2d(2) self.fc1 = nn.Linear(16 * 16 * 16, 10) def forward(self, x): x = self.conv1(x) x = self.relu1(x) x = self.pool1(x) x = x.view(-1, 16 * 16 * 16) x = self.fc1(x) return x # 初始化模型 model = SimpleCNN() # 创建一个随机输入 x = torch.randn(1, 3, 32, 32) # 前向传播 y = model(x) # 生成可视化图 dot = make_dot(y, params=dict(model.named_parameters())) dot.render('simple_cnn', format='png', cleanup=True, view=False) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值