如何在 Keras 的 Lambda 层中指定 output_shape 参数

数据挖掘 Python 深度学习 喀拉斯 张量流
2022-03-12 03:30:36

我不明白如何在 Keras/Tensorflowoutput_shape的层中指定参数。文档Lambda

output_shape:函数的预期输出形状。如果未明确提供,则可以推断此参数。可以是元组或函数。如果是元组,它只指定第一个维度;假设样本维度与输入相同:output_shape = (input_shape[0], ) + output_shape或者,输入是None并且样本维度也是Noneoutput_shape = (None, ) + output_shape

如果我们使用元组,我应该如何解释这两个表达式?

output_shape = (input_shape[0], ) + output_shape

output_shape = (None, ) + output_shape

1个回答

假设您将 output_shape 作为一个元组传入(50, 50, 10),我们可以在其中将值(高度、宽度、通道)` 传递给 lambda 层:

your_layer = tf.keras.layers.Lambda(lambda x: x, output_shape=(50, 50, 3))

文档部分:

如果是元组,它只指定第一个维度;

意味着batch维度本身是简单的结转,不变。

如果你batch_size=3在训练期间有,例如,传入的张量your_layer可能是(3, n, p, q),在哪里n p并且q可能是任何东西,但是该层预计会产生一个形状(3, 50, 50, 10)因此0维度保持不变,我们将其与您的output_shape:

(3,) + (50, 50, 10) -> (3, 50, 50, 10)

这对应于表达式:output_shape = (input_shape[0], ) + output_shape,因此我们看到这是训练期间传入批张量input_shape的真实形状,因为我们只使用批维度来生成层的传出批张量

对于第二个表达式,它实际上是一样的,但如果您没有提供批处理形状,Tensorflow 和 Keras 将其表示为可以是任何东西,并将其存储为None. 所以在这种情况下,你会得到:

(None,) + (50, 50, 10) -> (None, 50, 50, 10)