在DNNClassifier中传递列表/ndarray作为feature_column报错问题
解决DNNClassifier中特征列与输入数据不匹配的异常
我来帮你排查这个问题!你遇到的异常本质是特征列的形状和输入数据的实际维度不匹配,加上pandas DataFrame存储列表的方式导致TensorFlow无法正确解析特征,咱们一步步解决:
问题根源分析
- 你的
images列每个元素是长度为2的列表(比如[1,1]),但你在定义numeric_column时指定了shape=[1,1],这和实际特征维度完全不匹配; - Pandas DataFrame中直接存储列表会导致TensorFlow的
pandas_input_fn无法自动将其解析为统一形状的张量,而是把每个列表当成单个“元素”传递给模型,这不符合DNNClassifier对输入特征的要求。
修正后的代码
import tensorflow as tf import pandas as pd import numpy as np # 把列表转换成标准二维数组,每个样本对应一行特征 a = np.array([[1,1],[2,2],[3,3]]) b = [0,1,0] # 修正为符合二分类的标签值(原标签11/22/33与n_classes=2不匹配) # 用转换后的数组构造DataFrame,确保特征列的结构可被TensorFlow正确解析 mydata = pd.DataFrame({'images': a.tolist(), 'labels': b}) # 修正特征列的shape为[2],匹配每个样本的特征维度 feature_columns = [tf.feature_column.numeric_column('images', shape=[2])] train_input_fn = tf.estimator.inputs.pandas_input_fn( x=mydata, y=mydata['labels'], batch_size=60, num_epochs=1, shuffle=True ) estimator = tf.estimator.DNNClassifier( hidden_units=[64,32,16], feature_columns=feature_columns, n_classes=2 ) estimator.train(input_fn=train_input_fn, steps=100)
额外注意点
- 原代码中标签值
[11,22,33]与n_classes=2的二分类任务不匹配,我已经改成了符合二分类的0/1取值,你可以根据实际业务调整; - 如果你的实际场景是处理图片数据(比如1x1单通道图),需要确保输入数据形状为
(样本数, 1, 1),同时特征列的shape也要对应设置为[1,1],并且要把DataFrame的images列转换成对应的三维数组结构。
内容的提问来源于stack exchange,提问作者maswadkar
相关产品推荐
相关产品推荐

