我一直在使用TensorFlow中卷积网的这个例子进行编码,我对这种权重分配感到困惑:
weights = { # 5x5 conv, 1 input, 32 outputs '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])) }
我们怎么知道'wd1'权重矩阵应该有7 x 7 x 64行?
它后来用于重塑第二个卷积层的输出:
# Fully connected layer # Reshape conv2 output to fit dense layer input dense1 = tf.reshape(conv2, [-1, _weights['wd1'].get_shape().as_list()[0]]) # Relu activation dense1 = tf.nn.relu(tf.add(tf.matmul(dense1, _weights['wd1']), _biases['bd1']))
根据我的数学,汇集第2层(conv2输出)有4 x 4 x 64个神经元.
我们为什么要重塑为[-1,7*7*64]?
从一开始就在工作:
输入_X
的大小[28x28x1]
(忽略批量维度).28x28灰度图像.
第一个卷积层使用PADDING=same
,因此它输出一个28x28层,然后传递给max_pool
with k=2
,它将每个维度减少两倍,从而产生14x14的空间布局.conv1有32个输出 - 所以现在是完整的每个示例张量[14x14x32]
.
这是重复的conv2
,有64个输出,导致a [7x7x64]
.
tl; dr:图像以28x28开始,每个maxpool在每个维度中将其减少两倍.28/2/2 = 7.