2017-11-05 4 views
1

임 LSTM가 Keras에서 작업하지만, 심지어 첫 번째 시대 이후, 정확도 (90 %)도 높은 것으로 보인다 걱정 임 제대로 훈련되지려고,이 게시물에서 몇 가지 아이디어를했다 : 여기 Keras LSTM 정확도도 높은

https://machinelearningmastery.com/text-generation-lstm-recurrent-neural-networks-python-keras/

내 코드입니다 : 여기

import numpy 
from keras.utils import np_utils 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.layers import LSTM 
from keras.layers import Dropout 
from keras.preprocessing.sequence import pad_sequences 
from pandas import read_csv 
import simplejson 

numpy.random.seed(7) 

dataset = read_csv("mydataset.csv", delimiter=",", quotechar='"').values 

char_to_int = dict((c, i) for i, c in enumerate(dataset[:,1])) 
int_to_char = dict((i, c) for i, c in enumerate(dataset[:,1])) 

f = open('char_to_int_v2.txt', 'w') 
simplejson.dump(char_to_int, f) 
f.close() 

f = open('int_to_char_v2.txt', 'w') 
simplejson.dump(int_to_char, f) 
f.close() 

seq_length = 1 

max_len = 5 

dataX = [] 
dataY = [] 

for i in range(0, len(dataset) - seq_length, 1): 
    start = numpy.random.randint(len(dataset)-2) 
    end = numpy.random.randint(start, min(start+max_len,len(dataset)-1)) 
    sequence_in = dataset[start:end+1] 
    sequence_out = dataset[end + 1] 
    dataX.append([[char[0], char_to_int[char[1]], char[2]] for char in sequence_in]) 
    dataY.append([sequence_out[0], char_to_int[sequence_out[1]], sequence_out[2]]) 

X = pad_sequences(dataX, maxlen=max_len, dtype='float32') 
X = numpy.reshape(X, (X.shape[0], max_len, 3)) 

y = numpy.reshape(dataY, (X.shape[0], 3)) 

batch_size = 1 

model = Sequential() 
model.add(LSTM(32, input_shape=(X.shape[1], X.shape[2]))) 
model.add(Dropout(0.2)) 
model.add(Dense(y.shape[1], activation='softmax')) 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 

n_epoch = 1 

for i in range(n_epoch): 
    model.fit(X, y, epochs=1, batch_size=batch_size, verbose=1, shuffle=False) 
    model.reset_states() 

model.save_weights("weights.h5") 
model.save('model.h5') 
with open('model-params.json', 'w') as f: 
    f.write(model.to_json()) 

scores = model.evaluate(X, y, verbose=0) 
print("Model Accuracy: %.2f%%" % (scores[1]*100)) 

내 데이터 집합 모습처럼 :

"time_date","name","user_id" 
1402,"Sugar",3012 
1402,"Milk",3012 
1802,"Tomatoes",3012 
1802,"Cucumber",3012 
etc... 
내 순서의 왼쪽 패딩 제로를, 그래서 때문에 내가 뭔가에 처음 3 개 결과를 만든다면 내가 이해에서

, 내 DATAX이의 형태가됩니다 (N_SAMPLES, 5, 3)은 (될 것입니다 두 번째 열은 임 예와 같은 임의의 숫자) 퍼팅 있도록 char_to_int의 FUNC을 기반으로합니다

[[0, 0, 0], [0, 0, 0], [0, 0, 0], [1402, 5323, 3012], [1402, 5324, 3012]] 

을 그리고 내 dataY은 다음과 같습니다

[[1802, 3212, 3012]] 

가 맞습니까? 이 한 시대 이후의 출력이기 때문에 그렇다면, 뭔가 확실히 잘못해야합니다 :이 모델을 거의 다 해요하지만 중요한 뭔가가있어 내가 모르는 같은 느낌

9700/9700 [==============================] - 31s - loss: 10405.0951 - acc: 0.8544 
Model Accuracy: 87.49% 

무엇 나는 이것에 대한 어떤 지침도 감사 할 것이다. 감사.

+1

지붕을 통해 당신의 손실을보세요. Y 데이터는 무엇입니까? 게시 한 샘플은 수천 개이며 바이너리 분류를 수행하고 있기 때문에 1과 2가 모두 포함 된 바이너리 배열이어야합니다. 그래서 출력이 이상하다 – DJK

+0

몇 개의 수업이 있습니까? 수업 균형이 잡혀 있습니까? 아마도 예제와 네트워크 단순의 90 %를 정확하게 나타내는 클래스가이 클래스를 항상 예측하도록 배웁니다. –

답변

0

내가 내 데이터를 모양 짓는 방법을 오해 한 것처럼 보입니다. Im은 (는) categorical_crossentropy 손실을 사용했기 때문에 완벽하게 작동하는 to_categorical을 사용하여 내 dataY를 핫 인코딩했습니다. 그러나, 큰 데이터 집합을 훈련하려고 할 때 나는 매우 유명한 MemoryError을 얻었다. 감사합니다 djk47463.

관련 문제