用于多标签问题的 keras 模型的 scikit 学习链分类器的拟合方法错误

Posted

技术标签:

【中文标题】用于多标签问题的 keras 模型的 scikit 学习链分类器的拟合方法错误【英文标题】:Error in fit method of scikit learn chain classifier with a keras model for a multilabel problem 【发布时间】:2020-10-05 03:06:59 【问题描述】:

我正在为使用 KerasClassifier 模型的多类问题构建链分类器。我有 17 个标签作为分类目标,X_train 的形状是 (111300,107),y_train 是 (111300,17) 我的代码在这里:

def create_model():
  input_size=length_long_sentence
  embedding_size=128
  lstm_size=64
  output_size=len(unique_tag_set)
    #----------------------------Model -------------------------------
  current_input=Input(shape=(input_size,)) 
  emb_current = Embedding(vocab_size, embedding_size, input_length=input_size)(current_input)
  out_current=Bidirectional(LSTM(units=lstm_size))(emb_current )
  #out_current = Reshape((1,2*lstm_size))(out_current)
  output = Dense(units=len(unique_tag_set), activation='softmax')(out_current)
  model = Model(inputs=current_input, outputs=output)
  model.compile(optimizer='Adam', loss='categorical_crossentropy', metrics=['accuracy'])
  print(model.summary())
  return model

   model = KerasClassifier(build_fn=create_model, epochs=1,batch_size=256)
   print(type(model))
   chain=ClassifierChain(model, order='random', random_state=42)
   history=chain.fit(X_train, y_train)

模型摘要在这里:

当尝试在 ClassifierChain 上使用 fit 方法时,我收到此错误:

任何人都可以指导我这个错误以及什么是 (None,2)?

【问题讨论】:

我认为softmax不适合多标签设置,chainclassifier就是这种情况。 【参考方案1】:

来自链分类器的文档:

一种将二元分类器排列成链的多标签模型。

因此,使用最后一层中的单个节点将您的 keras 模型转换为二元分类器,并将损失函数作为 binary_crossentropy

【讨论】:

非常感谢。是的,你是对的。通过将 keras 模型更改为二元分类器,链式分类器现在可以工作了。 很高兴能够帮助您。你能接受答案吗? 我在训练时收到警告,因为输入形状为 (none,107),而在链式分类器中,二进制分类器以链式链接,一个二进制分类器输出用作下一个二进制分类器的输入所以对于下一个二元分类器,输入形状将是 (none,108) 等等。 @Aizayousaf 我遇到了同样的问题,如果我有六个标签,那么如何设置我的 y_train 的维度?谢谢 你要使用链式分类器吗?

以上是关于用于多标签问题的 keras 模型的 scikit 学习链分类器的拟合方法错误的主要内容,如果未能解决你的问题,请参考以下文章

多标签分类:keras自定义指标

为啥scikit learn的平均精度分数返回nan?

从磁盘加载包含预训练 Keras 模型的 scikit-learn 管道

使用 scikit-learn 对具有多个输入的 Keras 模型进行交叉验证

Keras Multi-class 多标签图像分类:处理独立和从属标签和非二进制输出的混合

如何将参数传递给 Scikit-Learn Keras 模型函数