2016-09-18 47 views
0

我现在的文本文件传递CSV,我打算用在Tensorflow LSTM训练是这样的:Tensorflow:具有3D功能阵列

> 0.2, 4.3, 1.2 
> 1.1, 2.2, 3.1 
> 3.5, 4.1, 1.1, 4300 
> 
> 1.2, 3.3, 1.2 
> 1.5, 2.4, 3.1 
> 3.5, 2.1, 1.1, 4400 
> 
> ... 

有3个序列3个的功能,只有1个标签向量每个样品。我格式化了这个文本文件,所以它可以与LSTM训练一致,因为后者需要序列的时间步长,或者一般来说,LSTM训练需要3D张量(批次,时间步数,特征数量)。

我的问题:我应该如何使用Numpy或TensorFlow.TextReader来重新格式化3x3序列向量和单体标签,以便它可以与Tensorflow兼容?

编辑:我看到很多关于重新格式化具有矢量和标签的文本或CSV文件的教程,但不幸的是它们是1对1关系,例如

0.2, 4.3, 1.2, Class1 
1.1, 2.2, 3.1, Class2 
3.5, 4.1, 1.1, Class3 

变为:

[0.2, 4.3, 1.2, Class1], [1.1, 2.2, 3.1, Class2], [3.5, 4.1, 1.1, Class3] 

这显然是可读numpy的,并且可以从它专用于简单前馈NN任务容易地构建载体。但是这个过程实际上并不构建一个LSTM友好的CSV。

编辑:在CSV格式的TensorFlow教程,只包括二维数组作为例子。 features = col1, col2, col3不认为每个序列数组可能有时间步骤,因此我的问题。

+0

