无法理解lambda层如何在keras中工作?

时间:2016-11-09 04:35:18

标签: lambda deep-learning keras

我正在尝试理解在keras存储库中以example的形式提供的Siamese网络。

网络通过以下行

将lambda作为输出添加到模型中
model = Model(input=[input_a, input_b], output=distance)

其中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)在这个函数中实现了什么? / p>

1 个答案:

答案 0 :(得分:0)

此lambda图层的输入为# image paths img_paths = ["TransitionScreen.png", "TransitionScreen1.png", ...] wavetransitions = [] for img_path in img_paths: # loads, resizes and adds image to wavetransitions list img = pygame.image.load(img_path) img = pygame.transform.scale(img, (WIDTH, HEIGHT)) wavetransitions.append(img) # as rander2 is the index+1 of the image, you can simply do screen2.blit(wavetransitions[rander2 - 1], (0, 0))

它运行的函数是[processed_a, processed_b],它传递的是euclidean_distance。从输入中获取K.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True))x

这是唯一真正的处理过程。这也是规则形状的一个。

输入似乎是y的形状,输出将是(batch, n)。由于(batch,1)函数nsum将消失。但由于它使用axis=1,因此轴将保留为1.

现在,输出形状并没有真正做任何事情。如果您正在使用Tensorflow,则无需使用此功能。但如果您正在使用Theano,则需要它,因为Theano无法理解计算中的形状。

此函数只返回形状keepdims=True,因为函数的创建者知道这是输出形状。

此输出形状函数的输入为(batch,1)。他们只是从一个输入形状中获取批量大小。