Tensorflow不共享变量

Num*_*uis 7 deep-learning tensorflow

我们修改了CIFAR-10教程(卷积神经网络),以便在Adience数据库上运行面部上的性别分类.我们在这里读到," 参数共享 "非常有用,因为无论图像中的位置如何,一个补丁功能都是有用的.除了:

请注意,有时参数共享假设可能没有意义.当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)
Run Code Online (Sandbox Code Playgroud)

哪个电话:

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

  • 参数共享确实在CIFAR-10教程怎么回事?
  • 您能否告诉我们,我们是否正在查看关闭参数共享的正确代码或其他要查看的内容?
  • 欢迎任何其他帮助/建议,因为我们不知道从哪里开始.

mrr*_*rry 5

本教程中的CIFAR-10模型在前两层('conv1''conv2')中使用"参数共享" .通过使用tf.nn.conv2d()操作符来暗示共享,其有效地从输入图像中提取补丁并将相同的过滤器(即共享参数)应用于每个补丁.

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

NB完全连接的层通常过度参数化用于视觉任务,更合适的中间点是使用"本地接收场",其(非正式地)为每个输入维护单独的参数(如在完全连接的层中),但是仅组合来自"附近"输入的值以产生输出(如在卷积中).遗憾的是,TensorFlow尚未包含本地接受字段的实现,但添加对它们的支持将是一个有用的项目.