2016-09-18 50 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。 –