你想做的事
- 我想了解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,则如下图所示。
对于黑白照片,
- 每个均为黑色或白色
- 黑色用表示(涂成黑色),白色用□表示(白色)。
如果是
,则"在白色背景上用黑色字符绘制x(x)"时,将如下图所示。
同样,如果它是加号(+),则
如果它是
和减号(-),则
如果它是
和等号(=),则
。
"通过专注于小部门来检查特性"的想法
白色背景上的黑色字母
对图像数据
"通过关注小部分来检查特征"会发生什么?
例如,请注意红色框和蓝色框所包围的部分。
此区域为
。换句话说,可以看出"红色框部分和蓝色框部分具有相同的特性"。
其中
指的是"特征数据(特征检测器)",例如
内核
称为
(有时称为过滤器,含义相同)。
换句话说,如果您想了解" 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平方"。
红色框是要与内核进行比较的对象,即"感兴趣区域(称为窗口)"。
通过从原始图像的左上角到右下角移动1个正方形(1个像素)来重复进行矩阵运算。
在这种情况下,由于执行了9次计算,因此特征图变为9平方(3 x 3)。
通过一次移动一个像素来计算的"步幅为1"。
如果通过移动2个像素来计算,则称步幅为2。
具体计算示例
让我们实际尝试上图中的"第一矩阵运算"。
矩阵计算的步骤如下。在左图和右图(内核)的红色框部分(窗口)上执行矩阵运算。
顺便说一下,这里提到的内核只是一个例子。
在实际的卷积中,"可以在3x3之外任意指定内核的垂直和水平大小"
还要注意,"卷积是使用多种类型的内核完成的,而不仅仅是一种类型的内核"(详细信息将在后面描述)。
现在,矩阵运算为
- 将原始图像的一部分(窗口)与内核进行比较,并将元素在相同位置上相乘。
- 将乘积获得的所有值相加
通过
,可以获得输出结果。
为了清楚起见,我将输入一些数字。
在这里,
黑色-1
白色1
和。
从左上方的单元格到右下方的单元格,按顺序计算(总共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排列在"要素地图的左上方",因此
特征图如下。
如果以此方式继续计算,则特征图的其余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输入图像
的3x3过滤器(也称为内核)
与
卷积时。
如下图所示,如果一次移动一个正方形进行计算,则该计算将总共执行9次,因此答案(功能图)将为9个正方形(3x3)。
(顺便说一下,一次滑动一个正方形的卷积表示为"步幅为1"。
步幅值越高,计算就越少)
什么是大步前进?
您要计算多少个平方?草率的值。
如果跨度为1,
变为
。
如果跨度为2,
变为
。
在
中,特征图的长度和宽度是多少x在以下条件下的卷积是什么?
- 输入图像为25 x 25。
- 过滤器(内核)为5 x 5。
- 大步是2。
答案是11 x 11。
您可以通过在电子表格上编写网格并对其进行计数(同时实际手动移动它)来了解它。
有25 x 25的网格。这用作输入图像。
重叠的粉红色边框(5x5)是滤镜(内核)。
由于步幅为2,我们将通过移动2平方来计算。
您将在第11个计算中到达最右端。
由于垂直方向相同,因此要素图为11 x 11。
如何确定要传递给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像素正方形)。
在
中,"过滤器数量(您使用多少个过滤器?该数量)"是什么意思?
有多种类型的卷积滤波器。
"一种类型"仅表示"一种功能"。
例如,如果您具有3x3滤镜,则滤镜类型为
。
可能有各种内容,例如
。这是"过滤器类型"和"过滤器数量",即"过滤器数量"。
总之,
1 | Conv2D(16, (3, 3) |
说,"使用具有3x3垂直和水平像素的16个(16种类型)滤镜进行卷积。"
是命令。
关于"过滤器数量"的补充信息
如果您想进一步了解"使用多个过滤器进行卷积,例如16种类型(16张)"的含义,请
https://products.sint.co.jp/aisia/blog/vol1-16
请参见中的"卷积层"。
以下是摘录。
- 过滤器是自动创建的,并随着学习而改变(反向传播)。
- 输出特征图以显示过滤器的数量。
"输出的特征图数量与过滤器数量一样多"表示
用16种类型(16张)的过滤器进行卷积后,
这意味着将输出16个"功能图"。
为了简单起见,在这里
考虑"用三个滤波器执行卷积"的情况。
例如,在下图中,滤镜(粉红色区域)为2x2,
特征图(绿色区域)为3x3。
如果只有一种类型的过滤器(粉红色区域),
仅输出一个特征图(绿色区域)。
但是,如果您准备3种类型的过滤器,
由于对每种类型都执行矩阵计算,因此
由于每个特征图具有不同的结果,因此将输出三个特征图。
看看开头的示例代码
开头的示例代码
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()。