php 卷积神经网络,卷积神经网络基础讲解

转载请注明出处

1什么是卷积神经网络(CNN)

1.1 什么是卷积操作

CNN中的卷积和数字信号处理中的卷积其实不是一回事,但有点类似。这里说的只是CNN中的卷积操作。

对图像(或者可以表示为同样结构的其他数据,如文本、语音等)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。

29a241edc756

(gif动图见附件)

备注:

一个很自然的想法,是filter的各个权重应该是多少?filter的size怎么取?

1.2 卷积神经网络的概念

CNN的概念最早来自于对“感受野”的研究。科学家对猫的视觉细胞研究发现,每一个视觉神经元只处理一小块区域的视觉图像。即感受野(receptive field)。

卷积神经网络(Convolutional Neural Networks)是一种在空间上共享参数的神经网络。通过共享参数,减少了参数的个数。卷积的图示

29a241edc756

备注:上图是以“图片”举例,所以depth是RGB三个维度。后面我们会说到CNN也可以处理文本。用卷积来处理文本分类的要点在于怎么把文本数据准备成CNN所需要的这种固定width和height的形式。

卷积神经网络简单讲就是把一个图片的数据传递给CNN,原涂层是由RGB组成,然后CNN把它的厚度加厚,长宽变小,每做一层都这样被拉长,最后形成一个分类器:

29a241edc756

CNN是首个成功进行多层训练的网络结构(Lecun的LeNet5),之所以CNN能够成为“第一个吃螃蟹”的网络,除了因为LeCun作为深度学习三巨头之一,“天生神力”,有一个不可忽视的因素或许是,CNN利用空间结构大大减少了参数量,提高了训练效率,避免了全连接网络(FCN, full connection Network)的参数过多不好训练、以及梯度弥散(gradient vanishment)的问题。

2CNN中的一些基本概念

卷积核

卷积核,英文名kernels,有时候也叫滤波器(filters )。卷积核是CNN的核心。从信号处理的角度而言,滤波器是对信号做频率筛选,这里主要是空间-频率的转换,cnn的训练就是找到最好的滤波器使得滤波后的信号更容易分类,还可以从模版匹配的角度看卷积,每个卷积核都可以看成一个特征模版,训练就是为了找到最适合分类的特征模版。

问题:卷积核的大小和初始值怎么取?

feature map

每一个卷积核滤波得到的图像就是一类特征的映射,也就是一个feature map

29a241edc756

LeNet5

每个卷积核作用于input可以得到一个feature map。

我们知道图片有RGB三个维度,这三个维度的处理是怎么样的?

Stride

Stride就是“移动切片的步长”,影响取样的数量。也就是表示做卷积时对input进行每次移动多少步。每一块抽取一部分信息,长宽就缩减,但是厚度(depth)增加。抽取的各个小块儿,再把它们合并起来,就变成一个压缩后的立方体。

厚度为什么增加?一定增加吗?

一般来说,后面的卷积层feature map数要比前面的feature map数多些

Padding

填充的方式有两种,“有效填充”和“相同填充”。在相同填充中,超出边界的部分使用补充0的办法,使得输入输出的尺寸相同。而在有效填充中,则不使用补充0的方法,不能超出边界。

以一维的填充为例:

29a241edc756

在图像的padding任务中,

29a241edc756

如图中紫色方框所示,左边是有效填充,右边是相同填充。在相同填充中,超出边界的部分使用补充0的办法,使得输入输出的图像尺寸相同。而在有效填充中,则不使用补充0的方法,不能超出边界,

思考问题:在一个CNN网络中,input层Layer A做了卷积以后变成Layer B,再做卷积变成Layer C。为了达到图中所示的A、B、C三个layer宽和高都一样大的效果,需要怎么设置padding和stride 两个参数。

29a241edc756

29a241edc756

29a241edc756

[很显然,需要stride=1, padding设置成

Pooling(池化层)

就是当跨步比较大的时候,它会漏掉一些重要的信息,为了解决这样的问题,就加上一层叫pooling,事先把这些必要的信息存储起来,然后再变成压缩后的层。最常见的就是mean-pooling和max-pooling。

Pooling层可以理解为一种特殊的卷积层。

Pooling层的作用:

1). invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)[详见附录“POOLing的三个不变性的形象化解释”

2. 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力

3).获得定长输出。(文本分类的时候输入是不定长的,可以通过池化获得定长输出)

4).防止过拟合或有可能会带来欠拟合。

patch

一个局部切片。

参考:

29a241edc756

感受野的理解

输出feature map某个节点的响应对应的输入图像的区域就是感受野

拿一个例子来算算

29a241edc756

pool3的一个输出对应pool3的输入大小为2*2  如果padding=valid

pool3: 2*2 conv4: 4*4 conv3: 6*6 pool2:12*12 conv2:14*14 pool1:28*28 conv1:30*30

因此 pool3的感受野大小就是30*30

3 CNN处理图像分类问题的网络结构

在 RGB 这个层,每一次把一块核心抽出来,然后厚度加厚,长宽变小,形成分类器:

29a241edc756

29a241edc756

如果想要分成十类的话,那么就会有0到9这十个位置,这个数据属于哪一类就在哪个位置上是1,而在其它位置上为零。

CNN的结构,分析一张图片时,先放一个CNN的图层,再把这个图层进行一个pooling。这样可以比较好的保持信息,之后再加第二层的CNN和pooling。

导入一个图片之后,先是有它的RGB三个图层,然后把像素块缩小变厚。本来有三个厚度,然后把它变成八个厚度,它的长宽在不断的减小,最后把它们连接在一起。

下图是一个经典的CNN做图像分类的网络结构

29a241edc756

29a241edc756

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 PHP 版本的卷神经网络的实现代码: ```php class ConvolutionalNeuralNetwork { private $filters; private $bias; private $input_shape; private $output_shape; private $stride; private $padding; private $activation; function __construct($filters, $bias, $input_shape, $output_shape, $stride, $padding, $activation) { $this->filters = $filters; $this->bias = $bias; $this->input_shape = $input_shape; $this->output_shape = $output_shape; $this->stride = $stride; $this->padding = $padding; $this->activation = $activation; } function forward($input) { $output = array(); $input_rows = $this->input_shape[0]; $input_cols = $this->input_shape[1]; $filter_size = count($this->filters[0]); $output_rows = $this->output_shape[0]; $output_cols = $this->output_shape[1]; for ($i = 0; $i < $output_rows; $i++) { for ($j = 0; $j < $output_cols; $j++) { $sum = 0; for ($k = 0; $k < $filter_size; $k++) { for ($l = 0; $l < $filter_size; $l++) { $row_index = $i * $this->stride + $k - $this->padding; $col_index = $j * $this->stride + $l - $this->padding; if ($row_index >= 0 && $row_index < $input_rows && $col_index >= 0 && $col_index < $input_cols) { $sum += $input[$row_index][$col_index] * $this->filters[$k][$l]; } } } $sum += $this->bias; $output[$i][$j] = $this->activation($sum); } } return $output; } } ``` 这段代码实现了一个卷神经网络的前向传播,包括了卷核、偏置、输入形状、输出形状、步长、填充和激活函数等参数。通过调用 `forward` 方法,可以将输入数据传递给网络,并得到输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值