猿问

模型返回错误 - ValueError:logits 和标签必须具有相同的形状

我正在使用基于 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

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


x train shape  (392436, 109)

y train shape  (392436,)

len of y labels 18

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


宝慕林4294392
浏览 114回答 2
2回答

守候你守候我

如果您有 18 个类别,则 的形状y_train应该是(392436, 18)。您可以tf.one_hot为此使用:import&nbsp;tensorflow&nbsp;as&nbsp;tf y_train&nbsp;=&nbsp;tf.one_hot(y_train,&nbsp;depth=len(labels))如果您从一列中获取值,我怀疑这不是“多标签”,而是多类。一个样本真的可以属于多个类别吗?如果没有,您还需要更改其他一些内容。例如,您需要 softmax 激活:model.add(Dense(len(labels),&nbsp;activation='softmax'))还有分类交叉熵损失:model.compile(loss='categorical_crossentropy',&nbsp;optimizer=sgd)

呼唤远方

你的标签是一维的......如果你的目标是操作多标签任务,你需要对它们进行一次性编码。您可以简单地使用tf.keras.utils.to_categorical(y, num_classes)通过这种方式,您可以将目标从 (n_sample) 转换为 (n_sample, num_classes)如果这是一个简单的多类问题,那么您有以下两种可能性:1 种可能性)如果您有 1D 整数编码目标,您可以使用sparse_categorical_crossentropy带有softmax激活的损失函数来生成概率n_class = 3n_features = 100n_sample = 1000X = np.random.randint(0,10, (n_sample,n_features))y = np.random.randint(0,n_class, n_sample)inp = Input((n_features,))x = Dense(128, activation='relu')(inp)out = Dense(n_class, activation='softmax')(x)model = Model(inp, out)model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])history = model.fit(X, y, epochs=3)pred = np.argmax(model.predict(X), 1)2 种可能性)如果您对目标进行了 one-hot 编码以获得 2D 形状(n_samples, num_classes),则可以categorical_crossentropy与softmax激活一起使用来生成概率n_class = 3n_features = 100n_sample = 1000X = np.random.randint(0,10, (n_sample,n_features))y = tf.keras.utils.to_categorical(np.random.randint(0,n_class, n_sample))inp = Input((n_features,))x = Dense(128, activation='relu')(inp)out = Dense(n_class, activation='softmax')(x)model = Model(inp, out)model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])history = model.fit(X, y, epochs=3)pred = np.argmax(model.predict(X), 1)
随时随地看视频慕课网APP

相关分类

Python
我要回答