Tensorflow CNN MNIST示例,重量尺寸

时间:2017-05-26 10:49:18

标签: tensorflow conv-neural-network

我刚刚开始在Tensorflow中编程,虽然我已经非常熟悉神经网络的概念(我知道,这很奇怪,我的大学归咎于我)。我一直试图改变this CNN example的实现,以使我自己的设计工作。我的问题是关于权重初始化:

weights = {
    # 5x5 conv, 1 input, 32 outputs (i.e. 32 filters)
    'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])),
    # 5x5 conv, 32 inputs, 64 outputs
    'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
    # fully connected, 7*7*64 inputs, 1024 outputs
    'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])),
    # 1024 inputs, 10 outputs (class prediction)
    'out': tf.Variable(tf.random_normal([1024, n_classes]))
}

如果第二层有32个输入和64个输出,这是否意味着它只应用2个滤波器? (看起来很少?)这是否意味着,为了实现5个连续的3x3转换层,我应该将先前的输出数量与该层中的滤波器数量相乘,如下所示:

weights = {
    'wc1': tf.Variable(tf.random_normal([3, 3, 1, 20])),
    'wc2': tf.Variable(tf.random_normal([3, 3, 20, 41])),
    'wc3': tf.Variable(tf.random_normal([3, 3, 20*41, 41])),
    'wc4': tf.Variable(tf.random_normal([3, 3, 20*41*41, 62])),
    'wc5': tf.Variable(tf.random_normal([3, 3, 20*41*41*62, 83])),
    'out': tf.Variable(tf.random_normal([3, 3, 20*41*41*62*83, n_classes]))
}

感觉就像是在做错事。

1 个答案:

答案 0 :(得分:2)

是的,你做错了什么。

您的输入矩阵是[批次,高度,宽度,深度],深度最初为1。

让我们以 wc1 为例[3,3,1,20]。这意味着它将有20个不同的过滤器,每个过滤器将跨越1个深度并覆盖高度x宽度3x3。每个过滤器将穿过跨越所有深度的整个图像。由于有20种不同的过滤器会产生[批量,高度,宽度,20]

的输出张量

从概念上讲,我们有可能将像素强度的深度改为前一像素周围每3x3像素20个等级。

如果我们再应用[3,3,20,41],我们将创建41个滤镜,其中每个滤镜的深度为20,高度x宽度为3x3,可以在所有高度和宽度上滑动以生成每个滤镜。 41种不同的过滤器。结果是[批次,高度,宽度,41]或每像素41个类。

你的下一个转换是[3,3,20 * 41,41],这是错误的。没有20 * 41深度,你有41深度。

以下是您需要的更新:

weights = {
    'wc1': tf.Variable(tf.random_normal([3, 3, 1, 20])),
    'wc2': tf.Variable(tf.random_normal([3, 3, 20, 41])),
    'wc3': tf.Variable(tf.random_normal([3, 3, 41, 41])),
    'wc4': tf.Variable(tf.random_normal([3, 3, 41, 62])),
    'wc5': tf.Variable(tf.random_normal([3, 3, 62, 83])),
    'out': tf.Variable(tf.random_normal([1, 1, 83, n_classes]))
}

根据您是否正在进行max_pooling,无论是否填充,将在应用wc5后确定输出形状。

如果在wc1之后应用[1,2,2,1] max_pool,则[高度,宽度]从[28,28]减少到[14,14]。

如果在wc2之后还有另一个[1,2,2,1] max_pool,则[height,width]从[14,14]减少到[7,7]。

7不能被2整除。如果在没有填充的情况下应用wc3,则[高度,宽度]从[7,7]减小到[5,5]。为wc4做同样的事情 - > [3,3]再次为wc5 - > [1,1]。

最后 out 将在[batch,1,1,83]矩阵上,将其转换为[batch,1,1,class]矩阵!