我研究了Keras的Conv2D(二维卷积层)


你想做的事

  • 我想了解Keras Conv2D
  • 我想了解下面的代码(我想能够解释每个函数在做什么?以及参数的含义)。
1
2
3
from keras import layers, models
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3)))

  • 而且我想在python中实现图像分类模型(例如能够区分狗图片和猫图片)

您可以阅读和理解本文的内容

  • 您可以大致理解"什么是卷积?"
  • 您可以大致理解"如何确定要传递给Keras Conv2D函数的参数的值?"。
  • 了解"内核","过滤器"和"跨步"的??含义。

什么是Conv2D?

如果搜索" keras Conv2D",则会找到" 2D卷积层"。
那么什么是"二维卷积层"?
还有术语"一维卷积神经网络"。
因此,作为理解" 1D和2D有什么区别?"的前提?
有必要了解"卷积神经网络"和"卷积"。

什么是CNN?

卷积神经网络。

卷积:卷积
神经网络:神经网络

开始,CNN是一个"卷积神经网络"。

参考信息,以加深您对CNN的了解

https://www.atmarkit.co.jp/ait/articles/1804/23/news138.html
根据:

  • 谈到"图像的深度学习",这是一种称为CNN的主要方法。 CNN是卷积神经网络的缩写,它在神经网络中引入了一种称为"卷积"的操作。
  • 卷积是对称为核(或过滤器)的网格状数值数据的每个元素与与核大小相同的部分图像(称为窗口)的数值数据的乘积之和的计算。一种转换为一个数值的过程。通过将窗口一点一点地移动,该转换过程被转换为类似网格的数字数据(即张量)。

基本思维方式

首先,什么是"图像"?

jpg之类的图像文件的宽度和高度均具有固定的像素数。
例如,假设您有一张宽度为300px,高度为200px的照片。
如果一个像素用(正方形)表示
这张照片是300 x 200 = 60,000的阵列。
因此,如果width:5px和height:5px总共为25,则如下图所示。

image.png

对于黑白照片,

  • 每个均为黑色或白色
  • 黑色用表示(涂成黑色),白色用□表示(白色)。

如果是

,则"在白色背景上用黑色字符绘制x(x)"时,将如下图所示。

image.png

同样,如果它是加号(+),则

image.png

如果它是

和减号(-),则

image.png

如果它是

和等号(=),则

image.png

"通过专注于小部门来检查特性"的想法

白色背景上的黑色字母

image.png

对图像数据

"通过关注小部分来检查特征"会发生什么?
例如,请注意红色框和蓝色框所包围的部分。

image.png

此区域为

image.png

。换句话说,可以看出"红色框部分和蓝色框部分具有相同的特性"。
其中

image.png

指的是"特征数据(特征检测器)",例如

内核

称为

(有时称为过滤器,含义相同)。
换句话说,如果您想了解" 5 x 5"原始图像的特征,
应将原始图像细分,并将每个图像与" 2 x 2"内核进行比较。
这就是"确定图像"或"识别图像的特征或其与其他图像的区别"的想法。

什么是"卷积"?

为了理解Conv2D,有必要理解" 2D卷积层"。
为此,我们首先需要了解"卷积层"。
那么什么是"卷积"?

大致来说,如下。

  • 将原始图像与内核(滤波器)进行比较,计算,输出计算结果(矩阵计算)并将结果进行排列的过程称为"卷积"。
  • 折叠后的输出结果有时称为"特征图"。
  • 通过卷积输出的数据小于原始图像的数据。

具有原始图像5 x 5和内核(过滤器)3 x 3的"卷积"的输出结果(特征图)为9平方(3 x 3)

在具有3 x 3内核的5 x 5原始图像上进行卷积时,
移位1平方(这称为"步幅(要移位的像素数)为1")
然后,将总共执行9个矩阵计算。
因此,如果输出并排列计算结果,则为9倍,即"特征图为9平方"。

image.png

