我正在使用keras构建多输出分类模型。我的数据集例如
[x1,x2,x3,x4,y1,y2,y3]
x1,x2,x3是特征,y1,y2,y3是标签,y1,y2,y3是多类。
我已经建立了一个模型(我已经隐藏了一些隐藏层):
def baseline_model(input_dim=23,output_dim=3):
model_in = Input(shape=(input_dim,))
model = Dense(input_dim*5,kernel_initializer='uniform',input_dim=input_dim)(model_in)
model = Activation(activation='relu')(model)
model = Dropout(0.5)(model)
...................
model = Dense(output_dim,kernel_initializer='uniform')(model)
model = Activation(activation='sigmoid')(model)
model = Model(model_in,model)
model.compile(optimizer='adam',loss='binary_crossentropy', metrics=['accuracy'])
return model
然后我尝试使用keras方法来支持分类:
estimator = KerasClassifier(build_fn=baseline_model)
estimator.fit()
estimator.predict(df[0:10])
但是我发现结果不是多重输出,只能输出一个维度。
[0,0,0,0,0,0,0,0,0,0]
那么对于多输出分类问题,我们不能使用KerasClassifier函数来学习它吗?
答案 0 :(得分:1)
您不需要将模型包装在KerasClassifier中。该包装器使您可以将Keras模型与Scikit-Learn结合使用。模型的类型(分类器,回归,多类分类器等)最终取决于模型最后一层的形状和激活状态。
您可以简单地使用Keras的model.fit()函数。确保将数据传递到函数中。您可以在此处查看关于fit函数的更多信息:https://keras.io/models/model/#fit
您的损失也被设置为binary_crossentropy。对于多类问题,您将需要使用categorical_crossentropy。
model.compile(optimizer='adam',loss='categorical_crossentropy', metrics=['accuracy'])
据我所知,此模型并不是Keras所说的多输出。对于多输出,您尝试从多个不同的层获取输出,并可能对其应用不同的损失函数。
根据您问题中的设置,您将可以使用Keras顺序模型而不是功能模型。如果可以的话,Keras建议使用顺序模型,因为它更简单。 https://keras.io/getting-started/sequential-model-guide/