【问题标题】:How to create a tensorflow dataset from a DataFrame with vector columns?如何从带有向量列的 DataFrame 创建张量流数据集?
【发布时间】:2018-11-11 11:41:47
【问题描述】:

所以我在 csv 文件 train.csv 中有一些火车数据,格式如下:

x;y;type
[1,2,3];[2,3,4];A
[2,7,9];[0,1,2];B

该文件被解析为pd.DataFrame,内容如下:

CSV_COLUMN_NAMES = ['x', 'y', 'type']
train = pd.read_csv("train.csv", names=CSV_COLUMN_NAMES, header=0, delimiter=";")
train['x'] = train['x'].apply(literal_eval)
train['y'] = train['y'].apply(literal_eval)

到目前为止一切顺利。应用了literal_eval 函数,因此xy 被视为数组。下一步是使用以下内容创建DataSet

features, labels = train, train.pop('type')
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))

这是它中断的地方:(它会溢出以下错误:

TypeError: Expected binary or unicode string, got [1, 2, 3]

为什么需要二进制或 unicode 字符串?是否不允许使用矢量特征列?还是我做错了什么?请给我一些启发

【问题讨论】:

    标签: python pandas dataframe tensorflow


    【解决方案1】:

    TF 可以自动从数据帧中创建张量,只要它只有一种数据类型,在这种情况下,它似乎有不同的数据类型。

    没有literal_eval,代码似乎可以工作,因为每个功能都是字符串而不是混合类型:

    train = pd.read_csv("train.csv", names=CSV_COLUMN_NAMES, header=0, delimiter=",")
    
    Features,labels = train,train.pop('type')
    
    dataset = tf.data.Dataset.from_tensor_slices((dict(Features), labels))
    iterator = dataset.make_initializable_iterator()
    next_element = iterator.get_next()
    
    with tf.Session() as sess:
      sess.run(iterator.initializer)
      print(sess.run(next_element))
      print(sess.run(next_element))
    

    输出:

    ({'y': b'[2, 3, 4]', 'x': b'[1, 2, 3]'}, b'A')
    ({'y': b'[0, 1, 2]', 'x': b'[2, 7, 9]'}, b'B')
    

    基于此解决方案:(How to convert a Numpy 2D array with object dtype to a regular 2D array of floats)如果我们将混合对象类型转换为相同类型(使用 np.vstack),它可以工作。

    train['x'] = train['x'].apply(literal_eval)
    train['y'] = train['y'].apply(literal_eval)
    
    Features,labels = train,train.pop('type')
    dataset = tf.data.Dataset.from_tensor_slices(((np.vstack(Features['x']),    np.vstack(Features['y'])), labels))
    
    iterator = dataset.make_initializable_iterator()
    next_element = iterator.get_next()
    
    with tf.Session() as sess:
       sess.run(iterator.initializer)
       print(sess.run(next_element))
       print(sess.run(next_element))
    

    输出:

    ((array([1, 2, 3]), array([2, 3, 4])), b'A')
    ((array([2, 7, 9]), array([0, 1, 2])), b'B')
    

    【讨论】:

    • 谢谢!这行得通。事实证明,在我的情况下,需要一个 dict 所以还有几个步骤。将添加一个答案来标记这个。
    【解决方案2】:

    查看制作数据集的其他答案。如果遇到features should be a dictionary of `Tensor`s. 错误,请使用以下内容:

    def dfToFeature(df):
        result = {}
        for key in df.keys():
            result[key] = np.vstack(df[key])
        return result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-28
      • 2020-06-27
      • 2016-05-29
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多