2017-11-01 10 views
1

숫자로 표시된 범주 집합에서 시퀀스의 다음 범주를 예측합니다. 나는 이것을 텍스트 생성기로 모델링했다.TensorFlow의 LSTM 범주 형 시퀀스에 대한 OneHotEncoding

각 범주에 대해 번호를 만들었으므로이 숫자를 열거 함수를 통해 할당하는 숫자 정보로 keras 및 tensorflow로 해석 할 수 있습니다. 출력에 OneHotEncoding을 사용해야한다는 오류가 발생했습니다. 진행 방법을 모르겠습니다.

정보의 OneHotEncoding이 어떻게 생겼는지 샘플링했지만 코드의 본문으로이 작업을 수행하는 방법을 모르고/반대로 OneHotEncoding이없는 입력이 내 코드를 변경하는 방법을 알아 봅니다.

저는 아직 M/C 학습이 충분히 이해되고 있다고 생각하지 않지만, 저는 제 자신을 가르치고 있습니다.

import numpy as np 
from numpy import array 
from numpy import argmax 

import tensorflow as tf 

import keras 
from keras.utils import to_categorical 
from keras.utils import np_utils 
from keras.layers import LSTM 
from keras.models import Sequential 
from keras.layers import Dense, Activation 
from keras.layers import Input, Dense 
from keras.layers import TimeDistributed 
from keras.models import Model 

data= ['10001426', '10001426','10001426','5121550', '5431000', '10001426', '10001426', '10001466','10001426','5121550', '10001426', '10001426', '10001426','10001426','5431000', '10001426', '10001426', '10001466','10001426','5121550', '5431000', '10001426', '10001426', '10001466','10001426','5121550', '5431000', '10001426', '10001426', '10001466','10001426','5121550', '5431000', '10001426', '10001426', '10001466','10001426','5121550'] 
data= array(data) 

chars=['10001426','5121550','5431000','10001466'] 
chars= array(chars) 
""" 
#OneHotEncode - turns the category into an encoded array 
encoded = to_categorical(data) 
print(encoded) 
encoded2 = to_categorical(chars) 
print(encoded2) 

#Invert OneHotEncode 

inverted = argmax(encoded[0]) 
print inverted 
inverted2 = argmax(encoded[0]) 
print inverted2 
""" 
#Parameters 
SEQ_LENGTH = 2 # Learn in steps of 2 
VOCAB_SIZE = len(chars) #numer of features - how many categories of fault 

#Prepare training data 

ix_to_char={ix:char for ix, char in enumerate(chars)} 
char_to_ix={char:ix for ix, char in enumerate(chars)} 

X= np.zeros((len(data)/SEQ_LENGTH, SEQ_LENGTH, VOCAB_SIZE)) 
y= np.zeros((len(data)/SEQ_LENGTH, SEQ_LENGTH, VOCAB_SIZE)) 


for i in range((len(data)/SEQ_LENGTH)): 
    if (i+1)*SEQ_LENGTH<len(data):  
     X_sequence = data[(i)*SEQ_LENGTH:(i+1)*SEQ_LENGTH] 


     X_sequence_ix=[char_to_ix[value] for value in X_sequence] 
     input_sequence= np.zeros((SEQ_LENGTH, VOCAB_SIZE)) 

     print ((i+1)*SEQ_LENGTH, len(data)) 
     print input_sequence 

    for j in range(SEQ_LENGTH): 
     input_sequence[j][X_sequence_ix[j]]=1. 
    X[i]=input_sequence 

    y_sequence = data[i*SEQ_LENGTH+1:(i+1)*(SEQ_LENGTH+1)] 
    y_sequence_ix = [char_to_ix[value] for value in y_sequence] 
    target_sequence= np.zeros((SEQ_LENGTH, VOCAB_SIZE)) 

    for j in range(SEQ_LENGTH): 
     if (i+1)*(SEQ_LENGTH+1)<(SEQ_LENGTH): 
      target_sequence[j][y_sequence_ix[j]]=1 
    y[i]=target_sequence 
    print y[i] 


#Create the network 
HIDDEN_DIM=1 
LAYER_NUM= 1 

model = Sequential() 
model.add(LSTM(HIDDEN_DIM, input_shape=(None, VOCAB_SIZE), 
return_sequences=True)) 

for i in range(LAYER_NUM-1): 
    model.add(LSTM(HIDDEN_DIM, return_sequences=True))   
model.add(Activation('softmax')) 
model.compile(loss="categorical_crossentropy",optimizer="rmsprop") 


#Train the network 

nb_epoch = 0 
BATCH_SIZE = 5 
GENERATE_LENGTH = 7 

while True: 
    print ('\n\n') 
    model.fit(X,y,batch_size=BATCH_SIZE,verbose=1, epochs=1) 
    nb_epoch +=1 
    generate_text(model, GENERATE_LENGTH) 

    if nb_epoch %5==0: 
     model.save_weights('checkpoint_{}_epoch_{}.hdf5'.format(HIDDEN_DIM, nb_epoch)) 

model.summary() 
+0

'sparse_categorical_crossentropy'를 손실 함수로 사용해보십시오. –

+0

내 대답을 확인 했습니까? –

답변

0

최종 레이어의 출력 크기는 VOCAB_SIZE입니다.

for i in range(LAYER_NUM-1): 
    model.add(LSTM(HIDDEN_DIM, return_sequences=True)) 
model.add(Dense(VOCAB_SIZE))   
model.add(Activation('softmax')) 
model.compile(loss="categorical_crossentropy",optimizer="rmsprop") 

또는 마지막 LSTM 계층에서 적절한 출력을 설정하여

(이것은 조금 지루한 나는이 부분에 대한 코드를 건너 뜁니다) : 당신은 특별한 Dense 레이어를 추가하여이 작업을 수행 할 수있는 중.