2016-09-24 5 views
22

LSTM with Keras을 구현하려고합니다.데이터 프레임에서 신경망 LSTM 입력 모양

Keras의 LSTM은 형상이 (nb_samples, timesteps, input_dim) 인 3D 텐서가 필요하다는 것을 알고 있습니다. 그러나 여러 개의 샘플 (예 : (nb_samples=1, timesteps=T, input_dim=N))이 아닌 각 입력에 대해 T 개의 관측치 중 하나의 샘플 만 있기 때문에 필자의 경우 입력이 어떤 모양인지 잘 모르겠습니다. 각 입력을 길이가 T/M 인 샘플로 나누는 것이 더 좋은가? T은 내게 몇 백만 건의 관찰 결과입니다. 그렇다면 각 샘플을 얼마나 오래 사용해야하는지, 즉 M을 선택하는 방법은 무엇입니까? 또한

, 내가 바로 그에서 오전처럼 보일 것이다이 텐서 : M과 N은 이전과 같이 정의 x는 전술 한 바와 같이, 내가 분할에서 얻은 것이다 마지막 샘플에 해당

[[[a_11, a_12, ..., a_1M], [a_21, a_22, ..., a_2M], ..., [a_N1, a_N2, ..., a_NM]], [[b_11, b_12, ..., b_1M], [b_21, b_22, ..., b_2M], ..., [b_N1, b_N2, ..., b_NM]], ..., [[x_11, x_12, ..., a_1M], [x_21, x_22, ..., x_2M], ..., [x_N1, x_N2, ..., x_NM]]]

?

마지막으로, 각 열에 T 개의 관측치와 N 열 (각 입력에 대해 하나)이 포함 된 판다 데이터 프레임이 주어지면 Keras에 공급할 수있는 입력을 어떻게 만들 수 있습니까?

+0

질문에 예제 데이터 세트를 추가 할 수 있습니까? 어떤 입력 시퀀스가 ​​모델에서 어떤 종류의 목표 출력을 만들지는 분명하지 않기 때문에. – mertyildiran

+0

@mertyildiran 유감스럽게도 지금은 예제를 쉽게 만들 수 없습니다. 그러나 모든 회귀 입력, 즉 y에 대한 하나의 timeseries 및 x에 대한 시계입니다. – dreamer

+0

하나의 관찰을위한 형식 또는 데이터 유형을 설명 할 수 있습니까? 그것은 하나의 숫자 값, 일련의 값 또는 다른 것입니까? – Andrew

답변

20

다음은 LSTM을 교육하기 위해 시계열 데이터를 설정하는 예입니다.모델 생성 방법을 보여주기 위해 모델 출력을 설정하기 만하면 모델 출력은 엉뚱한 것입니다.

import pandas as pd 
import numpy as np 
# Get some time series data 
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/timeseries.csv") 
df.head() 

시간 시리즈 dataframe : 당신은 벡터에 넣어 입력을 구축하고 시계열의 순서를 구축 팬더에게 .cumsum() 기능을 사용할 수 있습니다

Date  A  B  C  D  E  F  G 
0 2008-03-18 24.68 164.93 114.73 26.27 19.21 28.87 63.44 
1 2008-03-19 24.18 164.89 114.75 26.22 19.07 27.76 59.98 
2 2008-03-20 23.99 164.63 115.04 25.78 19.01 27.04 59.61 
3 2008-03-25 24.14 163.92 114.85 27.41 19.61 27.84 59.41 
4 2008-03-26 24.44 163.45 114.84 26.86 19.53 28.02 60.09 

:

# Put your inputs into a single list 
df['single_input_vector'] = df[input_cols].apply(tuple, axis=1).apply(list) 
# Double-encapsulate list so that you can sum it in the next step and keep time steps as separate elements 
df['single_input_vector'] = df.single_input_vector.apply(lambda x: [list(x)]) 
# Use .cumsum() to include previous row vectors in the current row list of vectors 
df['cumulative_input_vectors'] = df.single_input_vector.cumsum() 

출력 유사한 방식으로 설정할 수 있지만 시퀀스 대신 단일 벡터가됩니다 :

# If your output is multi-dimensional, you need to capture those dimensions in one object 
# If your output is a single dimension, this step may be unnecessary 
df['output_vector'] = df[output_cols].apply(tuple, axis=1).apply(list) 

