Keras.Conv2D 类
Keras Conv2D是一个 2D 卷积层,该层创建了一个卷积核,该卷积核与层输入相结合,有助于产生输出张量。
内核:在图像处理中,内核是一个卷积矩阵或掩码,通过在内核和图像之间进行卷积,可用于模糊、锐化、浮雕、边缘检测等。
Keras Conv2D 类构造函数具有以下参数:
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)
现在让我们分别检查每个参数:
过滤器
- 强制 Conv2D 参数是卷积层将从中学习的过滤器数量。
- 它是一个整数值,也决定了卷积中输出滤波器的数量。
model.add(Conv2D(32, (3, 3), padding="same", activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2)))
- 在这里,我们总共学习了 32 个过滤器,然后我们使用 Max Pooling 来减少输出体积的空间维度。
- 至于选择合适的值没有。对于过滤器,始终建议使用 2 的幂作为值。
内核大小
- 此参数确定内核的尺寸。常见的维度包括 1×1、3×3、5×5 和 7×7,它们可以作为 (1, 1)、(3, 3)、(5, 5) 或 (7, 7) 元组传递。
- 它是一个整数或 2 个整数的元组/列表,指定 2D 卷积窗口的高度和宽度。
- 该参数必须是奇数。
model.add(Conv2D(32, (7, 7), activation="relu"))
大步前进
- 此参数是一个整数或 2 个整数的元组/列表,指定卷积的“步长”以及输入体积的高度和宽度。
- 它的默认值始终设置为 (1, 1),这意味着给定的 Conv2D 过滤器应用于输入体积的当前位置,并且给定的过滤器向右移动 1 像素,然后再次将过滤器应用于输入音量,它一直执行到我们移动过滤器的音量的最右边界。
model.add(Conv2D(128, (3, 3), strides=(1, 1), activation="relu"))
model.add(Conv2D(128, (3, 3), strides=(2, 2), activation="relu"))
填充
- Keras Conv2D 类的填充参数可以采用以下两个值之一:“有效”或“相同”。
- 将该值设置为“有效”参数意味着输入体积不是零填充的,并且允许通过自然应用卷积来减少空间维度。
model.add(Conv2D(32, (3, 3), padding="valid"))
相反,您可以通过将值设置为“相同”来保留体积的空间维度,以使输出体积大小与输入体积大小匹配。
model.add(Conv2D(32, (3, 3), padding="same"))
数据格式
- Conv2D 类的这个参数可以设置为“channels_last”或“channels_first”值。
- Keras 的 TensorFlow 后端使用通道最后排序,而 Theano 后端使用通道优先排序。
- 通常我们不会像 Keras 那样触及这个值,因为大多数时候我们将使用 TensorFlow 后端到 Keras。
- 它默认为在 ~/.keras/Keras.json 的 Keras 配置文件中找到的 image_data_format 值。
膨胀率
- Conv2D 类的 dilation_rate 参数是一个 2 元组整数,它控制扩张卷积的扩张率。
- 扩张卷积是应用于具有定义间隙的输入体积的基本卷积。
- 当处理更高分辨率的图像并且细粒度的细节对您很重要时,或者当您使用较少的参数构建网络时,您可以使用此参数。
激活
- Conv2D 类的激活参数只是一个方便的参数,它允许您提供一个字符串,它指定执行卷积后要应用的激活函数的名称。
model.add(Conv2D(32, (3, 3), activation="relu"))
或者
model.add(Conv2D(32, (3, 3)))
model.add(Activation("relu"))
- 如果您不指定任何内容,则不会应用任何激活,并且不会影响卷积神经网络的性能。
use_bias
- Conv2D 类的这个参数用于确定是否将偏置向量添加到卷积层。
- 默认情况下,其值设置为 True。
kernel_initializer
- 此参数控制初始化方法,用于在实际训练模型之前初始化 Conv2D 类中的所有值。
- 它是内核权重矩阵的初始化器。
偏置初始化器
- 而bias_initializer 控制在训练开始之前如何实际初始化偏置向量。
- 它是偏置向量的初始化器。
kernel_regularizer、bias_regularizer 和 activity_regularizer
- kernel_regularizer是应用于核权重矩阵的正则化函数。
- bias_regularizer是应用于偏置向量的正则化函数。
- activity_regularizer是应用于层输出(即激活)的正则化函数。
- 正则化是用于通过在给定的训练集上适当地拟合函数并避免过度拟合来减少错误的技术。
- 它控制应用于 Conv2D 层的正则化方法的类型和数量。
- 在处理大型数据集和深度神经网络时,必须使用正则化。
- 使用正则化有助于我们减少过度拟合的影响,并提高我们模型的泛化能力。
- 正则化有两种类型:L1 和 L2 正则化,两者都用于减少我们模型的过度拟合。
from keras.regularizers import l2
...
model.add(Conv2D(128, (3, 3), activation="relu"),
kernel_regularizer=l2(0.0002))
- 您应用的正则化值是您需要为自己的数据集调整的超参数,其值通常在 0.0001 到 0.001 之间。
- 始终建议单独保留bias_regularizer,因为它对减少过度拟合的影响非常小。
- 还建议将 activity_regularizer 保留为其默认值。
kernel_constraint 和 bias_constraint
- kernel_constraint 是应用于核矩阵的约束函数。
- bias_constraint 是应用于偏置向量的约束函数。
- 约束是解决方案必须满足的优化问题的条件。
有几种类型的约束——主要是等式约束、不等式约束和整数约束。 - 这些参数允许您对 Conv2D 层施加约束。
- 除非您有特定的理由对 Con2D 层应用约束,否则这些参数通常会被单独保留。
这是一个简单的代码示例,向您展示 Conv2D 类的不同参数的工作原理:
# build the model
model = Sequential()
model.add(Conv2D(32, kernel_size =(5, 5), strides =(1, 1),
activation ='relu'))
model.add(MaxPooling2D(pool_size =(2, 2), strides =(2, 2)))
model.add(Conv2D(64, (5, 5), activation ='relu'))
model.add(MaxPooling2D(pool_size =(2, 2)))
model.add(Flatten())
model.add(Dense(1000, activation ='relu'))
model.add(Dense(num_classes, activation ='softmax'))
# training the model
model.compile(loss = keras.losses.categorical_crossentropy,
optimizer = keras.optimizers.SGD(lr = 0.01),
metrics =['accuracy'])
# fitting the model
model.fit(x_train, y_train,
batch_size = batch_size,
epochs = epochs,
verbose = 1,
validation_data =(x_test, y_test),
callbacks =[history])
# evaluating and printing results
score = model.evaluate(x_test, y_test, verbose = 0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
理解代码:
- 使用Sequential.model.add()方法添加 Conv2D 层时,我们可以使用许多参数,我们在前面的博客中已经阅读过这些参数。
- 第一个参数告诉我们卷积操作中使用的过滤器数量。
- 然后第二个参数以像素为单位指定卷积滤波器的大小。过滤器大小可能由您使用的 CNN 架构决定——例如,VGGNet 专门使用 (3, 3) 过滤器。如果不是,请使用 5×5 或 7×7 的过滤器来学习更大的特征,然后快速减少到 3×3。
- 第三个参数指定卷积滤波器应如何沿着源图像的 x 轴和 y 轴步进。在大多数情况下,可以将 strides 参数保留为默认值 (1, 1)。但是,您可以将其增加到 (2, 2) 以减小输出体积的大小。
- 第四个参数是激活参数,它指定执行卷积后要应用的激活函数的名称。
使用功能 API 的类似代码
#build the model
inputs = Input(shape = ())
conv1 = Conv2D(32, kernel_size = (5,5), strides = (1,1), activation = 'relu'))(inputs)
max1 = MaxPooling2D(pool_size=(2,2), strides=(2,2)))(conv1)
conv2 = Conv2D(64, (5,5), activation = 'relu'))(max1)
max2 = MaxPooling2D(pool_size=(2,2)))(conv2)
flat = Flatten()(max2)
den1 = Dense(100, activation = 'relu'))(flat)
out1 = Dense(num_classes, activation ='softmax'))(den1)
model = Model(inputs = inputs, output =out1 )
# training the model
model.compile(loss = keras.losses.categorical_crossentropy,
optimizer = keras.optimizers.SGD(lr = 0.01),
metrics =['accuracy'])
# fitting the model
model.fit(x_train, y_train,
batch_size = batch_size,
epochs = epochs,
verbose = 1,
validation_data =(x_test, y_test),
callbacks =[history])
# evaluating and printing results
score = model.evaluate(x_test, y_test, verbose = 0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
概括:
- 大多数时候你会使用过滤器、kernel_size、strides、padding。
- 如何正确使用 Keras Conv2D 类来创建我们自己的卷积神经网络,并确定我们是否需要对 Keras Conv2D 类使用特定参数。