我们对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)
哪个调用:
def _variable_on_cpu(name, shape, initializer):
with tf.device('/cpu:0'):
var = tf.get_variable(name, shape, initializer=initializer)
return var
本教程中的CIFAR-10模型在前两层('conv1'
和'conv2'
)中使用“参数共享” 。共享是通过使用tf.nn.conv2d()
运算符来暗示的,该运算符可以有效地从输入图像中提取色块并将相同的滤镜(即,共享参数)应用于每个色块。
当您具有一组卷积层时,“关闭”参数共享并不是一件容易的事:相反,您必须将它们替换为其他类型的层。最简单的更改可能是用完全连接的层替换卷积层,例如通过使用tf.nn.relu_layer()
(如'local3'
和'local4'
层中一样),该层在内部执行矩阵乘法并为每个输入神经元维护单独的参数。
注意:对于视觉任务,全连接层通常会被过度参数化,更合适的中间立场是使用“本地接收场”,该字段(非正式地)为每个输入维护单独的参数(例如在全连接层中),但是仅合并“附近”输入中的值以产生输出(如卷积)。不幸的是,TensorFlow还没有包含本地接受域的实现,但是添加对它们的支持将是一个有用的项目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句