Keras回归器问题与多重输出

2024-09-29 23:18:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的代码是:

# 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]

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

谢谢


Tags: theinputoutputdatamodelvarcreateval
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抱怨没有使用tensor 我希望这有助于如果不让我知道你的数据的维度看起来像

问题是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

相关问题 更多 >

    热门问题