tensorflow:过滤器与内核和跨步

2024-10-01 04:59:46 发布

您现在位置:Python中文网/ 问答频道 /正文

Python3.5/Windows10/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和灰度

我知道内核大小等于过滤器大小--这是正确的吗?https://blog.xrds.acm.org/2016/06/convolutional-neural-networks-cnns-illustrated-explanation/

使用此处显示的相同步幅理解内核/筛选器(&S): kernel/stride

我对推导特征图的理解:

我不会填充上面的图像,并且会得出以下结论:

^{pr2}$

考虑到它是填充的:

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值。在

我搞不懂这些值是如何兼容的:a28x28 image,而kernel_size=(3,3)导致{}?

假设步幅=[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]

如果filter(count)、kernel size、stride和image size是以我理解的方式相关的——为什么tensorflow在可以导出过滤器计数时要求它计数?


Tags: 图像tffilteroutfiltersshapepaddingct
1条回答
网友
1楼 · 发布于 2024-10-01 04:59:46

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

相关问题 更多 >