我刚刚开始在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]))
}
感觉就像是在做错事。
答案 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]矩阵!