TensorFlow神经网络预测代码出现KeyError:0错误的求助
错误根源拆解
这个KeyError: 0主要来自三个实打实的问题,咱们一个个捋清楚:
CSV数据格式彻底混乱
你给出的predict.csv把列名和数据硬塞在了同一行,甚至列名里还有空格(比如d 1),这会让pandas读取后生成的DataFrame完全偏离预期。举个例子,你提供的那行数据会被解析成16个列,但你的输入层明明需要15维特征,后续取数据时自然会触发索引错误。数据喂入方式完全不符合TensorFlow要求
你直接把整个DataFrame丢给feed_dict的x参数:x:[predictdataset],这完全不对。x是shape=[None,15]的占位符,需要的是二维数值数组,而不是带列名的DataFrame对象。TensorFlow在解析这种错误输入时,就会抛出KeyError。输出层与预测逻辑不匹配
首先你的输出层居然定义成了tf.placeholder——这本身就错了,输出层应该是网络计算出来的张量,不是占位符。其次你用了softmax+交叉熵,但softmax是给多分类任务用的(输出维度大于1),你这里输出是1维,应该用sigmoid更合理。最后tf.argmax(y4.eval(...),1)对shape=[None,1]的张量毫无意义,因为维度1只有一个元素,argmax永远返回0,逻辑完全不通。
分步解决方法
1. 先把CSV数据改对
把predict.csv改成标准格式:第一行是15个特征列名(别加空格),第二行是对应的数据。比如:
f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15 1,0,0,1,0,0,0,0,0,0,1,0,0,0,1
如果原来的AlAin,Y1...是特征名,务必保证列数刚好是15个,和输入层维度匹配。
2. 修正预测代码的核心逻辑
修改数据读取和喂入的方式,同时别忘了加载训练好的模型(你之前肯定漏了这一步!不然会话里的网络参数都是随机初始值):
import pandas as pd import tensorflow as tf # 假设你已经定义好了网络结构:x是输入占位符,y4是网络输出张量 with tf.Session() as sess: # 关键步骤:加载训练好的模型参数 saver = tf.train.Saver() saver.restore(sess, "你的模型保存路径") # 替换成你实际的模型保存路径 # 正确读取CSV predictdataset = pd.read_csv('predict.csv') # 把DataFrame转换成二维numpy数组,确保是float32类型 input_data = predictdataset.values.astype('float32') # 喂入数据获取预测结果 # 如果是二分类(输出维度1),直接取输出值 y_predict = sess.run(y4, feed_dict={x: input_data}) # 如果是多分类(输出维度>1)再用argmax: # y_predict = sess.run(tf.argmax(y4, axis=1), feed_dict={x: input_data}) print(y_predict)
3. 修正网络输出层的定义(必改)
输出层不能是占位符,得是网络的计算结果,比如:
# 输入层 x = tf.placeholder(tf.float32, [None, 15]) # 隐藏层1 h1 = tf.layers.dense(x, 128, activation=tf.nn.relu) # 隐藏层2 h2 = tf.layers.dense(h1, 64, activation=tf.nn.relu) # 隐藏层3 h3 = tf.layers.dense(h2, 32, activation=tf.nn.relu) # 输出层:二分类用sigmoid,输出维度1 y4 = tf.layers.dense(h3, 1, activation=tf.nn.sigmoid) # 如果是多分类(比如n类),用softmax,输出维度n # y4 = tf.layers.dense(h3, n, activation=tf.nn.softmax)
对应的损失函数也要匹配:二分类用tf.nn.sigmoid_cross_entropy_with_logits,多分类用tf.nn.softmax_cross_entropy_with_logits_v2。
额外提醒
- 训练时的输入特征顺序,必须和预测时CSV的列顺序完全一致,不然预测结果会彻底跑偏。
- 如果CSV里有非数值型列(比如原来的
AlAin),要提前删掉或者做编码处理,TensorFlow只认数值型输入。
内容的提问来源于stack exchange,提问作者sumeyyeemir

