2017-02-09 21 views
5

मैं खेल रॉक-पेपर-कैंची में प्रतिद्वंद्वी के अगले कदम की भविष्यवाणी करने के लिए एलएसटीएम तंत्रिका नेटवर्क (केरास का उपयोग करके) का उपयोग करने की कोशिश कर रहा हूं।केरास एलएसटीएम प्रशिक्षण डेटा प्रारूप

मैंने रॉक के रूप में इनपुट को एन्कोड किया है: [1 0 0], पेपर: [0 1 0], कैंची: [0 0 1]। अब मैं तंत्रिका नेटवर्क को प्रशिक्षित करना चाहता हूं लेकिन मैं अपने प्रशिक्षण डेटा की डेटा संरचना में थोड़ा उलझन में हूं।

मैं निम्नलिखित संरचना के साथ एक .csv फ़ाइल में एक विरोधी के खेल इतिहास को संग्रहीत किया है:

1,0,0 
0,1,0 
0,1,0 
0,0,1 
1,0,0 
0,1,0 
0,1,0 
0,0,1 
1,0,0 
0,0,1 

और मैं प्रशिक्षण के रूप में मेरी प्रशिक्षण लेबल के रूप में हर 5 डेटा, और पिछले 4 डेटा का उपयोग करने की कोशिश कर रहा हूँ इनपुट। एक और शब्द में, हर बार कदम पर, आयाम 3 वाला एक वेक्टर नेटवर्क पर भेजा जाता है, और हमारे पास 4 बार चरण होते हैं।

उदाहरण के लिए, निम्नलिखित इनपुट डेटा

1,0,0 
0,1,0 
0,1,0 
0,0,1 

और पांचवें एक है प्रशिक्षण लेबल

1,0,0 

मेरा प्रश्न Keras 'LSTM नेटवर्क डेटा स्वरूप किस प्रकार स्वीकार नहीं करता है? इस उद्देश्य के लिए मेरे डेटा को पुनर्व्यवस्थित करने का एक इष्टतम तरीका क्या होगा? अगर यह मदद करता है मेरे अधूरा कोड निम्नलिखित के रूप में जुड़ा हुआ है:

#usr/bin/python 
from __future__ import print_function 

from keras.models import Sequential 
from keras.layers import Dense, Activation, Dropout 
from keras.layers.recurrent import LSTM 
from keras.optimizers import Adam 

output_dim = 3 
input_dim = 3 
input_length = 4 
batch_size = 20 #use all the data to train in one iteration 


#each input has such strcture 
#Rock: [1 0 0], Paper: [0 1 0], Scissor: [0 0 1] 
#4 inputs (vectors) are sent to the LSTM net and output 1 vector as the prediction 

#incomplete function 
def read_data(): 
    raw_training = np.genfromtxt('training_data.csv',delimiter=',') 




    print(raw_training) 

def createNet(summary=False): 
    print("Start Initialzing Neural Network!") 
    model = Sequential() 
    model.add(LSTM(4,input_dim=input_dim,input_length=input_length, 
      return_sequences=True,activation='softmax')) 
    model.add(Dropout(0.1)) 
    model.add(LSTM(4, 
      return_sequences=True,activation='softmax')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(3,activation='softmax')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(3,activation='softmax')) 
    model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy']) 
    if summary: 
     print(model.summary()) 
    return model 

if __name__=='__main__': 
    createNet(True) 

उत्तर

2

LSTM के लिए इनपुट प्रारूप एक आकार (sequence_length, input_dim) होनी चाहिए। तो आपके मामले में, आकार के numpy arrays (4,3) इसे करना चाहिए।

मॉडल के लिए आप क्या फ़ीड करेंगे, फिर आकार की एक संख्यात्मक सरणी होगी (number_of_train_examples, sequence_length, input_dim)। दूसरे शब्दों में, आप संख्या_of_train_examples आकार की तालिका (4,3) फ़ीड करेंगे। की एक सूची बनाएं:

1,0,0 
0,1,0 
0,1,0 
0,0,1 

और फिर np.array (list_of_train_example) से करते हैं।

हालांकि, मुझे समझ में नहीं आता कि आप दूसरे एलएसटीएम के लिए पूरे अनुक्रम क्यों लौटते हैं? यह आपको आकार (4,4) के साथ कुछ आउटपुट करेगा, घने परत शायद उस पर असफल हो जाएगी। रिटर्न अनुक्रम का अर्थ है कि आप पूरे अनुक्रम को वापस कर देंगे, इसलिए एलएसटीएम के प्रत्येक चरण में प्रत्येक छिपी हुई आउटपुट। मैं इसे दूसरे एलएसटीएम के लिए गलत पर सेट करूँगा ताकि केवल आकार का "सारांश" वेक्टर प्राप्त हो सके (4,) कि आपकी घन परत पढ़ सकती है। वैसे भी, पहले एलएसटीएम के लिए भी इसका मतलब है कि आकार (4,3) के इनपुट के साथ, आप आकार (4,4) के कुछ आउटपुट करते हैं, इसलिए आपके पास इस परत के इनपुट डेटा से अधिक पैरामीटर होंगे ... Can वास्तव में अच्छा नहीं होगा।

सक्रियण के संबंध में, मैं सॉफ्टमैक्स का भी उपयोग करता हूं लेकिन केवल अंतिम परत पर, परत के आउटपुट के रूप में संभावनाएं प्राप्त करने के लिए सॉफ्टमैक्स का उपयोग किया जाता है। आखिरकार एलएसटीएम और घने से मुलायम मिश्रण का उपयोग करना वास्तव में समझ में नहीं आता है। "सिग्मोइड" या "तन्ह" जैसी कुछ अन्य गैर रैखिकता के लिए जाएं।

यह मैं मॉडल के लिहाज से

def createNet(summary=False): 
    print("Start Initialzing Neural Network!") 
    model = Sequential() 
    model.add(LSTM(4,input_dim=input_dim,input_length=input_length, 
      return_sequences=True,activation='tanh')) 
    model.add(Dropout(0.1)) 
    # output shape : (4,4) 
    model.add(LSTM(4, 
      return_sequences=False,activation='tanh')) 
    model.add(Dropout(0.1)) 
    # output shape : (4,) 
    model.add(Dense(3,activation='tanh')) 
    model.add(Dropout(0.1)) 
    # output shape : (3,) 
    model.add(Dense(3,activation='softmax')) 
    # output shape : (3,) 
    model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy']) 
    if summary: 
     print(model.summary()) 
    return model 
क्या करेंगे है
संबंधित मुद्दे