所以我一直在关注Tensorflow并尝试着解决一件事,我不知道我错过了什么。我正在查看https://www.tensorflow.org/versions/master/tutorials/layers中的教程,特别是模型构建步骤:
"""Model function for CNN."""
# Input Layer
input_layer = tf.reshape(features, [-1, 28, 28, 1])
# Convolutional Layer #1
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=32,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
# Pooling Layer #1
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
# Convolutional Layer #2 and Pooling Layer #2
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=64,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
# Dense Layer
pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64])
如果我理解正确,使用32 @ 5x5过滤器进行卷积输入会创建32个特征映射@ 28x28的输出。然后max-pooled将要素图缩小为宽度和高度= 14x14。
所以这是我理解的问题,我们有32个@ 14x14特征映射,我们用另一组64个滤波器@ 5x5卷积。它应该生成尺寸为14x14的32 * 64 = 2048个特征图吗?所以在重塑它时,我们应该在最后一个最大池化步骤之后使用[-1,7 * 7 * 2048]?或者这个conv2在conv2中的深度为32,滤波器的大小如[5,5,32]?也许我错过了一些关键理论或只是盲目的;>
如果有人可以帮助我理解这一点,那会不会适用!
干杯!
答案 0 :(得分:1)
您使用的填充“相同”。
If padding == "same"
output_shape[i] = ceil(input_shape[i]/stides[i])
If padding == "valid":
output_spatial_shape[i] = ceil((input_spatial_shape[i] - (spatial_filter_shape[i]-1) * dilation_rate[i]) / strides[i]).
要获得您期望使用填充“有效”的行为。
在这里查看API:https://www.tensorflow.org/api_docs/python/tf/nn/convolution
我希望这会有所帮助。