在EagerTensor中使用不同的数据类型

3
使用Tensorflow 2.0 alpha时,我在尝试使用以下数据创建tf.data.Dataset时收到了错误信息“ValueError: Can't convert Python sequence with mixed types to Tensor”。

enter image description here

在Kaggle上检查完整数据集

显然,这里有混合的数据类型。 性别 是一个字符串,年龄 是一个浮点/双精度数,SibSpParch 都是整数等等。

我(使用 Python 3)编写的将此 Pandas 数据框架 转换为 tf.data.Dataset 的代码基于 Tensorflow 的 如何对结构化数据进行分类 教程,并且如下所示:

def df_to_dataset(dataframe, shuffle=True, batch_size=32):
  dataframe = dataframe.copy()

  # the 'Survived' column is the label (not shown in the image of the Dataframe but exists in the Dataframe)
  label = dataframe.pop('Survived')

  # create the dataset from the dataframe
  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), label))

  # if shuffle == true, randomize the entries
  if shuffle:
    ds = ds.shuffle(buffer_size=len(dataframe))
  ds = ds.batch(batch_size)

  return ds

如上所述,当使用混合类型的 Python 序列执行此函数时,将抛出错误ValueError: Can't convert Python sequence with mixed types to Tensor

train_ds = df_to_dataset(df_train, batch_size=32) 

(当df_train是图像中可见的Pandas数据帧时)
现在我想知道是否有什么我错过了,因为Tensorflow的教程(如上所述)也使用混合类型的数据框,但是当我尝试使用完全相同的df_to_dataset函数来运行此示例时,却没有遇到任何错误。

函数本身可以正常工作,但是您在代码中忘记了定义特征列的feature_layer。 - Sharky
@Sharky 但是特征列是在调用此函数之后定义的,对此函数的结果没有任何影响。因为错误已经在调用df_to_dataset时发生,而不是在训练模型时。 - Eyk Rehbein
奇怪的是,当我简单地迭代数据集时,没有出现任何错误。 - Sharky
@Sharky 迭代数据集是什么意思? - Eyk Rehbein
对于train_ds中的每个i: 打印i 其中i是一个单独的批次。如果您正在使用TF2.0 - Sharky
嗯,问题是我甚至都得不到打印train_ds的机会,因为在创建train_ds时它就会抛出一个错误@Sharky - Eyk Rehbein
1个回答

3

这个错误是由于特定列中有NaN值导致的。 使用 dataframe['Name'].isnull().sum()) 检测并替换。


非常感谢!当你写下这句话的同时,我偶然发现了同样的问题,当我尝试在所有字符串列上使用df.astype(str)时。 - Eyk Rehbein
我使用dataframe = dataframe.dropna()替换了所有缺失值的列。 - Eyk Rehbein
1
那只是其中的一个选项,我猜。我有点惊讶NaN是问题,数据类型有时可能会棘手。 - Sharky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接