我们修改了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
答案 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将是一个有用的项目。