我正在学习本教程,但未能为在y=x
之上生成的数据集构建线性回归量。
这是我的代码的最后一部分,如果你想重现我的错误,你可以在这里找到complete source code:
_CSV_COLUMN_DEFAULTS = [[0],[0]]
_CSV_COLUMNS = ['x', 'y']
def input_fn(data_file):
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)
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))
不知何故,此代码将失败并显示错误消息
ValueError: Feature (key: x) cannot have rank 0. Give: Tensor("IteratorGetNext:0", shape=(), dtype=int32, device=/device:CPU:0)
由于tensorflow的性质,我发现基于给定的消息检查它真正出错的地方有点困难。任何帮助将不胜感激,谢谢!
答案 0 :(得分:9)
据我所知,值的第一个维度是batch_size
。因此,当input_fn
返回数据时,它应该作为批处理返回数据。
一旦您将数据作为批处理返回,它就可以工作,例如:
dataset = tf.data.TextLineDataset(data_file)
dataset = dataset.map(parse_csv)
dataset = dataset.batch(10) # or any other batch size
答案 1 :(得分:0)
功能不能出现0级问题 我们不使用input_fn或eval_fn或estimator api来指定batch_size, 下面的代码将显示张量的形状如何随batch_size改变。 该代码将与TF2.0一起使用,以便在较早版本上运行,以启用急切执行(tf.enable_eager_execution())。 在下面的两个代码段中,请注意在没有batch_size的情况下,输出tesnor的形状如何变化。
##### content of test.csv ####
feature1, feature2,label
234, 235, 24
345, 345,26
234, 345, 28
432, 567, 29
########################
import tensorflow as tf
tf.enable_eager_execution()
CSV_COLUMNS= ['feature1','feature2','label']
CSV_COLUMN_DEFAULTS = [[0.0], [0.0],[0.0]]
def parse_csv(value):
columns = tf.decode_csv(value, record_defaults=CSV_COLUMN_DEFAULTS)
features = dict(zip(CSV_COLUMNS, columns))
labels = features.pop('label')
return features, labels
###Without batch size
dataset = tf.data.TextLineDataset(filenames='./test.csv').skip(count = 1)
dataset = dataset.map(parse_csv)
for i in dataset:
print(i)
# Output tensor shape here is shape=()
({'feature1': <tf.Tensor: id=247, shape=(), dtype=float32, numpy=234.0>, 'feature2': <tf.Tensor: id=248, shape=(), dtype=float32, numpy=235.0>}, <tf.Tensor: id=249, shape=(), dtype=float32, numpy=24.0>)
({'feature1': <tf.Tensor: id=253, shape=(), dtype=float32, numpy=345.0>, 'feature2': <tf.Tensor: id=254, shape=(), dtype=float32, numpy=345.0>}, <tf.Tensor: id=255, shape=(), dtype=float32, numpy=26.0>)
({'feature1': <tf.Tensor: id=259, shape=(), dtype=float32, numpy=234.0>, 'feature2': <tf.Tensor: id=260, shape=(), dtype=float32, numpy=345.0>}, <tf.Tensor: id=261, shape=(), dtype=float32, numpy=28.0>)
({'feature1': <tf.Tensor: id=265, shape=(), dtype=float32, numpy=432.0>, 'feature2': <tf.Tensor: id=266, shape=(), dtype=float32, numpy=567.0>}, <tf.Tensor: id=267, shape=(), dtype=float32, numpy=29.0>)
###With batch size
dataset = tf.data.TextLineDataset(filenames='./test.csv').skip(count = 1)
dataset = dataset.map(parse_csv).batch(batch_size=2)
for i in dataset:
print(i)
# Output tensor shape here is shape=(2,)
({'feature1': <tf.Tensor: id=442, shape=(2,), dtype=float32, numpy=array([234., 345.], dtype=float32)>, 'feature2': <tf.Tensor: id=443, shape=(2,), dtype=float32, numpy=array([235., 345.], dtype=float32)>}, <tf.Tensor: id=444, shape=(2,), dtype=float32, numpy=array([24., 26.], dtype=float32)>)
({'feature1': <tf.Tensor: id=448, shape=(2,), dtype=float32, numpy=array([234., 432.], dtype=float32)>, 'feature2': <tf.Tensor: id=449, shape=(2,), dtype=float32, numpy=array([345., 567.], dtype=float32)>}, <tf.Tensor: id=450, shape=(2,), dtype=float32, numpy=array([28., 29.], dtype=float32)>)
Using batch_size with dataset would solve the issue "Feature cannot have rank 0".