【问题标题】:How to batch CsvDataset correctly in Tensorflow 2.0?如何在 Tensorflow 2.0 中正确批处理 CsvDataset?
【发布时间】:2019-10-08 21:47:40
【问题描述】:

我正在使用 tf.data.experimental.make_csv_dataset 从 .csv 文件创建数据集。我还使用tf.keras.layers.DenseFeatures 作为模型的输入层。

我正在努力正确地创建一个DenseFeatures 层,以便在make_csv_datasetbatch_size 参数不等于1 的情况下与我的数据集兼容(如果batch_size=1 我的设置有效正如预期的那样)。

我使用shape=(my_batch_size,)tf.feature_column.numeric_column 元素列表创建DenseFeatures 层,但在这种情况下,出于某种原因,输入层似乎需要[my_batch_size,my_batch_size] 形状而不是[my_batch_size,1]

使用my_batch_size=19 尝试拟合模型时出现以下错误:

ValueError: Cannot reshape a tensor with 19 elements to shape [19,19] (361 elements) for 'MyModel/Input/MyColumn1/Reshape' (op: 'Reshape') with input shapes: [19,1], [2] and with input
tensors computed as partial shapes: input[1] = [19,19].

如果我在创建numeric_column 时没有指定shape,它也不起作用。我收到以下错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError:  The second input must be a scalar, but it has shape [19]

假设numeric_column 需要一个标量,但在一个Tensor 中接收整个批次。

如何创建DenseFeatures 的输入层,以便它接受make_csv_dataset(batch_size=my_batch_size) 生成的数据集?

【问题讨论】:

    标签: tensorflow2.0 tf.keras


    【解决方案1】:

    来自tf.feature_column.numeric_column 文档:

    shape:整数的可迭代指定 Tensor 的形状。可以给定一个整数,表示具有给定宽度的单个维度 Tensor。代表列的 Tensor 将具有 [batch_size] + shape 的形状。

    这意味着您不能将批处理大小传递给shape 参数:shape=()

    目前,批量大小为 1 时,您会得到 TF 可以处理的 shape=(1,),这要归功于广播或类似的东西(如果需要,TF 可以轻松添加大小为 1 的维度),这就是它起作用的原因。

    希望这会有所帮助。如果您需要更多帮助,请提供更多代码。

    【讨论】:

    • 如果我不指定shape 它也不起作用。我收到以下错误:tensorflow.python.framework.errors_impl.InvalidArgumentError: The second input must be a scalar, but it has shape [19] 假设 numeric_column 期望一个标量,但将整个批次作为一个张量接收。所以,我仍然不确定如何将numeric_column 与批处理的CsvDataset 一起使用。
    • @VolodymyrFrolov 您必须指定shape 参数,但给出一个空列表或元组:shape=() 这与不指定它不同,回退到@987654337 的默认值@。否则,您必须手动调整样本大小,使您的批次具有[19, 1] 的形状,而不仅仅是[19]。此外,请提供一个最小示例,以便我们更好地帮助您。
    • 指定shape=() 有帮助,不需要额外将[19] 调整为[19,1]。我的自定义损失函数也有问题,它将输入张量转换为标量。我通过整理一个最小的例子发现了问题。感谢您的帮助
    • @VolodymyrFrolov 仅当您希望使用默认的 shape 值时,才需要额外调整大小。 shape 参数和批处理形状之间的匹配如下:shape=() <=> batch.shape=[19]shape=(1,) <=> batch.shape=[19,1]。我的建议是在模型中使用大小为 1 的张量而不是标量;这将更经常地匹配 TF API 的预期(因为这里是 shape 参数的默认值)。乐于助人!
    • 明白。我同意使用标量不是一个好习惯,因此我将重写我的代码以改用张量并且与形状无关。
    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2020-04-23
    • 1970-01-01
    • 2019-03-24
    • 2018-12-05
    • 2016-04-29
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多