Keras构建乳腺癌诊断神经网络时model.fit()形状不匹配错误求助
解决Keras乳腺癌诊断模型的形状不匹配错误
核心问题分析
报错提示输入形状不匹配:模型期望输入形状为(None, 13)(None代表任意样本数,13是定义的特征数),但实际输入是(16, 30),说明训练数据维度和模型定义不匹配,同时代码中混入了无意义的PyTorch代码。
具体修复步骤
1. 删除冗余的PyTorch代码
你代码中的NeuralNetwork类、nn.Linear、F.relu等都是PyTorch语法,和当前使用的Keras完全无关,直接删除整段:
# 删掉以下所有代码 class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() #Capa 1 self.linear1 = nn.Linear(13, 16) #Capa 2 self.linear2 = nn.Linear(16, 1) pass def forward(self, x): # Capa 1 x = self.linear1(x) #Activem la primera capa x = F.relu(x) #Capa 2 x = self.linear2(x) #Activem la segona capa x = F.softmax(x, dim=1) #pass return x
2. 修正模型定义的冗余参数
Keras Sequential模型会自动推断层间输入形状,第二个Dense层不需要指定input_shape=(16,),直接删除该参数:
# 修正后的模型定义 model = keras.Sequential() model.add(layers.Dense(16, input_shape=(13,), activation='relu')) model.add(layers.Dense(1, activation='sigmoid')) # 移除多余的input_shape参数 model.summary()
3. 对齐数据与模型的特征维度
错误显示输入形状为(16,30),说明你的X_train维度是(样本数=16, 特征数=30),但模型定义的是13个特征,这里有两种修正方向:
- 如果是特征数定义错误:经典威斯康星乳腺癌数据集的特征数是30,把模型的
input_shape改成(30,):model.add(layers.Dense(16, input_shape=(30,), activation='relu')) - 如果是数据维度颠倒:检查数据形状后转置修正:
# 先查看当前数据形状 print(X_train.shape) # 如果输出是(30, 16),说明样本和特征维度颠倒,执行转置 X_train = X_train.T X_test = X_test.T
4. 确认标签数据形状
确保y_train和y_test是形状为(N,)或(N,1)的一维数组,符合二分类任务的输入要求。
修正后的完整代码示例
import keras from keras import layers from keras.optimizers import Adam from keras.losses import BinaryCrossentropy # 模型定义(假设使用30个特征,根据实际数据调整) model = keras.Sequential() model.add(layers.Dense(16, input_shape=(30,), activation='relu')) model.add(layers.Dense(1, activation='sigmoid')) model.summary() loss_function = BinaryCrossentropy() optim = keras.optimizers.Adam(learning_rate=5e-4) model.compile( optimizer=optim, loss=loss_function, metrics='accuracy' ) # 训练模型(确保X_train形状为(N,30),y_train形状为(N,)或(N,1)) model.fit( x=X_train, y=y_train, batch_size=16, epochs=50, verbose="auto", validation_data=(X_test, y_test), shuffle=True, )
内容的提问来源于stack exchange,提问作者Mireia Farreras Domingo
相关产品推荐
相关产品推荐

