【问题标题】:Keras Lambda layer to perform a maximum and output in (?, 1) shapeKeras Lambda 层执行最大值并以 (?, 1) 形状输出
【发布时间】:2020-10-11 07:24:52
【问题描述】:

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

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

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) 形状?

【问题讨论】:

    标签: python tensorflow keras concatenation keras-layer


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2018-02-27
      • 2017-05-25
      相关资源
      最近更新 更多