Tensorflow CNN MNIST示例,重量尺寸

Tensorflow CNN MNIST示例,重量尺寸,tensorflow,conv-neural-network,Tensorflow,Conv Neural Network,我刚开始用Tensorflow编程,虽然我对神经网络的概念已经非常熟悉(我知道,怪我的大学很奇怪)。我一直在试图改变的实现,以使我自己的设计工作。我的问题是有关权重初始化的: 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

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

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 conv层,我应该将之前的输出数量与该层中的过滤器数量相乘,如下所示:

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

让我们以wc1为例[3,3,1,20]。这意味着它将有20个不同的过滤器,每个过滤器将跨越1个深度,覆盖3x3的高度x宽度。每个过滤器将通过整个图像,覆盖所有深度。因为有20个不同的过滤器将创建[batch,height,width,20]的输出张量

从概念上讲,我们有机会将像素强度的深度改为前一个像素周围每3x3像素20类

如果我们应用[3,3,20,41],我们将创建41个过滤器,其中每个过滤器的深度为20,高度x宽度为3x3,在所有高度和宽度上滑动以生成41个不同的过滤器。结果是[batch,height,width,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]))
}
应用wc5后,是否填充将决定输出形状,这取决于您是否正在进行最大池(max_pooling)操作

如果在wc1之后应用[1,2,2,1]max_池,则[height,width]将从[28,28]减少到[14,14]

如果wc2之后有另一个[1,2,2,1]最大值池,则[height,width]从[14,14]减少到[7,7]

7不能被2整除。如果应用wc3时没有填充,则[height,width]从[7,7]减少到[5,5]。对wc4->[3,3]和wc5->[1,1]执行相同的操作


最后,out将位于[batch,1,1,83]矩阵上,该矩阵将其转换为[batch,1,1,class]矩阵

是啊,你做错了什么

您的输入矩阵为[批次、高度、宽度、深度],其中深度最初为1

让我们以wc1为例[3,3,1,20]。这意味着它将有20个不同的过滤器,每个过滤器将跨越1个深度,覆盖3x3的高度x宽度。每个过滤器将通过整个图像,覆盖所有深度。因为有20个不同的过滤器将创建[batch,height,width,20]的输出张量

从概念上讲,我们有机会将像素强度的深度改为前一个像素周围每3x3像素20类

如果我们应用[3,3,20,41],我们将创建41个过滤器,其中每个过滤器的深度为20,高度x宽度为3x3,在所有高度和宽度上滑动以生成41个不同的过滤器。结果是[batch,height,width,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]))
}
应用wc5后,是否填充将决定输出形状,这取决于您是否正在进行最大池(max_pooling)操作

如果在wc1之后应用[1,2,2,1]max_池,则[height,width]将从[28,28]减少到[14,14]

如果wc2之后有另一个[1,2,2,1]最大值池,则[height,width]从[14,14]减少到[7,7]

7不能被2整除。如果应用wc3时没有填充,则[height,width]从[7,7]减少到[5,5]。对wc4->[3,3]和wc5->[1,1]执行相同的操作


最后,out将位于[batch,1,1,83]矩阵上,该矩阵将其转换为[batch,1,1,class]矩阵

谢谢你解释整件事!你帮了我很多忙。谢谢你解释了整件事!你帮了我很多忙。