Tensorflow LinearRegressor报错:Feature(key:x)不能为0阶,求解决
解决TensorFlow LinearRegressor的Rank 0特征错误
这个错误我之前也碰到过,本质是TensorFlow Estimator API要求输入的特征张量至少是1阶(rank 1),但你的代码里返回的x是一个0阶的标量张量(shape=()),不符合要求。咱们一步步来解决:
问题根源
你的input_fn中,TextLineDataset读取每一行后通过map(parse_csv)解析出单个样本,此时每个特征(比如x)对应的是标量张量(没有批量维度)。而Estimator是为批量训练设计的,它期望特征张量带有批量维度(哪怕batch size设为1)。
修复方案
只需要在数据集处理流程中添加批处理操作,让每个特征变成1阶张量即可:
修改后的input_fn代码:
_CSV_COLUMN_DEFAULTS = [[0],[0]] _CSV_COLUMNS = ['x', 'y'] def input_fn(data_file, batch_size=32): def parse_csv(value): print('Parsing', data_file) columns = tf.decode_csv(value, record_defaults=_CSV_COLUMN_DEFAULTS) features = dict(zip(_CSV_COLUMNS, columns)) labels = features.pop('y') return features, labels # Extract lines from input files using the Dataset API. dataset = tf.data.TextLineDataset(data_file) dataset = dataset.map(parse_csv) # 添加批处理,给特征加上批量维度 dataset = dataset.batch(batch_size) iterator = dataset.make_one_shot_iterator() features, labels = iterator.get_next() return features, labels
然后保持后续的模型定义和训练代码不变:
x = tf.feature_column.numeric_column('x') base_columns = [x] model_dir = tempfile.mkdtemp() model = tf.estimator.LinearRegressor(model_dir=model_dir, feature_columns=base_columns) model = model.train(input_fn=lambda: input_fn(data_file=file_path))
额外检查点
同时可以确认你的CSV文件格式是否正确,每一行应该是用逗号分隔的两个数值(比如1,1、3,3这种符合y=x规律的样本),避免因解析异常导致张量形状出错。
内容的提问来源于stack exchange,提问作者B.Mr.W.
相关产品推荐
相关产品推荐

