我正试图理解在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
将消失,因为sum
与axis=1
的功能。但由于它使用keepdims=True
,因此轴将保留为1。
现在,输出形状实际上没有做任何事情。如果你使用Tensorflow,这个函数是没有必要的。但如果你正在使用Theano,你就需要它,因为Theano无法从计算中理解形状。
这个函数只是返回形状(batch,1)
,因为函数的创建者知道这是输出形状。
此输出形状函数的输入为[shapeOfProcessed_a, shapeOfProcessed_b]
。它们只是从一个输入形状中获取批量大小。