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
相关产品推荐
相关产品推荐

