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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:10:15