2016-09-18 4 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 
> 
> ... 

各サンプルのための唯一の1ラベルを持つ3列3つの特徴ベクトルがあります。 。私はこのテキストファイルをフォーマットして、LSTMの訓練と一貫性を持たせることができます。なぜなら、LSTMの訓練は、シーケンスの時間ステップを必要とするのか、一般的にLSTM訓練には3Dテンソル(バッチ、タイムステップ数、特徴数)が必要です。

私の質問:3x3シーケンスベクトルとシングルトンラベルを再フォーマットするために、NumpyまたはTensorFlow.TextReaderをどのように使って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 

は次のようになります。はっきりnumpyのが読み取り可能で、シンプルなフィードフォワードNNのタスクのための専用そこから簡単にベクトルを構築することができます

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

。しかし、この手順は実際にはLSTMに優しいCSVを構築するものではありません。

EDIT:CSV形式のTensorFlowチュートリアルでは、2D配列のみを例に取り上げます。 features = col1, col2, col3は、各配列配列のための時間ステップがあり、したがって私の質問があるかもしれないと仮定しません。

+0

この理由でパンダを使用できない理由はありますか?そうでない場合は、おそらくnumpyの 'reshape'、' ravel'、 'view'、あるいは[構造化配列](http://docs.scipy.org/doc/numpy/user/basics.rec.html)で何かできます。 ) – JGreenwell

答えて

1

numpy配列の構造に興味があるか、csv fomatに興味があるか少し混乱します。

よう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はトリッキーではありません。これは、書き込みのためにファイルを開き、入力配列を繰り返して、一度に1行ずつファイルに書き出します。効果:fmtrowの各要素について%フィールドを有する

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

。単純な場合、それはfmt = delimiter.join(['fmt']*(arr.shape[1]))を構成します。言い換えれば、列の数はシムルフィールドfmtを繰り返します。または、それに複数のフィールドを与えることができますfmt

通常の行/ファイル書き込みメソッドを使用してカスタム表示を書き込むことができます。最も簡単なのは、通常のprintのコマンドを使用して構築し、それをファイルにリダイレクトすることです。

しかし、これを実行した後で、そのセッションをnumpyセッションに読み込む方法の問題があります。 np.genfromtxtは欠落したデータを処理できますが、依然として区切り文字を含める必要があります。ブロックを読み込ませるのも面倒です(3行は空白行で区切ります)。それは不可能ではありませんが、いくつかの前処理が必要です。

もちろんgenfromtxtでもそれほど難解ではありません。ファイルを1行ずつ読み込み、各行を数字や文字列のリストに変換し、それらのリストをマスターリストにまとめます。最後にはそのリストが配列に変換されます。

私はあなたのテキストのような配列を作成することができます

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は、複雑なDTYPEを扱うことができ、フラットラインリストから順に値を割り当てます。

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]]) 

それを書きます。 savetxtを使用したい場合は、10列またはフィールド配列に再構成する必要があります。

+0

CSVを1行の2D配列[[0.2、4.3、1.2]、[...]、[...]、4300]に再フォーマットして、Tf.TextReaderを使用して簡単に渡すことをお勧めしますか?そうすれば、Tensorflowは各サンプルにx個のフィーチャ(各1Dベクトルの最初の値)とy個のタイムステップ(#1Dベクトル)があることを簡単に知ることができ、最後の要素のプレースホルダを初期化できます2Dベクトルの中で。 –

+1

私は 'TextReader'について知りません。 'numpy'読者は大括弧を扱うことはできませんが、' tf'は可能です。 – hpaulj

1

UPDATE:&過去の答えにほか:

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:/ TEMP /アウトを

たちは、次のテキストファイルを持っていると仮定します.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

ありがとうございました。しかし、最後の列をラベル配列として定義したいときは、このような最終結果で重複の問題は発生しませんか? –

+0

@Leb_Broth、私はあなたを理解しているか分からない...あなたは例を挙げることができますか? – MaxU

+0

これは大丈夫です。 2つのネストされたforループを使用することができます.1つは、(3x3)2次元配列を構築するためのものです。ループが再び開始する前に、対応するlabel(4300)col4の値を新しい配列にプッシュします。その後、後でTensorFlowに簡単に渡すことができます。 –