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

TensorFlow训练数字匹配模型报AttributeError错误排查

问题描述

我正在尝试训练一款AI模型,给定包含90个可选数字的集合,使其能够匹配5个非随机生成、无重复的目标数字,初始实现代码如下:

from numpy import test
import tensorflow as tf
import click
import pandas as pd
from sklearn.model_selection import train_test_split
from itertools import repeat
insert = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90] for i in repeat(None, 33785)]
results = pd.read_csv("datini.csv")
del results['DATA']
del results['LUOGO']
results.drop(columns=results.columns[0], axis=1, inplace=True)
insert_train, insert_test, results_train, results_test = train_test_split(insert, results, test_size=0.2)

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(256, input_shape=insert_train.shape))
model.add(tf.keras.layers.Dense(256))
model.add(tf.keras.layers.Dense(5))

model.compile(optimizer='adam', loss='CategoricalCrossentropy', metrics=['accuracy'])

model.fit(insert_train, results_train, epochs=200)
model.evaluate(insert_test, results_test)

运行代码时抛出如下错误,要求在不额外创建新数据集的前提下完成固定数据传入:

AttributeError: 'list' object has no attribute 'shape'

错误原因
  • 生成的insert是Python原生列表,经train_test_split拆分得到的insert_train、insert_test仍为列表类型,原生Python列表没有.shape属性,无法直接给Keras层传参
  • 代码存在其他会触发后续运行异常的问题:
    • 冗余导入from numpy import test、click,不影响运行但无实际作用
    • Keras的input_shape参数要求传入单条样本的维度元组,直接传入整个训练集的全维度不符合接口规范
    • 损失函数选型错误:CategoricalCrossentropy是分类任务损失,要求标签为独热编码格式,本任务要预测5个数值属于回归类任务,不适用该损失
    • 所有输入样本完全一致(每条输入都是1-90的全量数字),模型无法从无差异输入中学习到输入输出的映射关系,属于任务逻辑缺陷,本次修正仅解决当前抛出的属性错误,不改动原有数据集逻辑
修正方案
  • 无需额外创建新数据集,拆分数据集后直接将列表格式的输入、输出转为numpy数组,即可正常调用.shape属性
  • 修正input_shape传参,仅传入单条样本的维度
  • 替换损失函数为适合回归任务的均方误差mse,匹配数值预测的任务目标
修正后代码
import numpy as np
import tensorflow as tf
import pandas as pd
from sklearn.model_selection import train_test_split
from itertools import repeat

# 保留原有固定输入逻辑,不新增数据集
insert = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90] for i in repeat(None, 33785)]
results = pd.read_csv("datini.csv")
del results['DATA']
del results['LUOGO']
results.drop(columns=results.columns[0], axis=1, inplace=True)
insert_train, insert_test, results_train, results_test = train_test_split(insert, results, test_size=0.2)

# 核心修正:列表转numpy数组,支持.shape属性调用
insert_train = np.array(insert_train)
insert_test = np.array(insert_test)
results_train = np.array(results_train)
results_test = np.array(results_test)

model = tf.keras.models.Sequential()
# 修正input_shape传参,传入单样本维度(单条输入长度为90)
model.add(tf.keras.layers.Dense(256, input_shape=(insert_train.shape[1],), activation='relu'))
model.add(tf.keras.layers.Dense(256, activation='relu'))
model.add(tf.keras.layers.Dense(5))

# 替换为回归任务适用的损失函数
model.compile(optimizer='adam', loss='mse', metrics=['mae'])

model.fit(insert_train, results_train, epochs=200)
model.evaluate(insert_test, results_test)

内容的提问来源于stack exchange,提问作者Bleedy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:54:52