입력 시퀀스는 모델을 통해 실행할 수있는 같은 길이로, 그래서 당신은 그들이 당신의 누적 벡터의 최대 길이로 패드에 필요

# Pad your sequences so they are the same length 
from keras.preprocessing.sequence import pad_sequences 

max_sequence_length = df.cumulative_input_vectors.apply(len).max() 
# Save it as a list 
padded_sequences = pad_sequences(df.cumulative_input_vectors.tolist(), max_sequence_length).tolist() 
df['padded_input_vectors'] = pd.Series(padded_sequences).apply(np.asarray) 

훈련 데이터가에서 가져온 할 수있다 데이터 프레임과 numpy 배열에 넣어. 데이터 프레임에서 나오는 입력 데이터는 3D 배열을 만들지 않습니다. 동일한 배열이 아닌 배열 배열을 만듭니다.

hstack 및 reshape를 사용하여 3D 입력 배열을 만들 수 있습니다.

# Extract your training data 
X_train_init = np.asarray(df.padded_input_vectors) 
# Use hstack to and reshape to make the inputs a 3d vector 
X_train = np.hstack(X_train_init).reshape(len(df),max_sequence_length,len(input_cols)) 
y_train = np.hstack(np.asarray(df.output_vector)).reshape(len(df),len(output_cols)) 

그것을 증명하려면, 당신은 훈련 데이터가 있으면

>>> print(X_train_init.shape) 
(11,) 
>>> print(X_train.shape) 
(11, 11, 6) 
>>> print(X_train == X_train_init) 
False 

당신이 당신의 입력 레이어 및 출력 레이어의 크기를 정의 할 수 있습니다.

# Get your input dimensions 
# Input length is the length for one input sequence (i.e. the number of rows for your sample) 
# Input dim is the number of dimensions in one input vector (i.e. number of input columns) 
input_length = X_train.shape[1] 
input_dim = X_train.shape[2] 
# Output dimensions is the shape of a single output vector 
# In this case it's just 1, but it could be more 
output_dim = len(y_train[0]) 

빌드 모델 :

from keras.models import Model, Sequential 
from keras.layers import LSTM, Dense 

# Build the model 
model = Sequential() 

# I arbitrarily picked the output dimensions as 4 
model.add(LSTM(4, input_dim = input_dim, input_length = input_length)) 
# The max output value is > 1 so relu is used as final activation. 
model.add(Dense(output_dim, activation='relu')) 

model.compile(loss='mean_squared_error', 
       optimizer='sgd', 
       metrics=['accuracy']) 

마지막으로 당신이 모델을 학습과 역사와 교육의 로그를 저장할 수 있습니다

# Set batch_size to 7 to show that it doesn't have to be a factor or multiple of your sample size 
history = model.fit(X_train, y_train, 
       batch_size=7, nb_epoch=3, 
       verbose = 1) 

출력 : 그것을

Epoch 1/3 
11/11 [==============================] - 0s - loss: 3498.5756 - acc: 0.0000e+00  
Epoch 2/3 
11/11 [==============================] - 0s - loss: 3498.5755 - acc: 0.0000e+00  
Epoch 3/3 
11/11 [==============================] - 0s - loss: 3498.5757 - acc: 0.0000e+00 

입니다 . 을 사용하십시오. XX_train과 동일한 형식 (샘플 수 제외)을 사용하여 모델에서 예측을 수행하십시오.

+0

이것은 내가 필요로하는 바로 위대하다. 매우 감사합니다! 나에게 분명하지 않은 한 가지는 출력 차원을 의미합니다. 한편으로는 "이 경우에는 1이지만, 더 많은 숫자가 "이라고 말하면서 "나는 임의로 출력 치수를 4로 선택했습니다"라고 말합니다. 출력 크기는 y의 열 수 (즉, 관측 수는 아니지만 동시에 예측하려는 변수 수 *)입니까? 실제로 1 일 때 왜 4를 선택할 수 있습니까? – dreamer

+1

소원 Btw가 만료되기 전에 현상금을 당신에게 줄 수 있었으면 좋았을 것입니다. 정말 당신의 대답을 많이 주셔서 감사합니다! 이것으로 엄청난 어려움을 겪었습니다. – dreamer

