TensorFlow 数据集 API 解析错误
TensorFlow Dataset API Parsing Error
我正在使用 TensorFlow 数据集 API 解析 CSV 文件和 运行 逻辑回归。我正在关注 TF 文档 here.
中的示例
以下代码片段展示了我如何设置模型:
def input_fn(path, num_epochs, batch_size):
dataset = tf.data.TextLineDataset(path)
dataset = dataset.map(parse_table, num_parallel_calls=12)
dataset = dataset.repeat(num_epochs)
dataset.batch(batch_size)
iterator = dataset.make_one_shot_iterator()
features, labels = iterator.get_next()
return features, labels
def parse_table(value):
cols = tf.decode_csv(value, record_defaults=TAB_COLUMN_DEFAULTS)
indep_vars = dict(zip(CSV_COLS, cols))
y = indep_vars.pop('y')
return indep_vars, y
def build_indep_vars():
continuous_vars = [
tf.feature_column.numeric_column(x, shape=1) for x in CONT_COLS]
categorical_vars = [
tf.feature_column.categorical_column_with_hash_bucket(
x, hash_bucket_size=100) for x in CAT_COLS]
return categorical_vars + continuous_vars
调用 lr.train(input_fn = lambda: input_fn(data_path, 1, 100))
时(注意:批量大小为 100)我收到错误
ValueError: Feature (key: V1) cannot have rank 0. Give: Tensor("IteratorGetNext:0", shape=(), dtype=float32, device=/device:CPU:0)
所以我假设这意味着 tf.feature_column.numeric_column
调用之一正在获取它不喜欢的标量值。但是,我不明白为什么会这样。我已将 batch_size
设置为正整数,根据文档,由 tf.feature_column.numeric_column
产生的 NDarray 的形状默认应为 1Xbatch_size
。谁能解释为什么 TensorFlow 会返回此错误?
我确信这个问题有一个简单的答案,如果我没有弄明白这个问题,我会觉得自己很愚蠢,但在花了一些时间之后,我仍然很困惑。
出现错误是因为 tf.feature_column
方法要求对输入进行批处理,并且
我认为原因是一个简单的拼写错误,它丢弃了 Dataset.batch()
转换。将 dataset.batch(batch_size)
替换为以下行:
dataset = dataset.batch(batch_size)
调用任何 tf.data.Dataset
转换方法(例如 Dataset.map()
、Dataset.repeat()
、Dataset.batch()
)不会修改调用这些方法的对象。相反,这些方法 return 一个 new Dataset
对象,您可以将其用于进一步的转换,或制作一个 Iterator
.
我正在使用 TensorFlow 数据集 API 解析 CSV 文件和 运行 逻辑回归。我正在关注 TF 文档 here.
中的示例以下代码片段展示了我如何设置模型:
def input_fn(path, num_epochs, batch_size):
dataset = tf.data.TextLineDataset(path)
dataset = dataset.map(parse_table, num_parallel_calls=12)
dataset = dataset.repeat(num_epochs)
dataset.batch(batch_size)
iterator = dataset.make_one_shot_iterator()
features, labels = iterator.get_next()
return features, labels
def parse_table(value):
cols = tf.decode_csv(value, record_defaults=TAB_COLUMN_DEFAULTS)
indep_vars = dict(zip(CSV_COLS, cols))
y = indep_vars.pop('y')
return indep_vars, y
def build_indep_vars():
continuous_vars = [
tf.feature_column.numeric_column(x, shape=1) for x in CONT_COLS]
categorical_vars = [
tf.feature_column.categorical_column_with_hash_bucket(
x, hash_bucket_size=100) for x in CAT_COLS]
return categorical_vars + continuous_vars
调用 lr.train(input_fn = lambda: input_fn(data_path, 1, 100))
时(注意:批量大小为 100)我收到错误
ValueError: Feature (key: V1) cannot have rank 0. Give: Tensor("IteratorGetNext:0", shape=(), dtype=float32, device=/device:CPU:0)
所以我假设这意味着 tf.feature_column.numeric_column
调用之一正在获取它不喜欢的标量值。但是,我不明白为什么会这样。我已将 batch_size
设置为正整数,根据文档,由 tf.feature_column.numeric_column
产生的 NDarray 的形状默认应为 1Xbatch_size
。谁能解释为什么 TensorFlow 会返回此错误?
我确信这个问题有一个简单的答案,如果我没有弄明白这个问题,我会觉得自己很愚蠢,但在花了一些时间之后,我仍然很困惑。
出现错误是因为 tf.feature_column
方法要求对输入进行批处理,并且
我认为原因是一个简单的拼写错误,它丢弃了 Dataset.batch()
转换。将 dataset.batch(batch_size)
替换为以下行:
dataset = dataset.batch(batch_size)
调用任何 tf.data.Dataset
转换方法(例如 Dataset.map()
、Dataset.repeat()
、Dataset.batch()
)不会修改调用这些方法的对象。相反,这些方法 return 一个 new Dataset
对象,您可以将其用于进一步的转换,或制作一个 Iterator
.