我想使用FaceNet架构的最后一层,其中包含以下三个最终层:
Dropout (Dropout) (None, 1792)
Bottleneck (Dense) (None, 128)
Bottleneck_BatchNorm (BatchNorm) (None, 128)
我想添加一个L2归一化的附加层,像这样:
norm = FRmodel.outputsnorm = Lambda(lambda x: K.l2_normalize(x, axis=1)), name="Normalization")(norm)
现在,最后几层看起来像这样:
Dropout (Dropout) (None, 1792)
Bottleneck (Dense) (None, 128)
Bottleneck_BatchNorm (BatchNorm) (None, 128)
Normalization (Lambda) (1, None, 128)
我的问题是,为什么L2归一化的维度会从(None, 128)
变为(1, None, 128)
?因为这个原因,我无法训练我的模型,因为输出不匹配。如果我尝试在不添加归一化的情况下训练模型,一切都运行良好。
回答:
这是因为Keras模型的outputs
属性返回一个输出张量的列表(即使你的模型只有一个输出层)。因此,你创建的Lambda
层被应用于这个列表,而不是列表中的单个输出张量。要解决这个问题,请提取该列表的第一个元素,然后将Lambda
层应用于它:
norm = FRmodel.outputs[0]norm = Lambda(...)(norm)