【问题标题】:Problem with KerasRegressor & multiple outputKerasRegressor 和多输出的问题
【发布时间】:2020-11-07 11:10:55
【问题描述】:

我有 3 个输入和 3 个输出。我正在尝试使用 KerasRegressor 和 cross_val_score 来获得我的预测分数。

我的代码是:

# Function to create model, required for KerasClassifier
def create_model():

    # create model
    # #Start defining the input tensor:
    input_data = layers.Input(shape=(3,))

    #create the layers and pass them the input tensor to get the output tensor:
    layer = [2,2]
    hidden1Out = Dense(units=layer[0], activation='relu')(input_data)
    finalOut = Dense(units=layer[1], activation='relu')(hidden1Out)

    u_out = Dense(1, activation='linear', name='u')(finalOut)   
    v_out = Dense(1, activation='linear', name='v')(finalOut)   
    p_out = Dense(1, activation='linear', name='p')(finalOut)   

    #define the model's start and end points
    model = Model(input_data,outputs = [u_out, v_out, p_out])    

    model.compile(loss='mean_squared_error', optimizer='adam')

    return model

#load data
...

input_var = np.vstack((AOA, x, y)).T
output_var = np.vstack((u,v,p)).T

# evaluate model
estimator = KerasRegressor(build_fn=create_model, epochs=num_epochs, batch_size=batch_size, verbose=0)
kfold = KFold(n_splits=10)

我试过了:

results = cross_val_score(estimator, input_var, [output_var[:,0], output_var[:,1], output_var[:,2]], cv=kfold)

results = cross_val_score(estimator, input_var, [output_var[:,0:1], output_var[:,1:2], output_var[:,2:3]], cv=kfold)

results = cross_val_score(estimator, input_var, output_var, cv=kfold)

我收到如下错误消息:

详情: ValueError:检查模型目标时出错:您传递给模型的 Numpy 数组列表不是模型预期的大小。预计会看到 3 个数组,但得到了以下 1 个数组的列表:[array([[ 0.69945297, 0.13296847, 0.06292328],

ValueError: 发现样本数量不一致的输入变量:[72963, 3]

那么我该如何解决这个问题呢?

谢谢。

【问题讨论】:

    标签: python keras deep-learning


    【解决方案1】:

    问题是层Input的输入维度不是3,而是3*feature_dim。下面是一个工作示例

    import numpy as np
    import tensorflow as tf 
    from tensorflow.keras.models import Model
    from tensorflow.keras.layers import Input,Dense,Concatenate
    from sklearn.model_selection import cross_val_score,KFold
    from tensorflow.keras.wrappers.scikit_learn import KerasRegressor
    
    
    def create_model():
    
        feature_dim = 10
        input_data = Input(shape=(3*feature_dim,))
    
        #create the layers and pass them the input tensor to get the output tensor:
        layer = [2,2]
        hidden1Out = Dense(units=layer[0], activation='relu')(input_data)
        finalOut = Dense(units=layer[1], activation='relu')(hidden1Out)
    
        u_out = Dense(1, activation='linear', name='u')(finalOut)   
        v_out = Dense(1, activation='linear', name='v')(finalOut)   
        p_out = Dense(1, activation='linear', name='p')(finalOut)   
    
        output = Concatenate()([u_out,v_out,p_out])
        #define the model's start and end points
        model = Model(inputs=input_data,outputs=output)    
    
        model.compile(loss='mean_squared_error', optimizer='adam')
    
        return model
    
    x_0 = np.random.rand(100,10)
    x_1 = np.random.rand(100,10)
    x_2 = np.random.rand(100,10)
    input_val = np.hstack([x_0,x_1,x_2])
    
    u = np.random.rand(100,1)
    v = np.random.rand(100,1)
    p = np.random.rand(100,1)
    output_val = np.hstack([u,v,p])
    
    estimator = KerasRegressor(build_fn=create_model,nb_epoch=3,batch_size=8,verbose=False)
    kfold = KFold(n_splits=3, random_state=0)
    results = cross_val_score(estimator=estimator,X=input_val,y=output_val,cv=kfold)
    print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))
    

    如您所见,由于输入维度为10,在create_model 内,我指定feature_dim

    【讨论】:

      【解决方案2】:

      我不知道您的数据是什么样的,但我认为如何将它们堆叠在一起。 我尝试了以下程序

      input_var = np.random.randint(0,1, size=(100,3))
      x = np.sum(np.sin(input_var),axis=1,keepdims=True) # (100,1)
      y = np.sum(np.cos(input_var),axis=1,keepdims=True) # (100,1)
      z = np.sum(np.sin(input_var)+ np.cos(input_var),axis=1, keepdims=True) # (100,1)
      
      output_var = np.hstack((x,y,z))
      # evaluate model
      estimator = KerasRegressor(build_fn=create_model, epochs=10, batch_size=8, verbose=0)
      kfold = KFold(n_splits=10)
      results = cross_val_score(estimator, input_var, output_var, cv=kfold)
      

      我得到的唯一问题是 Tensorlfow 抱怨不使用张量 如果不让我知道您的数据维度是什么样的,我希望这会有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-15
        • 2021-04-03
        • 2016-12-23
        • 2020-10-27
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        相关资源
        最近更新 更多