【问题标题】:BatchDataset not subscriptable when trying to format Python dictionary as table尝试将 Python 字典格式化为表时,BatchDataset 不可下标
【发布时间】:2020-05-06 18:26:56
【问题描述】:

我正在处理TensorFlow Load pandas.DataFrame tutorial,我正在尝试修改创建字典切片的代码 sn-p 的输出:

dict_slices = tf.data.Dataset.from_tensor_slices((df.to_dict('list'), target.values)).batch(16)

for dict_slice in dict_slices.take(1):
     print (dict_slice)

我发现下面的输出很草率,我想把它变成一个更易读的表格格式。

我尝试格式化 for 循环,基于 this recommendation

这给了我 BatchDataset 不可下标的错误

然后我尝试在 dict_slices 上使用 range 和 leng 函数,以便 i 成为整数索引而不是切片

这给了我以下错误(据我了解,因为 dict_slices 仍然是一个数组,并且每次迭代都是数组的一个向量,而不是向量的一个索引):

【问题讨论】:

    标签: python pandas tensorflow dictionary


    【解决方案1】:

    BatchDataset 是一个 tf.data.Dataset 实例,通过调用它的.batch(..) 方法进行批处理。您不能“索引”张量流数据集,或在其上调用 len 函数。我建议像在第一个代码 sn-p 中那样迭代它。

    但是,在您的数据集中,您使用的是.to_dict('list'),这意味着您的字典中的一个键被映射到一个列表作为值。基本上每个键都有“列”而不是行,这是你想要的吗?这将使逐行打印(显示在您链接的表格打印示例中)变得更加困难,因为您没有连续的不同功能。此外,它与官方 Tensorflow 代码中的示例不同,其中一个数据点由多个特征组成,而不是一个具有多个值的特征。

    结合 Tensorflow 代码和漂亮的打印:

    columns = list(df.columns.values)+['target']
    dict_slices = tf.data.Dataset.from_tensor_slices((df.values, target.values)).batch(1) # batch = 1 because otherwise you will get multiple dict_slice - target pairs in one iteration below!
    
    print(*columns, sep='\t') 
    for dict_slice, target in dict_slices.take(1):
         print(*dict_slice.numpy(), target.numpy(), sep='\t')
    

    这需要一些格式化,因为列宽不相等。

    【讨论】:

    • 感谢您的意见!通过您的修改,我收到一个新警告和一个新错误:**WARNING**:tensorflow:Model was constructed with shape (None,) for input Tensor("age:0", shape=(None,), dtype=float32), but it was called on an input with incompatible shape (None, 13). 还有**AssertionError:** Could not compute output Tensor("dense_4/Identity:0", shape=(None, 1), dtype=float32)
    • 这些错误与将数据点打印为格式化字典无关。这些是关于您构建的模型以及它的预期输入形状与您输入的形状有关。打开一个单独的问题或显示相关的代码和用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2021-06-17
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多