Keras模型训练报错:logits与labels形状不匹配,求正确方案
解决Keras中logits与labels形状不匹配的错误
你遇到的ValueError: logits and labels must have the same shape, received ((None, 10) vs (None, 1))错误,核心是模型输出层的形状和标签数据的形状不匹配,同时代码里还有两处关键错误,以下是修正方案:
错误点及修正说明
- 输出层配置错误:你的任务是二分类(标签y是0/1的一维数组,形状为
(None,1)),但当前输出层用了Dense(10, activation="softmax")——这是10分类任务的配置,输出形状为(None,10),和标签形状完全不匹配。需要改成二分类专属的输出层:Dense(1, activation="sigmoid"),输出单个0-1之间的概率值,形状对应(None,1)。 - 多余的
model.build调用:代码中model.build(input_shape=(None,1))强行覆盖了输入层定义的input_shape=(10,)(你的输入X有10个特征),这会导致输入维度不匹配,直接删掉这行即可。 - 损失函数匹配:二分类任务用
binary_crossentropy是正确的,和修正后的sigmoid输出层完全适配。
修正后的完整代码
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from keras.models import Sequential from keras.layers import Dense DF = pd.read_csv("https://raw.githubusercontent.com/EpistasisLab/tpot/master/tutorials/MAGIC%20Gamma%20Telescope/MAGIC%20Gamma%20Telescope%20Data.csv") X = DF.iloc[:,0:-1] y = DF.iloc[:,-1] yBin = np.array([1 if x == 'g' else 0 for x in y ]) scaler = StandardScaler() X1 = scaler.fit_transform(X) X_train, X_test, y_train, y_test = train_test_split(X1, yBin, test_size=0.25, random_state=2018) print(X_train.__class__,X_test.__class__,y_train.__class__,y_test.__class__ ) model=Sequential() model.add(Dense(6,activation="relu", input_shape=(10,))) # 修正输出层为二分类配置 model.add(Dense(1,activation="sigmoid")) # 删掉错误的build调用 model.summary() model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy']) model.fit(x=X_train, y=y_train, epochs=600, validation_data=(X_test, y_test), verbose=1 )
内容的提问来源于stack exchange,提问作者Dollar Tune-bill
相关产品推荐
相关产品推荐

