【问题标题】:tensorflow: filters vs kernels and stridestensorflow:过滤器与内核和步幅
【发布时间】:2019-05-17 01:55:06
【问题描述】:

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

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

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

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

让我感到困惑的是:

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 图像的 w/h 和灰度

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

使用此处显示的相同内核/过滤器和步幅理解:

我对推导特征图的理解:

我不会填充上面的图像,而是会得到以下结果:

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: 9
New 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: 25
New Shape: [5, 5, 1]
 Padding : [1, 1]

我将过滤器的数量解释为图像大小、填充、步幅和内核大小的函数。 (这是正确的吗?)(How to interpret TensorFlow's convolution filter and striding parameters?

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

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-dim)与在所有情况下传递的 filters 值匹配。

我无法弄清楚这些值是如何兼容的:28x28 imagekernel_size=(3,3) 导致 32 filters

假设步幅 = [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: 676
New 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: 100
New Shape: [10, 10, 1]
 Padding : [1, 1]

如果过滤器(计数)、内核大小、步幅和图像大小以我理解的方式相关——为什么 tensorflow 在可以导出过滤器计数时要求它?

【问题讨论】:

    标签: python tensorflow machine-learning conv-neural-network autoencoder


    【解决方案1】:

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

    【讨论】:

    • 跟踪——所以这是我们添加领域知识以指示特征数量的地方?或者将农场(最大内存/GPU)扔到蛮力领域洞察力?这是对过滤器选择的更好解释吗?
    • @Schalton 设置单元或过滤器的数量等超参数主要基于经验,并没有具体的公式。此外,这取决于您正在处理的问题和您拥有的数据。例如,在 CNN 模型中,滤波器的数量通常(但并非总是)随着我们在模型中的深入而增加,它们通常是 2 的幂(即 16、32、64,...)。
    • 回想起来,我似乎将 pooling/pool_size 与过滤器/过滤器大小的想法混合在一起——鉴于此,我对 pool_size 的理解准确吗?
    • @Schalton 好吧,池化通常用于对 Conv 层的输出进行下采样。例如,池大小为 2 的池化层将在给定形状 (w, h, c) 的输入的情况下产生形状为 (w/2, h/2, c) 的输出(即它仅应用于空间维度)。和内核大小一样,它是一个由您(即模型的设计者)指定的超参数,它不是由其他值(如图像大小等)决定的。
    • 完美——这是我的困惑,步幅和池暗度决定了池化矩阵(而不是过滤器)的数量。我正在为全高清图像构建自动编码器。池化以对图像进行下采样(以保持在 RAM/GPU 限制内)并进行过滤以提供维数以保持“细节”——因此我的编码器将反转“正常”过滤器模式。交易像素细节的过滤器深度。然后,我将使用编码图像作为另一个网络的训练集。所以我需要在池化之前添加过滤器以保留细节。谢谢!这极大地帮助了我的理解!
    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多