红色框是要与内核进行比较的对象,即"感兴趣区域(称为窗口)"。
通过从原始图像的左上角到右下角移动1个正方形(1个像素)来重复进行矩阵运算。
在这种情况下,由于执行了9次计算,因此特征图变为9平方(3 x 3)。
通过一次移动一个像素来计算的"步幅为1"。
如果通过移动2个像素来计算,则称步幅为2。

具体计算示例

让我们实际尝试上图中的"第一矩阵运算"。
矩阵计算的步骤如下。在左图和右图(内核)的红色框部分(窗口)上执行矩阵运算。

image.png

顺便说一下,这里提到的内核只是一个例子。
在实际的卷积中,"可以在3x3之外任意指定内核的垂直和水平大小"
还要注意,"卷积是使用多种类型的内核完成的,而不仅仅是一种类型的内核"(详细信息将在后面描述)。

现在,矩阵运算为

  • 将原始图像的一部分(窗口)与内核进行比较,并将元素在相同位置上相乘。
  • 将乘积获得的所有值相加

通过

,可以获得输出结果。
为了清楚起见,我将输入一些数字。
在这里,
黑色-1
白色1
和。

image.png

从左上方的单元格到右下方的单元格,按顺序计算(总共9次),结果如下。

1
2
3
4
5
6
7
8
9
-1 x  1 = -1(上段の左同士を掛け算する)
 1 x  1 =  1(上段のセンター同士を掛け算する)
 1 x  1 =  1(上段の右同士を掛け算する)
 1 x -1 = -1(中段の左同士を掛け算する)
-1 x -1 =  1(中段のセンター同士を掛け算する)
 1 x -1 = -1(中段の右同士を掛け算する)
 1 x  1 =  1(下段の左同士を掛け算する)
 1 x  1 =  1(下段のセンター同士を掛け算する)
-1 x  1 = -1(下段の右同士を掛け算する)

左侧是"原始图像的一部分中一个单元格的值",
右侧是"内核中一个单元的值"。
如果添加所有答案,

1
SUM(-1, 1, 1, -1, 1, -1, 1, 1, -1)

由于它是

,因此结果为1。
此1排列在"要素地图的左上方",因此
特征图如下。

image.png

如果以此方式继续计算,则特征图的其余8个正方形也将填充数值。
进行这样的计算是"卷积"。
换句话说,"卷积是计算原始图像和核的矩阵并将结果输出到特征图的工作。"

但是,难以手动执行这种卷积(矩阵计算)。
因此,它是使用Keras的Conv2D之类的函数计算的。

传递给keras函数Conv2D()的参数的含义

关于开头的示例代码。

1
2
3
from keras import layers, models
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3)))

在此使用的

Conv2D()

1
Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3))

研究

参数的含义。
您正在传递四个参数。

1
2
3
4
5
6
Conv2D(
  32,
  (3,3),
  activation="relu",
  input_shape=(150,150,3)
)

官方keras文档
https://keras.io/ja/layers/convolutional/#conv2d
的描述如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
keras.layers.Conv2D(
  filters,
  kernel_size,
  strides=(1, 1),
  padding='valid',
  data_format=None,
  dilation_rate=(1, 1),
  activation=None,
  use_bias=True,
  kernel_initializer='glorot_uniform',
  bias_initializer='zeros',
  kernel_regularizer=None,
  bias_regularizer=None,
  activity_regularizer=None,
  kernel_constraint=None,
  bias_constraint=None
)

首先,让我们看一下第一个参数。
正式文件的描述如下。

1
filters : 整数で、出力空間の次元(つまり畳み込みにおける出力フィルタの数)。

在此代码中,我们传递了32。
换句话说,指定"输出滤波器的数量为32"。
那么什么是"输出过滤器"?

首先是什么"过滤器"?

前面我提到过"卷积是什么?"。
重要的是要知道"内核"在这里有时被称为"过滤器"。
换句话说,第一个参数filter是一个"过滤器"和一个"内核",因此
您可以看到它是与内核相关的设置值。

