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