You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

首次使用TensorFlow Keras构建神经网络报错:无法将'26'转换为shape

解决Keras中ValueError: Cannot convert '26' to a shape的问题

错误原因分析

这个错误的核心是代码中某个需要传入整数类型形状参数的位置,被传入了字符串'26'。从你的代码来看,最可能的触发点是keras.Input(shape=(data.shape[1]))这一行:如果data.shape[1]返回的不是整数,而是字符串类型的'26',就会导致Keras无法将其解析为合法的输入形状。

修复步骤

  1. 强制转换特征数为整数并规范形状格式
    修改Input层代码,显式将特征数转为整数,并确保形状参数是单元素元组(Keras要求输入形状以元组形式传入):

    model.add(keras.Input(shape=(int(data.shape[1]),)))
    
  2. 验证输入数据的有效性
    在调用create_neural_network函数前,先检查传入的data是否符合预期:

    print(type(data.shape[1]))  # 正常应输出<class 'int'>
    print(data.shape)  # 确认数据格式为(样本数量, 特征数量),例如(1000, 26)
    

    如果data.shape[1]是字符串,说明数据加载环节存在问题(比如误将列名当作列数),需要先修正数据读取逻辑,确保data是标准的pandas DataFrame。

  3. 匹配训练数据的维度
    后续调用model.fit(x, y)时,要保证x的特征维度和Input层定义一致:比如Input层定义了26个特征,x的形状必须是(样本数, 26),不能是一维数组或其他维度。

修正后的完整函数

def create_neural_network(data):
    """创建一个包含7个隐藏层(节点数从4096递减到64)、输出层为10节点softmax的神经网络(用于分类任务)

    :param data (pandas.DataFrame): 输入数据
    :return model: 神经网络模型
    """

    # 创建网络拓扑
    model = keras.Sequential()

    # 修正Input层的形状参数
    model.add(keras.Input(shape=(int(data.shape[1]),)))

    # 隐藏层
    model.add(keras.layers.Dense(4096, activation="relu"))
    model.add(keras.layers.Dense(2048, activation="relu"))
    model.add(keras.layers.Dense(1024, activation="relu"))
    model.add(keras.layers.Dense(512, activation="relu"))
    model.add(keras.layers.Dense(256, activation="relu"))
    model.add(keras.layers.Dense(128, activation="relu"))
    model.add(keras.layers.Dense(64, activation="relu"))

    # 输出层
    model.add(keras.layers.Dense(10, activation="softmax"))

    optimizer = keras.optimizers.Adam(learning_rate=0.001)
    model.compile(
        optimizer=optimizer, loss="sparse_categorical_crossentropy", metrics=["accuracy"]
    )

    return model

内容的提问来源于stack exchange,提问作者26_ ChirayuAggarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:27:20