https://qastack.jp/stats/154798/difference-between-kernel-and-filter-in-cnn
然后,提出以下问题和答案。

  • 问题:卷积神经网络中的"内核"和"过滤器"之间有什么区别?

  • 答案:它具有相同的含义。内核有时称为过滤器。

因此,结论是

  • 内核是"过滤器"和"功能检测器"。它们都有相同的含义。

变为

如果

,则"输出过滤器的数量为32"表示"输出内核的数量为32"。

卷积评估

5x5输入图像

image.png

的3x3过滤器(也称为内核)

image.png

卷积时。
如下图所示,如果一次移动一个正方形进行计算,则该计算将总共执行9次,因此答案(功能图)将为9个正方形(3x3)。

(顺便说一下,一次滑动一个正方形的卷积表示为"步幅为1"。
步幅值越高,计算就越少)

animated_convolution.gif

什么是大步前进?

您要计算多少个平方?草率的值。

如果跨度为1,

stride1.gif

变为

如果跨度为2,

stride2.gif

变为

中,特征图的长度和宽度是多少x在以下条件下的卷积是什么?

  • 输入图像为25 x 25。
  • 过滤器(内核)为5 x 5。
  • 大步是2。

答案是11 x 11。
您可以通过在电子表格上编写网格并对其进行计数(同时实际手动移动它)来了解它。
有25 x 25的网格。这用作输入图像。
重叠的粉红色边框(5x5)是滤镜(内核)。
由于步幅为2,我们将通过移动2平方来计算。
您将在第11个计算中到达最右端。
由于垂直方向相同,因此要素图为11 x 11。

image.png

如何确定要传递给Conv2D函数的参数

基于上述知识,请考虑执行卷积所需的参数。
具体而言,有必要回答以下问题。

  • 问题(1):您要用于卷积的内核(滤波器)的垂直和水平像素数是多少?
  • 问题(2):要通过卷积识别的图像(即输入图像)的垂直和水平像素数是多少?
  • 问题(3):跨度值是多少? (多少个像素?)

可能还有其他问题,但是这些问题的答案是"确定要传递给函数的参数的值"。

如何确定过滤器(内核)的垂直和水平尺寸

https://child-programmer.com/ai/keras/conv2d/
摘自描述。

1
2
3
4
5
Conv2D(16, (3, 3)の解説
:「3×3」の大きさのフィルタを16枚使うという意味です(16種類の「3×3」のフィルタ)。
「5×5」「7×7」などと、中心を決められる奇数が使いやすいようです。
フィルタ数は、「16?32?64?128?256?512枚」などが使われる傾向にあるようですが、
複雑そうな問題ならフィルタ数を多めに、簡単そうな問題ならフィルタ数を少なめで試してみるようです。

过滤器的值为

  • 一个滤镜的垂直和水平尺寸是多少x多少个像素? (像素值)

  • 您使用多少个垂直和水平尺寸过滤器? (张数)

注意不要将其与

混淆。
垂直和水平尺寸如前所述。
在下面的示例中,滤镜的垂直和水平尺寸为" 5 x 5"(粉红色区域为5x5 = 25像素正方形)。

image.png

中,"过滤器数量(您使用多少个过滤器?该数量)"是什么意思?
有多种类型的卷积滤波器。
"一种类型"仅表示"一种功能"。
例如,如果您具有3x3滤镜,则滤镜类型为

image.png

可能有各种内容,例如

。这是"过滤器类型"和"过滤器数量",即"过滤器数量"。

总之,

1
Conv2D(16, (3, 3)

说,"使用具有3x3垂直和水平像素的16个(16种类型)滤镜进行卷积。"
是命令。

关于"过滤器数量"的补充信息

如果您想进一步了解"使用多个过滤器进行卷积,例如16种类型(16张)"的含义,请
https://products.sint.co.jp/aisia/blog/vol1-16
请参见中的"卷积层"。
以下是摘录。

  • 过滤器是自动创建的,并随着学习而改变(反向传播)。
  • 输出特征图以显示过滤器的数量。

"输出的特征图数量与过滤器数量一样多"表示
用16种类型(16张)的过滤器进行卷积后,
这意味着将输出16个"功能图"。

为了简单起见,在这里
考虑"用三个滤波器执行卷积"的情况。

例如,在下图中,滤镜(粉红色区域)为2x2,
特征图(绿色区域)为3x3。

stride1.gif

如果只有一种类型的过滤器(粉红色区域),
仅输出一个特征图(绿色区域)。

但是,如果您准备3种类型的过滤器,
由于对每种类型都执行矩阵计算,因此
由于每个特征图具有不同的结果,因此将输出三个特征图。

image.png

看看开头的示例代码

开头的示例代码

1
2
3
from keras import layers, models
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3)))

