繁体   English   中英

TensorFlow CNN教程:如何编辑顶层以进行本地连接?

[英]TensorFlow CNN Tutorial: How to edit top layer to be locally connected?

我有一些机器学习和python的背景,但我只是学习TensorFlow。 我正在阅读深度卷积神经网络教程 ,教我自己如何使用它进行图像分类。 一路上有一个练习,我很难完成。

练习:推理()中的模型体系结构与cuda-convnet中指定的CIFAR-10模型略有不同。 特别是,Alex的原始模型的顶层是本地连接的,并没有完全连接。 尝试编辑体系结构以准确再现顶层中的本地连接体系结构。

练习引用cifar10.py模型中的inference()函数。 第二层到最后一层(称为local4)的形状为[384,192],顶层的形状为[192,NUM_CLASSES],其中NUM_CLASSES = 10。 我认为我们要编辑的代码位于定义顶层的代码中的某个位置:

with tf.variable_scope('softmax_linear') as scope:
    weights = _variable_with_weight_decay('weights', [192, NUM_CLASSES],
                                      stddev=1/192.0, wd=0.0)
    biases = _variable_on_cpu('biases', [NUM_CLASSES],
                          tf.constant_initializer(0.0))
    softmax_linear = tf.add(tf.matmul(local4, weights), biases,name=scope.name
    _activation_summary(softmax_linear)

但我没有看到任何代码确定层之间连接的可能性,因此我不知道如何将模型从完全连接更改为本地连接。 有人知道怎么做吗?

我也在做这个练习。 我会尝试正确解释我的方法,而不是仅仅给出解决方案。 值得回顾完全连接层的数学( https://www.tensorflow.org/get_started/mnist/beginners )。

因此,完全连接层的线性代数是:

y = W * x + b

其中x是n维输入向量, b是偏差的n维向量, W是权重的n- by- n矩阵。 y的i个元素是第i行W与元素乘以x的和

所以....如果你只想让y [i]连接到x [i-1]x [i]x [i + 1] ,你只需将第iW中的所有值都设置为零,除了该行的第(i-1),i和第(i + 1)列之外。 因此,要创建一个本地连接的图层,您只需将W强制为带状矩阵( https://en.wikipedia.org/wiki/Band_matrix ),其中波段的大小等于本地连接的邻域的大小想。 Tensorflow具有设置要绑定的矩阵的功能( tf.batch_matrix_band_part(input, num_lower, num_upper, name=None) )。

在我看来,这是练习中最简单的数学解决方案。

我会尝试回答你的问题,虽然我不是100%我也是正确的。

看看cuda-convnet 架构,我们可以看到TensorFlow和cuda-convnet实现在第二个池之后开始有所不同。

TensorFlow实现实现了两个完全连接的层和s​​oftmax分类器。

cuda-convnet实现了两个本地连接的层,一个完全连接的层和s​​oftmax分类器。

您包含的代码段仅指softmax分类器,实际上是在两个实现之间共享。 要使用TensorFlow重现cuda-convnet实现,我们必须用两个本地连接的层和一个完全连接的层替换现有的完全连接的层。

由于Tensor没有本地连接的图层作为SDK的一部分,我们必须找到一种使用现有工具实现它的方法。 这是我尝试实现第一个本地连接的层:

  with tf.variable_scope('local3') as scope:
    shape = pool2.get_shape()
    h = shape[1].value
    w = shape[2].value

    sz_local = 3 # kernel size
    sz_patch = (sz_local**2)*shape[3].value
    n_channels = 64

    # Extract 3x3 tensor patches
    patches = tf.extract_image_patches(pool2, [1,sz_local,sz_local,1], [1,1,1,1], [1,1,1,1], 'SAME')
    weights = _variable_with_weight_decay('weights', shape=[1,h,w,sz_patch, n_channels], stddev=5e-2, wd=0.0)
    biases = _variable_on_cpu('biases', [h,w,n_channels], tf.constant_initializer(0.1))

    # "Filter" each patch with its own kernel 
    mul = tf.multiply(tf.expand_dims(patches, axis=-1), weights)
    ssum = tf.reduce_sum(mul, axis=3)
    pre_activation = tf.add(ssum, biases)
    local3 = tf.nn.relu(pre_activation, name=scope.name)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM