张量流:过滤器与内核和步幅
tensorflow: filters vs kernels and strides
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/)
使用此处显示的相同 Kernel/Filter 和 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: 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]
我将过滤器的数量解释为图像大小、填充、步幅和内核大小的函数。 (这是正确的吗?) ()
我对这种关系的虚拟计算如下:
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 image
,kernel_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 在可以导出时要求过滤器计数?
过滤器的数量 NOT 与内核大小、步幅或图像大小都没有关系。相反,它是由您使用 filters
参数指定的。例如,当您设置 filters=32
时,这意味着该层将具有 32 个 independent 个卷积过滤器,从这个意义上说,每个过滤器都将应用于给定的图像,其形状为 (28, 28, 1)
在你的例子中,并且将 return 一个形状为 (28, 28)
的特征图(即激活图)(假设 padding='same'
)。因此,所有的过滤器结合起来,卷积层的输出将具有 (28, 28, 32)
的形状。如果你设置了 filter=53
,卷积层的输出将是 (28, 28, 53)
的形状,即每个卷积过滤器一个特征图。
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/)
使用此处显示的相同 Kernel/Filter 和 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: 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]
我将过滤器的数量解释为图像大小、填充、步幅和内核大小的函数。 (这是正确的吗?) (
我对这种关系的虚拟计算如下:
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 image
,kernel_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 在可以导出时要求过滤器计数?
过滤器的数量 NOT 与内核大小、步幅或图像大小都没有关系。相反,它是由您使用 filters
参数指定的。例如,当您设置 filters=32
时,这意味着该层将具有 32 个 independent 个卷积过滤器,从这个意义上说,每个过滤器都将应用于给定的图像,其形状为 (28, 28, 1)
在你的例子中,并且将 return 一个形状为 (28, 28)
的特征图(即激活图)(假设 padding='same'
)。因此,所有的过滤器结合起来,卷积层的输出将具有 (28, 28, 32)
的形状。如果你设置了 filter=53
,卷积层的输出将是 (28, 28, 53)
的形状,即每个卷积过滤器一个特征图。