Python 在tensorflow上构建CNN时,如何指定要使用的卷积滤波器?

Python 在tensorflow上构建CNN时,如何指定要使用的卷积滤波器?,python,tensorflow,keras,deep-learning,cnn,Python,Tensorflow,Keras,Deep Learning,Cnn,我知道有不同种类的卷积滤波器,这取决于你想做的工作。例如,锐化、模糊等。我们是否需要使用特定类型的图像分类 tensorflow网站上提供了用于图像分类的CNN示例: model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.C

我知道有不同种类的卷积滤波器,这取决于你想做的工作。例如,锐化、模糊等。我们是否需要使用特定类型的图像分类

tensorflow网站上提供了用于图像分类的CNN示例:

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))

我知道卷积层使用的是3x3滤波器,但我怎么知道它是什么类型的矩阵呢?削尖的、模糊的等等?任何3X3都可以用于图像分类吗?

它不是Instagram意义上的过滤器。它是一个在输入图像上滑动的矩阵,乘以相应的值,然后将这些值相加。权重是可训练的,因此它们成为特征,也就是说,它们成为通过乘法提取最多意义的东西

如果初始化卷积层,它只是随机值:

import tensorflow as tf

conv = tf.keras.layers.Conv2D(filters=1, kernel_size=3)
conv.build(input_shape=(None, 28, 28, 1))

weights, biases = conv.weights

print(tf.squeeze(weights))
正如我所说,过滤器是可训练值的矩阵,因此,如果您的任务是检测线,您可能会得到如下权重:

tf.eye(3)


第二层输入的大小也会稍微小一些,因为图像会被过滤器大小-1缩小,除非有填充。

它不是Instagram意义上的过滤器。它是一个在输入图像上滑动的矩阵,乘以相应的值,然后将这些值相加。权重是可训练的,因此它们成为特征,也就是说,它们成为通过乘法提取最多意义的东西

如果初始化卷积层,它只是随机值:

import tensorflow as tf

conv = tf.keras.layers.Conv2D(filters=1, kernel_size=3)
conv.build(input_shape=(None, 28, 28, 1))

weights, biases = conv.weights

print(tf.squeeze(weights))
正如我所说,过滤器是可训练值的矩阵,因此,如果您的任务是检测线,您可能会得到如下权重:

tf.eye(3)


第二层输入的大小也会稍微小一些,因为图像会被过滤器大小-1缩小,除非有填充。

在初始化TensorFlow/Keras模型时,您不能指定过滤器的类型,这意味着它是Sobel过滤器还是高斯模糊等。这些权重过滤器的值会随着训练的进行而逐渐学习,并针对您使用的数据集而特定


但是,您可以指定如何使用Conv2D层中的kernel_初始值设定项参数对权重的随机值进行采样,它可以帮助模型更快地收敛,或者根据数据和其他因素找到更好的局部最小值

在初始化TensorFlow/Keras模型时,您不能指定过滤器的类型,这意味着它是Sobel过滤器还是高斯模糊等。这些权重过滤器的值会随着训练的进行而学习,并且会特定于您使用的数据集


但是,您可以指定如何使用Conv2D层中的kernel_初始值设定项参数对权重的随机值进行采样,它可以帮助模型更快地收敛,或者根据数据和其他因素找到更好的局部最小值

谢谢你的回复,尼古拉斯。作为后续问题,澄清一下,我知道矩阵在输入图像上滑动,卷积解决方案或特征图就是输出。在进行CNN架构时,您可能会在以前的功能图上出现多层卷积。我的问题是,我怎么知道3x3矩阵是什么?我意识到输入图像是图像1,但是它所卷积的矩阵,对于一般的分类问题不重要吗?这是因为每个图层将使用相同的3x3值,因此所有要素贴图将具有相同的比率?谢谢你的回复,尼古拉斯。作为后续问题,澄清一下,我知道矩阵在输入图像上滑动,卷积解决方案或特征图就是输出。在进行CNN架构时,您可能会在以前的功能图上出现多层卷积。我的问题是,我怎么知道3x3矩阵是什么?我意识到输入图像是图像1,但是它所卷积的矩阵,对于一般的分类问题不重要吗?这是因为每个图层将使用相同的3x3值,因此所有要素贴图将具有相同的比率?
import tensorflow as tf
from skimage import data
import numpy as np
import matplotlib.pyplot as plt

conv = tf.keras.layers.Conv2D(filters=3, kernel_size=3)
image = data.chelsea()

conv.build(input_shape=(None, *image.shape))

plt.imshow(image)
plt.show()

image = np.expand_dims(image, axis=0).astype(np.float32)
for i in range(5):
    image = conv(image)

plt.imshow(np.squeeze(np.abs(np.minimum(image, 255))).astype(int))
plt.show()