无法理解lambda层在keras中的工作原理



我正试图理解在keras存储库中给出的Siamese网络作为示例。

网络通过以下行

向模型添加一个lambda作为输出
model = Model(input=[input_a, input_b], output=distance)

其中距离定义为lambda =

distance = Lambda(euclidean_distance, output_shape=eucl_dist_output_shape)([processed_a, processed_b])

另外两个函数定义为:

def euclidean_distance(vects):
    x, y = vects
    return K.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True))

def eucl_dist_output_shape(shapes):
    shape1, shape2 = shapes
    return (shape1[0], 1)

现在我无法理解这个lambda层传递给下一层的是什么

Keras定义lambda为

Lambda(function,output_shape,arguments)

所以我猜来自前一层的输入是由函数处理的,并作为所需形状的输出返回。现在,根据我的说法,当应用函数欧几里德距离时,将返回一个行向量,表示当前批处理中每对的距离。所以这个结果的维度应该是

batch_size * 1

现在函数eucl_dist_output_shape会改变它的形状,我不能理解的是这个函数在这里到底做了什么,它在计算什么,return (shape1[0],1)在这个函数中实现了什么?

这个lambda层的输入是[processed_a, processed_b]

它运行的函数是euclidean_distance,传递的是K.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True))。为x, y取自输入。

这是唯一正在进行的实际处理。这个也是控制形状的。

输入似乎是形状(batch, n),输出将是(batch,1)n将消失,因为sumaxis=1的功能。但由于它使用keepdims=True,因此轴将保留为1。

现在,输出形状实际上没有做任何事情。如果你使用Tensorflow,这个函数是没有必要的。但如果你正在使用Theano,你就需要它,因为Theano无法从计算中理解形状。

这个函数只是返回形状(batch,1),因为函数的创建者知道这是输出形状。

此输出形状函数的输入为[shapeOfProcessed_a, shapeOfProcessed_b]。它们只是从一个输入形状中获取批量大小。

相关内容

  • 没有找到相关文章

最新更新