模型返回错误 - ValueError:logits 和标签必须具有相同的形状 ((None, 18) vs (None, 1))

Los*_*oul 3 python keras tensorflow

我正在使用基于 keras 的多标签分类器。我创建了一个加载训练和测试数据的函数,然后在函数本身内处理/拆分 X/Y。我在运行模型时遇到错误,但不太确定其含义:

这是我的代码:

def KerasClassifer(df_train, df_test):
  X_train = df_train[columnType].copy()
  y_train = df_train[variableToPredict].copy()
  labels = y_train.unique()
  print(X_train.shape[1])
  #using keras to do classification
  from tensorflow import keras
  from tensorflow.keras.models import Sequential
  from tensorflow.keras.layers import Dense, Dropout, Activation
  from tensorflow.keras.optimizers import SGD

  model = Sequential()
  model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
  model.add(Dropout(0.1))
  model.add(Dense(600, activation='relu'))
  model.add(Dropout(0.1))
  model.add(Dense(len(labels), activation='sigmoid'))

  sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
  model.compile(loss='binary_crossentropy',
                optimizer=sgd)

  model.fit(X_train, y_train, epochs=5, batch_size=2000)

  preds = model.predict(X_test)
  preds[preds>=0.5] = 1
  preds[preds<0.5] = 0

  score = model.evaluate(X_test, y_test, batch_size=2000)
  score
Run Code Online (Sandbox Code Playgroud)

以下是我的数据的属性(如果有帮助的话):

x train shape  (392436, 109)
y train shape  (392436,)
len of y labels 18
Run Code Online (Sandbox Code Playgroud)

如何修复代码以避免此错误?

Nic*_*ais 5

如果您有 18 个类别,则 的形状y_train应该是(392436, 18)。您可以tf.one_hot为此使用:

import tensorflow as tf

y_train = tf.one_hot(y_train, depth=len(labels))
Run Code Online (Sandbox Code Playgroud)

如果您从一列中获取值,我怀疑这不是“多标签”,而是多类。一个样本真的可以属于多个类别吗?如果没有,您还需要更改其他一些内容。例如,您需要 softmax 激活:

model.add(Dense(len(labels), activation='softmax'))
Run Code Online (Sandbox Code Playgroud)

还有分类交叉熵损失:

model.compile(loss='categorical_crossentropy', optimizer=sgd)
Run Code Online (Sandbox Code Playgroud)