【问题标题】:TensorFlow Dataset: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray)TensorFlow 数据集:无法将 NumPy 数组转换为张量(不支持的对象类型 numpy.ndarray)
【发布时间】:2021-04-18 21:56:05
【问题描述】:

我知道以前有人问过类似的问题,但建议的解决方案似乎都不适合我。我有以下Pandas 数据框:

Title Author Target Tag0 Tag1 Tag2 Tag3 Tag4 Tag5 Tag6 Tag7 Tag8 Tag9
0 Says Ron Johnson referred to "The Lego Movie" as an "insidious anti-business conspiracy." 0 0 30 0 36 35 nan nan nan nan nan nan
1 "Forty percent of the Fortune 500 were started either by immigrants or children of immigrants." 1 0 9 21 5 28 nan nan nan nan nan nan

我通过Keras 中的TextVectorization 层对Title 属性进行了矢量化处理,获得了以下数据框:

Title Author Target Tag0 Tag1 Tag2 Tag3 Tag4 Tag5 Tag6 Tag7 Tag8 Tag9
0 [9415, 19483, 9066, 16820, 20256, 6959, 6931,...,0 ] 0 0 3213 3829 223 3140 nan nan nan nan nan nan

我想将此 Pandas 数据框转换为 TensorFlow 数据集。我尝试使用以下代码来实现这一点:

dataset = tf.data.Dataset.from_tensor_slices((data.values, target.values))

这是我得到的错误:

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).

通过删除Title 列,错误消失,然后Title 是导致错误的列Title 看起来像这样:

print(data["Title"].values)
array([array([ 9415., 19483.,  9066., 16820., 20256.,  6959.,  6931.,  8539.,
       10705.,  1342.,  1896.,  4353., 14143.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.],
       ...,
       array([17497., 20189.,  4280.,  3460., 20256., 15754.,  9178.,  1114.,
       19441., 18731., 13875., 14018.,  5789.,  6959.,  8740., 13042.,
         929.,  9541.,   773., 19384.,  5659., 13042., 14578.,  2813.,
       17452.,   888.,  6206.,  6959., 14540.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.],
      dtype=float32)], dtype=object)

我的问题是:Title 有什么问题?我应该改变什么?

我假设这与包含每个 numpy.ndarray 标题的 numpy.ndarray 的数据类型有关。正如上面dtype=object 所见。但我不太确定。

提前谢谢你!

编辑:

我找到了解决此问题的方法,只需将数据集转换为 Numpy ndarray。

# To numpy
numpy_dataset = data.to_numpy(dtype="<U43")

#Get Target
target = data.pop("Target")

#TF dataset
dataset = tf.data.Dataset.from_tensor_slices((numpy_dataset, target.values))

【问题讨论】:

  • Title 列的每个单元格都是一个数组。 values 然后是一个数组数组。试试np.stack(data["Title"].values)。如果引发错误,则这些嵌套数组的形状不同,并且不能制成二维数值数组(tensorflow 可以使用)。
  • 很好,解决了我的问题部分。正如您在上面的代码中看到的那样,我不仅传递了数据框Titles。如果我按照您的建议进行操作,则会创建 tf.data.Dataset.from_tensor_slices((np.stack(data["Title"].values), target.values)) TensorFlow 数据集。但是我怎样才能包含剩余的列呢?

标签: pandas dataframe numpy tensorflow tensorflow-datasets


【解决方案1】:

我通过简单地将数据集转换为Numpy ndarray 找到了解决此问题的方法。

# To numpy
numpy_dataset = data.to_numpy(dtype="<U43")

#Get Target
target = data.pop("Target")

#TF dataset
dataset = tf.data.Dataset.from_tensor_slices((numpy_dataset, target.values))

【讨论】:

    【解决方案2】:

    我在尝试 tf feature_columns.ipynb 的演示时遇到了同样的问题。 我发现数据包含空数据,删除它们后,代码工作了

        #drop null data
         dataframe = dataframe.dropna(axis=0, how='any')
    

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 2020-07-05
      • 2020-11-22
      • 2021-10-11
      • 2021-04-25
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多