Py学习  »  Python

在Python/Tensorflow中:如何将2D数组的字符串表示形式从文本文件转换为TF可以使用的内容

deprekate • 2 年前 • 603 次点击  

我需要从文本文件中加载包含2D数组字符串表示的行,以便以后在训练Tensorflow CNN时使用,但我无法将字符串转换为Tensorflow喜欢的格式。我尝试了apply/map/各种函数的各种组合,但总是出现一些神秘的错误。下面是一个玩具示例代码,它接近正常工作,但仍会抛出一个错误:

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray)
import tensorflow as tf
import numpy as np
import pandas as pd
from ast import literal_eval

def df_to_dataset(dataframe):
    Y = tf.convert_to_tensor( dataframe['Y'].values )
    X = tf.convert_to_tensor( dataframe['X'].apply(literal_eval).apply(np.array).values )
    return tf.data.Dataset.from_tensor_slices( ( X , Y ) )

data = [[ 1, "[[0,1],[0,1]]" ] , [ 0 , "[[1,0],[1,0]]" ]]
df = pd.DataFrame(data, columns=['Y','X'])
dataset = df_to_dataset(df)
for feature in dataset.take(1):
    print( feature )
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132859
 
603 次点击  
文章 [ 1 ]  |  最新文章 2 年前
hpaulj
Reply   •   1 楼
hpaulj    2 年前

因此,您的数据框显示为:

In [161]: df
Out[161]: 
   Y              X
0  1  [[0,1],[0,1]]
1  0  [[1,0],[1,0]]

虽然这并没有显示字符串引号。

In [162]: df['Y'].values
Out[162]: array([1, 0])

这个 X 列是字符串的1d数组,对象数据类型:

In [163]: df['X'].values
Out[163]: array(['[[0,1],[0,1]]', '[[1,0],[1,0]]'], dtype=object)

在评估中, values 现在是一系列列表:

In [164]: from ast import literal_eval
In [165]: df['X'].apply(literal_eval)
Out[165]: 
0    [[0, 1], [0, 1]]
1    [[1, 0], [1, 0]]
Name: X, dtype: object
In [166]: df['X'].apply(literal_eval).values
Out[166]: array([list([[0, 1], [0, 1]]), list([[1, 0], [1, 0]])], dtype=object)

但如果我们将其提取为一个列表:

In [168]: df['X'].apply(literal_eval).to_list()
Out[168]: [[[0, 1], [0, 1]], [[1, 0], [1, 0]]]

我们可以很容易地将其转化为一个数组:

In [169]: np.array(_)
Out[169]: 
array([[[0, 1],
        [0, 1]],

       [[1, 0],
        [1, 0]]])

回到数组形式,我们可以使用 stack

In [170]: np.stack(df['X'].apply(literal_eval).values)
Out[170]: 
array([[[0, 1],
        [0, 1]],

       [[1, 0],
        [1, 0]]])

堆栈 就像 concatenate vstack 除了它增加了一个维度,表现得更像 np.array .

现在,tensorflow转换应该可以工作了。

你的第二个 apply ,仅将列表数组更改为数组数组。

In [174]: df['X'].apply(literal_eval).apply(np.array).values
Out[174]: 
array([array([[0, 1],
              [0, 1]]), array([[1, 0],
                               [1, 0]])], dtype=object)

np.stack 这方面也很有效。