Python模型训练出现ValueError:logits与labels形状不匹配
logits 和 labels 形状不匹配错误:((None, 10) vs (None, 1)) 错误核心原因
你的模型输出层维度为10(对应(None,10)的logits),但训练标签维度是1((None,1)),同时使用了binary_crossentropy损失函数,三者不匹配导致报错。
针对性解决方案
场景1:实际做多分类任务(10个类别)
如果任务是区分10个不同类别,调整损失函数和标签格式即可:
- 若标签是独热编码格式(每个样本标签为长度10的向量,仅对应类别位为1):
- 模型编译时使用
categorical_crossentropy损失函数 - 模型最后一层保持
Dense(10, activation='softmax')
- 模型编译时使用
- 若标签是整数索引格式(每个样本标签为0-9的单个整数,对应
(None,1)形状):- 模型编译时使用
sparse_categorical_crossentropy损失函数 - 模型最后一层保持
Dense(10, activation='softmax')
- 模型编译时使用
示例代码:
# 模型最后一层(多分类输出) model.add(Dense(10, activation='softmax')) # 标签为整数索引时编译 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 标签为独热编码时编译 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
场景2:实际做二分类任务
如果任务是区分两个类别,需要调整模型输出层:
- 模型最后一层改为输出维度1,激活函数用
sigmoid - 保持
binary_crossentropy损失函数,标签(None,1)的形状无需修改
示例代码:
# 修改模型最后一层为二分类输出 model.add(Dense(1, activation='sigmoid')) # 编译模型(损失函数保持binary_crossentropy) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
错误日志参考
第1轮训练/共100轮
ValueError Traceback (most recent call last)
在<cell line: 1>()中
----> 1 model_history=classifier.fit(X_train,Y_train,batch_size=100,validation_split=0.2,epochs = 100)1 frames
/usr/local/lib/python3.9/dist-packages/keras/engine/training.py in tf__train_function(iterator)
13 try:
14 do_return = True
---> 15 retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope)
16 except:
17 do_return = FalseValueError: 用户代码中出现错误:
File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 1284, in train_function * return step_function(self, iterator) File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 1268, in step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 1249, in run_step ** outputs = model.train_step(data) File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 1051, in train_step loss = self.compute_loss(x, y, y_pred, sample_weight) File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 1109, in compute_loss return self.compiled_loss( File "/usr/local/lib/python3.9/dist-packages/keras/engine/compile_utils.py", line 265, in __call__ loss_value = loss_obj(y_t, y_p, sample_weight=sw) File "/usr/local/lib/python3.9/dist-packages/keras/losses.py", line 142, in __call__ losses = call_fn(y_true, y_pred) File "/usr/local/lib/python3.9/dist-packages/keras/losses.py", line 268, in call ** return ag_fn(y_true, y_pred, **self._fn_kwargs) File "/usr/local/lib/python3.9/dist-packages/keras/losses.py", line 2156, in binary_crossentropy backend.binary_crossentropy(y_true, y_pred, from_logits=from_logits), File "/usr/local/lib/python3.9/dist-packages/keras/backend.py", line 5707, in binary_crossentropy return tf.nn.sigmoid_cross_entropy_with_logits( ValueError: `logits` and `labels` must have the same shape, received ((None, 10) vs (None, 1)).ValueError:
logitsandlabelsmust have the same shape, received ((None, 10) vs (None, 1)).
内容的提问来源于stack exchange,提问作者Balasubramanian Vellaichamy

