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

使用TensorFlow DNNClassifier实现鸢尾花分类遇ValueError求助

解决DNNClassifier鸢尾花分类的ValueError问题

嘿,我一眼就发现问题所在了——你对特征列的理解完全没错,问题其实出在输入数据的格式上!

错误原因解析

DNNClassifier期望的输入特征是一个字典,其中每个键要和你在特征列里定义的key(比如"SepalLength")完全对应,值则是该特征对应的数组/张量。但你直接把整个二维数组传给了input_fn的x参数,模型根本没法把数组里的列和你定义的特征列一一匹配,所以才会抛出这个错误:

ValueError: features should be a dictionary of Tensors.

修正步骤

只需要把训练和评估数据转换成字典格式,让每个特征名对应一列数据即可:

1. 转换数据格式

把加载的train_data和eval_data(二维数组)拆分成字典,每个键对应你在特征列里定义的名称:

# 转换训练数据为字典格式
train_x = {
    "SepalLength": train_data[:, 0],
    "SepalWidth": train_data[:, 1],
    "PetalLength": train_data[:, 2],
    "PetalWidth": train_data[:, 3]
}

# 转换评估数据为字典格式
eval_x = {
    "SepalLength": eval_data[:, 0],
    "SepalWidth": eval_data[:, 1],
    "PetalLength": eval_data[:, 2],
    "PetalWidth": eval_data[:, 3]
}

2. 更新输入函数

在创建train_input_fn和eval_input_fn时,把x参数换成上面的字典:

# 修正训练输入函数
train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x=train_x,
    y=train_labels,
    batch_size=BATCH_SIZE,
    num_epochs=None,
    shuffle=True
)

# 修正评估输入函数
eval_input_fn = tf.estimator.inputs.numpy_input_fn(
    x=eval_x,
    y=eval_labels,
    num_epochs=1,
    shuffle=False
)

完整修正后的代码

import tensorflow as tf

BATCH_SIZE = 100
TRAIN_STEPS = 1000

def main(unused_argv):
    # Load training and eval data
    iris = tf.contrib.learn.datasets.load_dataset("iris")
    data = iris.data
    labels = iris.target
    train_data = data[:100]
    train_labels = labels[:100]
    eval_data = data[100:]
    eval_labels = labels[100:]

    # 转换数据为字典格式
    train_x = {
        "SepalLength": train_data[:, 0],
        "SepalWidth": train_data[:, 1],
        "PetalLength": train_data[:, 2],
        "PetalWidth": train_data[:, 3]
    }
    eval_x = {
        "SepalLength": eval_data[:, 0],
        "SepalWidth": eval_data[:, 1],
        "PetalLength": eval_data[:, 2],
        "PetalWidth": eval_data[:, 3]
    }

    # Feature columns
    feature_columns = [
        tf.feature_column.numeric_column(key="SepalLength"),
        tf.feature_column.numeric_column(key="SepalWidth"),
        tf.feature_column.numeric_column(key="PetalLength"),
        tf.feature_column.numeric_column(key="PetalWidth")
    ]

    # Build DNN with 2 hidden layers, 10 neurons each
    classifier = tf.estimator.DNNClassifier(
        feature_columns=feature_columns,
        hidden_units=[10, 10],
        n_classes=3
    )

    # Train model
    train_input_fn = tf.estimator.inputs.numpy_input_fn(
        x=train_x,
        y=train_labels,
        batch_size=BATCH_SIZE,
        num_epochs=None,
        shuffle=True
    )
    classifier.train(input_fn=train_input_fn, steps=TRAIN_STEPS)

    # Evaluate model
    eval_input_fn = tf.estimator.inputs.numpy_input_fn(
        x=eval_x,
        y=eval_labels,
        num_epochs=1,
        shuffle=False
    )
    eval_results = classifier.evaluate(input_fn=eval_input_fn)
    print(eval_results)

if __name__ == "__main__":
    tf.app.run()

补充说明

你的特征列定义完全正确,确实是用列表来存储多个numeric_column对象,只要输入数据的字典键和特征列的key一一对应,模型就能正确关联特征数据和特征列,顺利完成训练和评估啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:29:54