为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

宝慕林4294392 2023-07-11 14:12:52
我正在使用基于 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如何修复代码以避免此错误?
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

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

import tensorflow as tf

y_train = tf.one_hot(y_train, depth=len(labels))

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

model.add(Dense(len(labels), activation='softmax'))

还有分类交叉熵损失:

model.compile(loss='categorical_crossentropy', optimizer=sgd)


查看完整回答
反对 回复 2023-07-11
?
呼唤远方

TA贡献1856条经验 获得超11个赞

你的标签是一维的......如果你的目标是操作多标签任务,你需要对它们进行一次性编码。您可以简单地使用


tf.keras.utils.to_categorical(y, num_classes)


通过这种方式,您可以将目标从 (n_sample) 转换为 (n_sample, num_classes)


如果这是一个简单的多类问题,那么您有以下两种可能性:


1 种可能性)如果您有 1D 整数编码目标,您可以使用sparse_categorical_crossentropy带有softmax激活的损失函数来生成概率


n_class = 3

n_features = 100

n_sample = 1000


X = 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 = 3

n_features = 100

n_sample = 1000


X = 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)


查看完整回答
反对 回复 2023-07-11
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信