TensorFlow1.7报错:features应为Tensor字典,实际传入Tensor类型求解决
解决TensorFlow 1.7中鸢尾花分类的ValueError问题
这个错误ValueError: features should be a dictionary of Tensors. Given type: <class 'tensorflow.python.framework.ops.Tensor'>`出现的核心原因是:TensorFlow 1.x的Estimator API要求输入的features是一个字典(键是特征名,值是对应特征的Tensor),但你传入的是单个Tensor对象。
下面我会帮你定位代码问题并给出完整的修正方案:
问题定位
从你提供的代码片段来看,load_data函数返回的train_features是完整的DataFrame,但后续给Estimator喂数据时,你大概率直接把整个特征矩阵转换成了单个Tensor,没有按照API要求的字典格式传入,这就触发了错误。
修正方案
1. 完善load_data函数
先把特征和标签清晰分离,保留特征列的名称,方便后续构建字典:
import tensorflow as tf import pandas as pd TRAIN_URL = 'D:\数据集\FlowerClassification\iris_training.csv' TEST_URL = 'D:\数据集\FlowerClassification\iris_test.csv' CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species'] def load_data(label_name='Species'): # 加载训练集并拆分特征与标签 train = pd.read_csv(filepath_or_buffer=TRAIN_URL, names=CSV_COLUMN_NAMES, header=0) train_features = train.drop(label_name, axis=1) train_labels = train[label_name] # 加载测试集并拆分特征与标签 test = pd.read_csv(filepath_or_buffer=TEST_URL, names=CSV_COLUMN_NAMES, header=0) test_features = test.drop(label_name, axis=1) test_labels = test[label_name] return (train_features, train_labels), (test_features, test_labels)
2. 构建符合要求的输入函数
将特征DataFrame转换成字典格式的Tensor,完全匹配Estimator的输入要求:
def input_fn(features, labels, training=True, batch_size=32): # 把特征转换成{特征名: Tensor}的字典结构 features_dict = {key: tf.convert_to_tensor(value) for key, value in features.items()} # 构建数据集对象 dataset = tf.data.Dataset.from_tensor_slices((features_dict, labels)) # 训练模式下打乱并重复数据,提升模型泛化能力 if training: dataset = dataset.shuffle(1000).repeat() return dataset.batch(batch_size)
3. 完整的模型训练示例
把上述部分整合起来,构建一个可运行的DNN分类器:
# 加载拆分好的数据集 (train_x, train_y), (test_x, test_y) = load_data() # 定义特征列,和输入字典的键一一对应 feature_columns = [] for key in train_x.keys(): feature_columns.append(tf.feature_column.numeric_column(key=key)) # 初始化DNN分类器 classifier = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[10, 10], # 两层隐藏层,每层10个神经元 n_classes=3) # 鸢尾花共3个分类 # 训练模型 classifier.train( input_fn=lambda: input_fn(train_x, train_y, training=True), steps=1000) # 评估模型效果 eval_result = classifier.evaluate( input_fn=lambda: input_fn(test_x, test_y, training=False)) print('\n测试集准确率: {accuracy:0.3f}\n'.format(**eval_result))
关键提醒
Estimator要求用字典传入特征,是为了让特征列(feature_columns)能精准匹配到对应的输入特征,尤其是在处理混合类型特征(数值、分类、文本等)时,字典结构能更清晰地管理不同特征的输入逻辑。
内容的提问来源于stack exchange,提问作者Wen Hu
相关产品推荐
相关产品推荐

