将具有多种数据类型的python序列转换为张量

时间:2018-04-13 20:43:56

标签: python-3.x tensorflow types tuples

我正在使用TensorFlow r1.7和python3.6.5。我也是TensorFlow的新手,所以如果可能的话,我想要易于阅读的解释。

我正在尝试使用此函数tf.data.Dataset.from_tensor_slices()将输入数据转换为张量数据集。我将具有混合数据类型的元组传递给此函数。但是,在运行我的代码时,我收到此错误:ValueError: Can't convert Python sequence with mixed types to Tensor

我想知道为什么我收到此错误,以及如何将数据转换为张量数据集,即使是混合数据类型。

这是我元组中前5个条目的打印输出。

(13501, 2, None, 51, '2232', 'S35', '734.72', 'CLA', '240', 1035, 2060, 1252, 1182, 10, '967.28', '338.50', None, 14, 102, 3830)
(15124, 2, None, 57, '2641', 'S35', '234.80', 'DDA', '240', 743, 1597, 4706, 156, 0, None, None, None, 3, 27, 981)
(40035, 2, None, None, '21', 'K00', '60.06', 'CHK', '520', 76, 1863, 12, None, 1, '85.06', '25.00', None, 1, 5, 245)
(42331, 3, None, 62, '121', 'S50', '1859.01', 'ACT', '420', 952, 1583, 410, 255, 0, None, None, None, 6, 117, 1795)
(201721, 3, None, 42, '2472', 'S35', '1413.84', 'CLA', '350', 868, 1746, 963, 264, 0, None, None, None, 18, 65, 4510)

正如您所看到的,我在输入数据中混合了整数,浮点数和字符串。

以下是错误的追溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/miikey101/Documents/Khalen_Case_Loader/tensorflow/k_means/k_means.py", line 10, in prepare_dataset
    dataset = tf.data.Dataset.from_tensor_slices(dm_data)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 222, in from_tensor_slices
    return TensorSliceDataset(tensors)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 1017, in __init__
    for i, t in enumerate(nest.flatten(tensors))
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 1017, in <listcomp>
    for i, t in enumerate(nest.flatten(tensors))
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 950, in convert_to_tensor
    as_ref=False)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1040, in internal_convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 235, in _constant_tensor_conversion_function
    return constant(v, dtype=dtype, name=name)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 185, in constant
    t = convert_to_eager_tensor(value, ctx, dtype)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 131, in convert_to_eager_tensor
    return ops.EagerTensor(value, context=handle, device=device, dtype=dtype)
ValueError: Can't convert Python sequence with mixed types to Tensor.

2 个答案:

答案 0 :(得分:3)

在张量流中,您不能使用具有多种数据类型的张量。

引用documentation

  

不可能有一个具有多种数据类型的tf.Tensor。但是,可以将任意数据结构序列化为字符串,并将它们存储在tf.Tensors中。

因此,解决方法可能是创建数据类型为tf.String的张量,并在发生时将字段转换为所需的数据类型

答案 1 :(得分:1)

您需要每个特征(列)的张量。只有当它是一个多维特征(如图像、视频、字符串列表、向量)时,张量中才会有更多维度,即便如此,它们也会具有相同的数据类型。

tf.data.Dataset.from_tensor_slices() 将接受您的输入作为列表字典(键是特征的名称,值是该特征中的值的列表),或作为列表的列表。我不记得它是否吃了 Pandas 数据帧,但如果不是,您可以轻松地将其转换为字典 df.to_dict()

但是,您不能输入 None 值。在转换为张量之前,您必须为这些找到一些值。经典方法是中值、零值、最常见值、字符串或类别的“缺失”/“未知”值或插补。