2016-09-18 4 views
0

내 현재 텍스트 파일을 CSV를 전달하면 다음과 같습니다Tensorflow : 나는이 Tensorflow에서 LSTM 훈련을 위해 사용하고자하는 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 시퀀스는 1 레이블 3 개 특징 벡터가 각각의 샘플이 있습니다 . 이 텍스트 파일을 형식화하여 LSTM 교육과 일관성을 유지할 수 있으므로 후자는 시퀀스의 시간 단계가 필요하거나 일반적으로 LSTM 교육에는 3D 텐서 (일괄 처리, 시간 단계 수, 기능 수)가 필요합니다.

질문 : 3x3 시퀀스 벡터와 싱글 톤 레이블을 다시 포맷하기 위해 Numpy 또는 TensorFlow.TextReader을 어떻게 사용해야합니까? 그러면 Tensorflow와 호환 될 수 있습니까?

편집 : 벡터 및 레이블이있는 텍스트 또는 CSV 파일을 다시 포맷하는 데 대한 자습서가 많았지 만, 불행히도 1 : 1 관계에 해당했습니다. 명확하게 NumPy와이 읽을 수

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

을 간단 피드 포워드 (feed-forward) 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 객체에 관심이 있는지 조금 혼란 스럽습니다.

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이 까다로운되지 않습니다 : 같은

np.savetxt csv 파일 작가는 쉽게 텍스트를 생성 할 수 없습니다. 쓰기 위해 파일을 연 다음 입력 배열을 반복하여 한 번에 하나의 행을 파일에 씁니다.효과적으로 : fmt는 상기 row의 각 요소에 대한 필드가 %

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

. 간단한 경우에는 fmt = delimiter.join(['fmt']*(arr.shape[1]))을 생성합니다. 즉, 열의 수를 simgle 필드 fmt을 반복합니다. 또는 multifield fmt을 제공 할 수 있습니다.

따라서 사용자 정의 디스플레이를 작성하기 위해 일반 라인/파일 쓰기 메소드를 사용할 수 있습니다. 가장 간단한 방법은 보통 print 명령을 사용하여 구성한 다음 파일로 리디렉션하는 것입니다.

그러나이 작업을 수행 한 후이를 다시 numpy 세션으로 읽는 방법에 대한 질문이 있습니다. np.genfromtxt은 누락 된 데이터를 처리 할 수 ​​있지만 여전히 구분 기호를 포함해야합니다. 또한 블록을 읽게하는 것이 더 까다 롭습니다 (빈 줄로 구분 된 3 줄). 불가능하지는 않지만 사전 처리를해야합니다.

물론 genfromtxt도 그리 까다로운 것은 아닙니다. 파일을 한 줄씩 읽고 각 줄을 숫자 또는 문자열 목록으로 변환 한 다음 마스터 목록에서 해당 목록을 수집합니다. 결국에는리스트가 배열로 변환됩니다. 내가 평평 모든 블록 값이있는 TXT에서로드 할 수

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

:

내가 가진 텍스트와 같은 배열을 구성 할 수 있습니다

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를 [[0.2, 4.3, 1.2], [...], [...], 4300] 한 줄 모양의 2D 배열로 다시 포맷 한 다음 Tf.TextReader를 사용하여 쉽게 전달할 것을 제안 하시겠습니까? 그렇게하면 Tensorflow는 각 샘플 (각 1D 벡터의 첫 번째 값) 및 시간 단계 (# 1D 벡터)의 y 번호가있는 x 개의 숫자가 있음을 쉽게 알 수 있으며 마지막 요소의 자리 표시자를 초기화 할 수 있습니다 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

감사합니다. 그러나 마지막 배열을 레이블 배열로 정의하고 싶을 때마다 이러한 최종 결과로 인해 중복 문제가 발생하지 않을까요? –

+0

@Leb_Broth, 내가 너를 이해하는지 모르겠다. 너는 모범을 보일 수 있니? – MaxU

+0

이제 알았어. 2 중첩 된 루프, 1 (3x3) 2D 배열 작성 및 루프를 다시 시작하기 전에 새 배열에 해당 레이블 (4300) col4 값을 넣을 수 있습니다. 그런 다음 나중에 TensorFlow에 쉽게 전달할 수 있습니다. –

관련 문제