TensorFlow训练评估正常但预测报错ValueError: Feature (key: c1) cannot have rank 0求助
ValueError: Feature (key: c1) cannot have rank 0 的可能成因 这个问题我之前帮同行排查过类似的,结合你说的训练评估都正常、只有预测输入函数不同的情况,大概率是预测输入的特征维度和模型期望不匹配,具体可以从这几个方向排查:
预测输入函数返回的特征是标量(rank 0),而模型期望至少是rank 1的张量
训练和评估阶段,你的输入函数应该是批量读取数据,每个特征都是形状为[batch_size]的一维张量(比如一批样本的c1值是[1,2,3]),完全符合模型要求。但预测时如果直接传入单个标量值(比如{'c1': 5}),没有用列表/数组包裹,就会生成rank 0的标量张量,触发这个错误。
举个例子,错误的预测输入写法:def predict_input_fn(): return {'c1': 10} # 直接返回标量,rank=0正确的写法应该把单个值包装成一维数组:
def predict_input_fn(): return {'c1': [10]} # 返回一维数组,rank=1预测输入函数的特征处理逻辑和训练/评估不一致
比如训练时你给特征做了维度扩展(比如用tf.expand_dims把单个样本的特征转成一维张量),但预测时漏了这一步;或者训练时用tf.convert_to_tensor([x])处理特征,预测时却直接用tf.convert_to_tensor(x),导致生成了标量张量。特征列的定义和预测输入的维度不匹配
比如你在模型里定义的c1是tf.feature_column.numeric_column这类默认期望一维输入的特征列,它要求输入的张量至少是rank 1(对应单个或多个样本的特征值),而你预测时传入的是rank 0的标量,自然会报错。预测时的数据集构造方式有误
如果用tf.data.Dataset构造预测数据,要注意不要传入标量作为切片源。比如错误的写法:def predict_input_fn(): dataset = tf.data.Dataset.from_tensor_slices({'c1': 5}) return dataset.batch(1)这里
from_tensor_slices会把标量5切分成单个标量元素,即使batch后也还是rank 0的张量。正确的做法是传入一维数组:def predict_input_fn(): dataset = tf.data.Dataset.from_tensor_slices({'c1': [5]}) return dataset.batch(1)
内容的提问来源于stack exchange,提问作者Vincent Teyssier

