tensorflow: 滤波器与核及步长的区别

Python 3.5 / Windows 10 / tensorflow-gpu 1.12 (GTX 1070)

目标:为三通道图像构建卷积自编码器

教程来源:https://towardsdatascience.com/autoencoders-introduction-and-implementation-3f40483b0a85

该教程使用的是MNIST数据集,我的图像更大且有三个颜色通道,但我正在尝试相应地进行调整。

让我感到困惑的一点在这里:

inputs_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name='inputs')conv1 = tf.layers.conv2d(inputs=inputs_, filters=32, kernel_size=(3,3), padding='same', activation=tf.nn.relu)# Now 28x28x32

[28,28,1] 是 MNIST 图像的宽高和灰度

我理解 kernel_size 等同于滤波器大小——这是正确的吗? (https://blog.xrds.acm.org/2016/06/convolutional-neural-networks-cnns-illustrated-explanation/)

使用这里展示的相同核/滤波器和步长理解:kernel/stride

我对推导特征图的理解:

我不会对上面的图像进行填充,并且会得到以下结果:

filter_ct_a, out_shape_a, padding_a = calc_num_filters(shapeXY=[5,5,1], filterXY=[3,3], strideXY=[1,1])print("# Filters: {}\nNew Shape: {}\n Padding : {}".format(filter_ct_a, out_shape_a, padding_a))# Filters: 9New Shape: [3, 3, 1] Padding : [0, 0]

考虑到它被填充了:

filter_ct_a, out_shape_a, padding_a = calc_num_filters(shapeXY=[5,5,1], filterXY=[3,3], strideXY=[1,1], paddingXY=[1,1])print("# Filters: {}\nNew Shape: {}\n Padding : {}".format(filter_ct_a, out_shape_a, padding_a))5.0# Filters: 25New Shape: [5, 5, 1] Padding : [1, 1]

我认为滤波器的数量是图像大小、填充、步长和核大小的函数。(这是正确的吗?)(如何解释TensorFlow的卷积滤波器和步长参数?)

我对这种关系的虚拟计算如下:

def calc_num_filters(shapeXY, filterXY, strideXY=[1,1], paddingXY = [0,0]):    paddingX = paddingXY[0]    while True:        filtersX = 1 + ((shapeXY[0]+2*paddingX-filterXY[0])/strideXY[0])        if filtersX == int(filtersX):# and filtersX%2 == 0:            break        paddingX += 1        if paddingX >= shapeXY[0]:            raise "incompatable filter shape X"    paddingY = paddingXY[1]    while True:        filtersY = 1 + ((shapeXY[1]+2*paddingY-filterXY[1])/strideXY[1])        if filtersY == int(filtersY):# and filtersY%2 == 0:            break        paddingY += 1        if paddingY >= shapeXY[1]:            raise "incompatable filter shape Y"    return (int(filtersX*filtersY),[int(filtersX), int(filtersY), shapeXY[2]],  [paddingX, paddingY])

在教程示例中,conv1 将张量大小从 [28, 28, 1] 更改为 [28, 28, 32]。我注意到 tf.layers.conv2d 似乎在所有情况下都使通道(或 z 维)与传入的 filters 值匹配。

我无法理解这些值如何兼容:28x28 的图像,使用 kernel_size=(3,3) 得到 32 个滤波器

假设步长 = [1,1]

filter_ct_a, out_shape_a, padding_a = calc_num_filters(shapeXY=[28,28,1], filterXY=[3,3], strideXY=[1,1])print("# Filters: {}\nNew Shape: {}\n Padding : {}".format(filter_ct_a, out_shape_a, padding_a))# Filters: 676New Shape: [26, 26, 1] Padding : [0, 0]

使用 strideXY=[3,3]

filter_ct_a, out_shape_a, padding_a = calc_num_filters(shapeXY=[28,28,1], filterXY=[3,3], strideXY=[3,3])print("# Filters: {}\nNew Shape: {}\n Padding : {}".format(filter_ct_a, out_shape_a, padding_a))# Filters: 100New Shape: [10, 10, 1] Padding : [1, 1]

如果滤波器(数量)、核大小、步长和图像大小以我理解的方式相关——为什么TensorFlow需要指定滤波器数量而不是可以推导出来?


回答:

滤波器的数量完全不与核大小、步长或图像大小相关。相反,它是由您通过 filters 参数指定的。例如,当您设置 filters=32 时,这意味着该层将拥有32个独立的卷积滤波器,每个滤波器将应用于给定图像,在您的示例中图像形状为 (28, 28, 1),并将返回形状为 (28, 28) 的特征图(即激活图)(假设 padding='same')。因此,所有滤波器结合起来,卷积层的输出将具有形状 (28, 28, 32)。如果您设置了 filter=53,卷积层的输出形状将为 (28, 28, 53),即每个卷积滤波器对应一个特征图。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注