【问题标题】:Keras Deep Learning ValueError: logits and labels must have the same shape ((None, 2) vs (None, 1))Keras 深度学习 ValueError:logits 和标签必须具有相同的形状 ((None, 2) vs (None, 1))
【发布时间】:2026-01-22 10:15:01
【问题描述】:

我正在做一个模型来识别图像上的某些动物种类,现在我只有 0 和 1 个分类变量。

但是当我训练我的模型时,我得到了这个错误:

raise ValueError("logits and labels must have the same shape (%s vs %s)" %

    ValueError: logits and labels must have the same shape ((None, 2) vs (None, 1))

这是我的代码

especies = [0,1,1,0,0,0,0,1,1,1,1,0]
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(cv_img,especies)
x_train_numpy = np.array(x_train)
x_test_numpy = np.array(x_test)
y_train_numpy = np.array(y_train)
y_test_numpy = np.array(y_test)
x_train_numpy = x_train_numpy/255
x_test_numpy = x_test_numpy/255
model = Sequential() #CREA EL MODELO QUE VA A IR RECIBIENDO CAPAS...

# primer bloque de convolucion
model.add(Conv2D(32,(3,3),padding='same',input_shape=(32,32,3),activation='relu')) # agrega solo una capa
model.add(Conv2D(32,(3,3),activation='relu')) # padding no es necesario porque ya se agrego ceros en la anterior / input shape solo se agrega al principio
model.add(MaxPool2D(pool_size=(2,2))) # reduce la cantidad de data
model.add(Dropout(0.25)) # quiero que desconecte 25% de las conexiones

# segundo bloque de convolucion
model.add(Conv2D(64,(3,3),padding='same',activation='relu')) # ya no necesito input_shape
model.add(Conv2D(64,(3,3),activation='relu')) # padding no es necesario porque ya se agrego ceros en la anterior / input shape solo se agrega al principio
model.add(MaxPool2D(pool_size=(2,2))) # reduce la cantidad de data
model.add(Dropout(0.25)) # quiero que desconecte 25% de las conexiones

# TERCE BLOQUE DE CONVOLUCION
model.add(Conv2D(64,(3,3),padding='same',activation='relu')) # input shape solo se usa CUANDO la capa anterior es la data en BRUTO
model.add(Conv2D(64,(3,3),activation='relu')) # SEGUNDA CAPA
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))

# capa final
model.add(Flatten()) # esto es solo para transicion de la convolucion a  la capa densa
model.add(Dense(512,activation='relu')) # esta es un capa densa comun y corriente
model.add(Dropout(0.5)) # desconectar el 50% de conexiones
model.add(Dense(2,activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(x_train_numpy,y_train_numpy,epochs=10,batch_size=32, validation_data=(x_test_numpy,y_test_numpy),shuffle=True)

【问题讨论】:

标签: python image-processing keras deep-learning


【解决方案1】:

您正在使用 binary_crossentropy。因此,模型的输出层应该只包含 1 个神经元。计算结果是,如果输出值大于 0.5,则为 1。否则,输出为 0。您也可以调整该阈值。

要解决您的问题,请更改以下行

model.add(Dense(2,activation='sigmoid'))

model.add(Dense(1,activation='sigmoid'))

【讨论】:

  • 感谢它的工作!我的错误也是我有 0 和 1 作为分类变量,但我应该只有 1 个变量,而不是 2(0 和 1)
  • 对于二进制,是的。你必须有 1 个变量,它应该是 1 或 0。