1
Conv2D(32,(3,3)

它写为


这是"使用32种类型(32张)的3x3滤镜(内核)进行卷积"的指令。

及更高版本,

  • 问题(1):您要用于卷积的内核(滤波器)的垂直和水平像素数是多少?

我了解如何确定

的答案(如何传递参数)。

继续

  • 问题(2):要通过卷积识别的图像(即输入图像)的垂直和水平像素数是多少?

考虑

什么是input_shape?

https://child-programmer.com/ai/keras/conv2d/
以下是摘录。

1
2
input_shape=(28, 28, 1)の解説
:縦28?横28ピクセルのグレースケール(白黒画像)を入力しています。

换句话说,在示例代码开头的

1
input_shape=(150,150,3)

如果


"输入图像的垂直和水平像素为150 x 150"
将会。那么3是什么意思呢?

官方文件
https://keras.io/ja/layers/convolutional/#conv2d
<铅>

1
RGB画像ではinput_shape=(128, 128, 3)となります.

它说

1用于黑白图像
3

用于RGB

由于它是

,因此被视为颜色的数量(RGB的红色,绿色和蓝色3种类型)。
如果是普通照片(.jpg),则为RGB,因此,如果设置为3,则不会有问题。

什么是激活?

示例代码

1
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3)))

编写

激活=" relu"

是什么意思?

https://child-programmer.com/ai/keras/conv2d/
下面的说明。

1
2
3
activation=relu の解説
:活性化関数「ReLU(Rectified Linear Unit)- ランプ関数」。
フィルタ後の画像に実施。入力が0以下の時は出力0。入力が0より大きい場合はそのまま出力する。

https://keras.io/ja/layers/convolutional/#conv2d
下面的说明。

1
2
activation: 使用する活性化関数の名前(activationsを参照)
何も指定しなければ,活性化は一切適用されません


激活=" relu"
是命令"使用ReLU作为激活功能"。

什么是激活?

激活功能是"激活功能"。那么什么是"激活"?
以下是用于理解激活的上下文的集合。

  • 激活功能对于神经网络是必不可少的。 https://qiita.com/omiita/items/bfbba775597624056987

  • 激活功能的实际标准是" ReLU"。 https://qiita.com/omiita/items/bfbba775597624056987

  • 激活函数用于增加模型的表现力。 https://ai-trend.jp/basic-study/neural-network/activation_function/

  • 典型的激活功能包括"步进功能"," S型功能"和" ReLU功能"。 https://ai-trend.jp/basic-study/neural-network/activation_function/

总之,
"如果指定激活函数,则模型的表现力将会提高(可以创建智能AI),因此让我们指定一个激活函数。"" ReLU被用作标准,不是吗?"

关于步幅指定

  • 问题(3):跨度值是多少? (多少个像素?)

但这是

1
strides = 1

指定为

。有关详情
https://keras.io/ja/layers/convolutional/#conv2d
看到。

概要

如上所述,

1
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3)))

在做什么?每个论点是什么意思?
我大致可以理解。
本章的目的是"了解Keras Conv2D(2D卷积层)",因此
曾经在这里。
我们将在单独的章节中研究Sequential()和MaxPooling2D()。