任何你不能使用熊猫的原因吗?如果不是,你可能可以用numpy的'reshape','ravel'和'view'或者[结构化数组](http://docs.scipy.org/doc/numpy/user/basics.rec.html ) – JGreenwell

回答

1

对于您是否对numpy阵列结构或csv格式更感兴趣,我有点困惑。

np.savetxt csv文件的作家不容易产生文本,如:

0.2, 4.3, 1.2 
1.1, 2.2, 3.1 
3.5, 4.1, 1.1, 4300 

1.2, 3.3, 1.2 
1.5, 2.4, 3.1 
3.5, 2.1, 1.1, 4400 

savetxt不太靠谱。它打开一个用于写入的文件,然后在输入数组上迭代,写入,每次一行到文件。有效:

for row in arr: 
    f.write(fmt % tuple(row)) 

其中fmt具有%字段中的row的每个元素。在简单的情况下,它构造了fmt = delimiter.join(['fmt']*(arr.shape[1]))。换句话说,重复虚拟字段fmt的列数。或者你可以给它一个多字段fmt

所以你可以使用普通的行/文件写入方法来编写自定义显示。最简单的方法是使用通常的print表示赞扬,然后将其重定向到文件。

不过话说做到这一点,还有如何读取回到一个numpy会话的问题。 np.genfromtxt可以处理丢失的数据,但您仍然必须包含分隔符。读取块(3行用空行分隔)也更为棘手。这不是不可能的,但你必须做一些预处理。

当然genfromtxt的是不是靠谱无论是。它逐行读取文件,将每行转换为数字或字符串列表,并将这些列表收集在主列表中。只有在最后才将该列表转换为数组。

我可以构建像与文本的数组:

In [121]: dt = np.dtype([('lbl',int), ('block', float, (3,3))]) 
In [122]: A = np.zeros((2,),dtype=dt) 
In [123]: A 
Out[123]: 
array([(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=[('lbl', '<i4'), ('block', '<f8', (3, 3))]) 
In [124]: A['lbl']=[4300,4400] 
In [125]: A[0]['block']=np.array([[.2,4.3,1.2],[1.1,2.2,3.1],[3.5,4.1,1.1]]) 
In [126]: A 
Out[126]: 
array([(4300, [[0.2, 4.3, 1.2], [1.1, 2.2, 3.1], [3.5, 4.1, 1.1]]), 
     (4400, [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]])], 
     dtype=[('lbl', '<i4'), ('block', '<f8', (3, 3))]) 
In [127]: A['block'] 
Out[127]: 
array([[[ 0.2, 4.3, 1.2], 
     [ 1.1, 2.2, 3.1], 
     [ 3.5, 4.1, 1.1]], 

     [[ 0. , 0. , 0. ], 
     [ 0. , 0. , 0. ], 
     [ 0. , 0. , 0. ]]]) 

我可以由具有所有扁平的块值一个txt加载:

In [130]: txt=b"""4300, 0.2, 4.3, 1.2, 1.1, 2.2, 3.1, 3.5, 4.1, 1.1""" 
In [131]: txt 
Out[131]: b'4300, 0.2, 4.3, 1.2, 1.1, 2.2, 3.1, 3.5, 4.1, 1.1' 

genfromtxt可以处理复杂的D型,从扁线列表中按顺序分配值:

In [133]: data=np.genfromtxt([txt],delimiter=',',dtype=dt) 
In [134]: data['lbl'] 
Out[134]: array(4300) 
In [135]: data['block'] 
Out[135]: 
array([[ 0.2, 4.3, 1.2], 
     [ 1.1, 2.2, 3.1], 
     [ 3.5, 4.1, 1.1]]) 

我不确定a回合写它。如果我想使用savetxt,我必须将其重新整形为10列或场数组。

+0

你是否建议我将CSV格式化为一行形状的二维数组,即[[0.2,4.3,1.2],[...],4300],然后使用Tf.TextReader轻松传递它?如果我这样做,Tensorflow可以很容易地知道每个样本中有x个特征(每个1D向量的第一个值)和y个时间步长(#1D向量),然后我可以初始化最后一个元素的占位符在2D矢量中。 –

+1

我不知道'TextReader'。 'numpy'读者不能处理括号,但'tf'可能。 – hpaulj

1

UPDATE:除了previos答案:

df.stack().to_csv('d:/temp/1D.csv', index=False) 

1D.csv:

0.2 
4.3 
1.2 
4300.0 
1.1 
2.2 
3.1 
4300.0 
3.5 
4.1 
1.1 
4300.0 
1.2 
3.3 
1.2 
4400.0 
1.5 
2.4 
3.1 
4400.0 
3.5 
2.1 
1.1 
4400.0 

OLD答案:

这里是大熊猫的解决方案。

假设我们有以下的文本文件:

0.2, 4.3, 1.2 
1.1, 2.2, 3.1 
3.5, 4.1, 1.1, 4300 

1.2, 3.3, 1.2 
1.5, 2.4, 3.1 
3.5, 2.1, 1.1, 4400 

代码:

import pandas as pd 

In [95]: fn = r'D:\temp\.data\data.txt' 

In [96]: df = pd.read_csv(fn, sep=',', skipinitialspace=True, header=None, names=list('abcd')) 

In [97]: df 
Out[97]: 
    a b c  d 
0 0.2 4.3 1.2  NaN 
1 1.1 2.2 3.1  NaN 
2 3.5 4.1 1.1 4300.0 
3 1.2 3.3 1.2  NaN 
4 1.5 2.4 3.1  NaN 
5 3.5 2.1 1.1 4400.0 

In [98]: df.d = df.d.bfill() 

In [99]: df 
Out[99]: 
    a b c  d 
0 0.2 4.3 1.2 4300.0 
1 1.1 2.2 3.1 4300.0 
2 3.5 4.1 1.1 4300.0 
3 1.2 3.3 1.2 4400.0 
4 1.5 2.4 3.1 4400.0 
5 3.5 2.1 1.1 4400.0 

现在您可以将档案储存为CSV:

df.to_csv('d:/temp/out.csv', index=False, header=None) 

d:/温度/出.csv:

0.2,4.3,1.2,4300.0 
1.1,2.2,3.1,4300.0 
3.5,4.1,1.1,4300.0 
1.2,3.3,1.2,4400.0 
1.5,2.4,3.1,4400.0 
3.5,2.1,1.1,4400.0 
+0

谢谢Max。但是,只要我想将最后一列定义为标签数组,这样的最终结果不会导致重复问题? –

+0

@Leb_Broth,我不确定我了解你...你能举个例子吗? – MaxU

+0

没关系,我现在明白了。我可以使用2个嵌套for循环,1用于构建(3x3)2D数组,并在循环开始之前再次将新数组推入相应标签(4300)col4的值。之后我可以轻松地将它们传递给TensorFlow。 –