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)
我有两个预测模型;确定性和深度学习网络。我想合并这两个模型,其中确定性模型为预测提供基础,深度学习进行必要的调整。这是一个浮点输出的回归问题。
深度学习网络的最后一层是:
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)