+0

저는 두 가지 출력에 대해 이야기하고 있습니다. 숨겨진 레이어 출력과 최종 출력입니다. 내가 만든 네트워크는 실제로 2 개의 레이어 (입력 벡터를 레이어로 계산하지 않음)를 가지고 있습니다. LSTM 레이어와 Dense 레이어가 있습니다. LSTM은 숨겨진 계층입니다. LSTM 레이어에서 전달 된 벡터는 4 차원이지만 이론적으로는 그 모양의 벡터를 입력으로 사용하는 후속 밀도 레이어로 어떤 숫자라도 선택할 수 있습니다. 이 경우 최종 출력 (즉, y의 값)은 단일 숫자이지만 n 차원의 벡터가 될 수 있으므로 더 자세히 표현할 수 있습니다. – Andrew

3

텐서

당신은 Keras가 LSTM의 신경 네트워크에 대한 3D 텐서를 기대하고 그 권리있어 모양,하지만 난 당신이 누락 된 조각 Keras는 각 관측 여러 차원을 가질 수 것으로 예상하고 있다고 생각 .

예를 들어 Keras에서는 자연어 처리를 위해 문서를 나타내는 단어 벡터를 사용했습니다. 문서의 각 단어는 n 차원 수치 벡터로 표현됩니다 (따라서 n = 2 인 경우 단어 'cat'은 [0.31, 0.65]과 같이 표시됩니다). 단일 문서를 나타내려면 단어 벡터가 순서대로 나열됩니다 (예 : '고양이 앉아서'= [[0.12, 0.99], [0.31, 0.65], [0.94, 0.04]]). 문서는 Keras LSTM에서 하나의 샘플이됩니다.

이것은 사용자의 시계열 관찰과 유사합니다. 문서는 시계열과 같으며 단어는 시계열에서 하나의 관찰과 같습니다.하지만 귀하의 경우에는 관찰의 표현이 단지 n = 1 치수입니다. 그 때문에의

, 나는 당신의 관찰 각각 하나 개의 숫자 때문에 텐서는 xnb_samples에 해당 [[[a1], [a2], ... , [aT]], [[b1], [b2], ..., [bT]], ..., [[x1], [x2], ..., [xT]]], timesteps = Tinput_dim = 1 같은 것을해야한다고 생각합니다.

배치 크기

배치 크기는이 Cross Validated post에 따라, 컴퓨터에 메모리 용량을 초과하지 않고 처리량을 최대화하기 위해 설정해야합니다. 내가 아는 한, 귀하의 의견은 귀하의 배치 크기의 배수 일 필요는 없으며, 모델을 교육하고 예측을 할 때도 마찬가지입니다.

Keras Github이 LSTM 입력 염기 서열을 한 다른 네트워크 유형을 사용하여 예제의 숫자가에 당신이 샘플 코드를 찾고 있다면.

+0

답해 주셔서 감사합니다. 팬더 (Pandas) 데이터 프레임에서 시작하여 설명하는 모양으로 실제로 데이터를 얻는 것이 어렵다는 것을 알았습니다. 그리고 배치 크기에 관해서는 Keras가'nb_samples'의 배수가 될 것을 요구합니다.이전에 링크 된 예제를 본 적이 있지만, 실제로는 시계열 및 여러 입력에 해당하는 것이 아니며 실제로는 훨씬 어려워집니다 (시도 할 때 보게 될 것입니다). 예를 들어, 예를 들어 기본 코드를 사용하는 경우에도 그 예를 들어 주시겠습니까? SKLearn Boston 데이터 세트? – dreamer

+0

보스턴 데이터 집합에 시계열 데이터가 포함되어 있습니까? – Andrew

+0

글쎄, 정말 시계열 데이터인지 잘 모르겠다.하지만 정말로 중요하지는 않다. 다음번 숫자가 다음 데이터 포인트와 일치하는 것처럼 행동한다. 어쨌든 타임 스탬프가 포함 된 열의 트랙이므로 데이터 집합에 시간 열이 포함되지 않아도 상관 없습니다.) 예측을 수행하기 위해 내부 및 외부 샘플 집합으로 분할합니다. – dreamer