Tensorflow不共享变量

时间:2016-01-18 15:34:26

标签: deep-learning tensorflow

我们修改了CIFAR-10 tutorial(卷积神经网络)以在Adience数据库上运行以进行面部性别分类。我们阅读了here" 参数共享"作为假设,无论图像中的位置如何,一个补丁特征都是有用的。不同的是:

  

请注意,有时参数共享假设可能没有意义。当ConvNet的输入图像具有某些特定的中心结构时尤其如此,例如,我们应该期望在图像的一侧应该学习完全不同的特征而不是另一侧。一个实际的例子是当输入是时已经在图像中居。

目标:因此我们想关闭CNN的参数共享。

代码

我认为CIFAR-10教程使用参数共享def inference(images)函数中的这部分代码似乎必须对它做一些事情:

biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0))
bias = tf.nn.bias_add(conv, biases)

哪个电话:

def _variable_on_cpu(name, shape, initializer):
    with tf.device('/cpu:0'):
        var = tf.get_variable(name, shape, initializer=initializer)
    return var

问题

  • 参数共享确实发生在CIFAR-10教程中吗?
  • 您能否告诉我们,我们是否正在查看正确的代码以关闭参数共享或在哪里查看?
  • 欢迎任何其他帮助/建议,因为我们不知道从哪里开始。

1 个答案:

答案 0 :(得分:5)

教程中的CIFAR-10 model使用前两个图层中的“参数共享”('conv1''conv2')。使用tf.nn.conv2d()运算符隐含了共享,它有效地从输入图像中提取补丁并将相同的过滤器(即共享参数)应用于每个补丁。

当你有一组卷积层时,“关闭”参数共享并非易事:相反,你必须用不同类型的层替换它们。最简单的改变可能是用完全连接的层替换卷积层,例如,使用tf.nn.relu_layer()(如'local3''local4'图层),它在内部执行矩阵乘法并为每个输入神经元维护单独的参数。

NB 完全连接的图层通常过度参数化以用于视觉任务,更合适的中间点是使用"local receptive field",(非正式地)为每个输入维护单独的参数(如在完全连接的层中),但仅组合来自“附近”输入的值以产生输出(如在卷积中)。遗憾的是,TensorFlow尚未包含本地接受字段的实现,但adding support for them将是一个有用的项目。