Keras Lambda 层执行最大值并以 (?, 1) 形状输出

Keras Lambda layer to perform a maximum and output in (?, 1) shape

我有两个预测模型;确定性和深度学习网络。我想合并这两个模型,其中确定性模型为预测提供基础,深度学习进行必要的调整。这是一个浮点输出的回归问题。

深度学习网络的最后一层是:

Dense(1, activation='linear',kernel_initializer=init) (previous_layer_output)

所以它的输出形状就是 (?, 1)。确定性模型的输出形状必须相同,我的合并层才能工作。

确定性模型采用形状为 (?, 10, 1) 的输入层,应取 10 个值中的最大值并以 (?, 1) 形状输出。

下面的代码采用 10 个切片并对它们执行 Maximum() ,效果非常好。然而它看起来很麻烦,我认为这不是正确的做法。

#print(x_test_scaled.shape[1:]) = (10, 1)

Det_Guess1 = Lambda(lambda x: x[:,0], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess2 = Lambda(lambda x: x[:,1], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess3 = Lambda(lambda x: x[:,2], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess4 = Lambda(lambda x: x[:,3], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess5 = Lambda(lambda x: x[:,4], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess6 = Lambda(lambda x: x[:,5], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess7 = Lambda(lambda x: x[:,6], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess8 = Lambda(lambda x: x[:,7], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess9 = Lambda(lambda x: x[:,8], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess10 = Lambda(lambda x: x[:,9], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)

Det_Guess = Maximum()([Det_Guess1, Det_Guess2, Det_Guess3, Det_Guess4,
                       Det_Guess5, Det_Guess6, Det_Guess7, Det_Guess8,
                       Det_Guess9, Det_Guess10])

#print(Det_Guess.shape) = (?, 1)

下面更简单的 Lambda 函数看起来很简洁,但由于其输出为标量形状而无法正常工作;

def find_max(x):
    K.max(x)
    return K.max(x)

Det_Guess= Lambda(find_max, input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)

# print(Det_Guess.shape) = ()

我尝试重塑,向这个更简单的 lambda 函数添​​加维度,但无法保持 (?) 样本维度,我总是最终失去它并且输出永远不会是 (?, 1) 形状。

如何构建一个外观整洁的图层,执行所需的操作,输出为 (?, 1) 形状?

解决这个问题,你可以这样尝试:

inp = Input((10,1))
Det_Guess= Lambda(lambda x: tf.reduce_max(x, axis=1))(inp)
model = Model(inp, Det_Guess)
model.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         [(None, 10, 1)]           0         
_________________________________________________________________
lambda_7 (Lambda)            (None, 1)                 0         
=================================================================

X = np.random.randint(0,1000, (100,10,1))
model.predict(X)