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

