Keras

2016-01-29 28 views
9

में बार-बार होने तंत्रिका नेटवर्क (RNN) के लिए एम्बेडिंग लेयर का उपयोग कैसे करें मैं और तंत्रिका नेटवर्क और Keras लाइब्रेरी के लिए नहीं बल्कि नए हूँ मैं के रूप में वर्णित here मेरी इनपुट डेटा मुखौटा करने के लिए कैसे मैं एम्बेडिंग लेयर का उपयोग कर सकते सोच रहा हूँ RNN के लिए 2 डी टेंसर से 3 डी टेंसर तक। कहते हैं कि मैं आदेश समय टी के लिए फीचर वेक्टर की भविष्यवाणी करने में RNN पिछले 2 सुविधा वैक्टर देने के लिए चाहते हो जाएगाKeras

X_train = [ 
    [1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    ... 
] # with a length of 1000 

अब,:

मेरी timeseries डेटा इस प्रकार की तलाश में (एक बढ़ती हुई समय के साथ) कहो +1।

वर्तमान में (एम्बेडिंग परत के बिना), मैं आकार (nb_samples, timesteps, input_dim) के साथ आवश्यक 3 डी टेंसर बना रहा हूं (जैसा कि इस उदाहरण में here) है।

मेरी उदाहरण के लिए संबंधित, अंतिम 3 डी टेन्सर तो के रूप में विचार करेंगे इस प्रकार है:

X_train_2 = [ 
    [[1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0]], 
    [[2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0]], 
    [[3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0]], 
    etc... 
] 

और Y_train:

Y_train = [ 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    etc... 
] 

मेरे मॉडल के रूप में निम्नानुसार (ऊपर सरल उदाहरण के लिए अनुकूलित) दिखता है:

num_of_vectors = 2 
vect_dimension = 4 

model = Sequential() 
model.add(SimpleRNN(hidden_neurons, return_sequences=False, input_shape=(num_of_vectors, vect_dimension))) 
model.add(Dense(vect_dimension)) 
model.add(Activation("linear")) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 
model.fit(X_train, Y_train, batch_size=50, nb_epoch=10, validation_split=0.15) 

और अंततः, मेरा प्रश्न होगा, मैं उन 2 डी टेंसर को कैसे करने से बच सकता हूं 3 डी टेंसर खुद को दोबारा बदल रहा है और इसके बजाय एम्बेडिंग परत का उपयोग करें? मैं के बाद मॉडल = अनुक्रमिक लगता है() मैं की तरह कुछ जोड़ना होगा:

model.add(Embedding(?????)) 

शायद इस सवाल का जवाब नहीं बल्कि सरल है, मैं बस एम्बेडिंग परत के प्रलेखन से उलझन में हूँ।

उत्तर

7

आप कर सकते हैं आप इसे इस प्रकार है:

नोट:

  1. मैं कुछ एक्स और वाई 0 केवल आपके इनपुट संरचना के कुछ विचार दे करने के लिए के रूप में उत्पन्न।

  2. यदि आपके पास एक बहु श्रेणी y_train है, तो आपको बिनराइज करना होगा।

  3. यदि आपके पास विभिन्न लंबाई का डेटा है तो आपको पैडिंग जोड़ने की आवश्यकता हो सकती है।

  4. यदि मैं समय टी + 1 पर भविष्यवाणी करने के बारे में सही ढंग से समझ गया, तो आप अनुक्रम सीखने के लिए अनुक्रम देखना चाहते हैं।

की तरह कुछ का प्रयास करें:

hidden_neurons = 4 
nb_classes =3 
embedding_size =10 

X = np.zeros((128, hidden_neurons), dtype=np.float32) 
y = np.zeros((128, nb_classes), dtype=np.int8) 


model = Sequential() 
model.add(Embedding(hidden_neurons, embedding_size)) 
model.add(SimpleRNN(hidden_neurons, return_sequences=False)) 
model.add(Dense(nb_classes)) 
model.add(Activation("softmax")) 
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', class_mode="categorical") 
model.fit(X, y, batch_size=1, nb_epoch=1) 
+0

शायद मुझे अपनी सभी संख्याओं के पीछे ".0" जोड़ना चाहिए था। मैं वास्तव में एक स्पष्ट विश्लेषण करने की कोशिश नहीं कर रहा हूँ। – Kito

0

मैं अब तक क्या पता से, एम्बेडिंग परत word embedding तरह आयामी स्वरूप कम करने के लिए कम या ज्यादा हो रहा है। तो इस अर्थ में यह सामान्य reshaping उपकरण के रूप में लागू प्रतीत नहीं होता है।

मूल रूप से यदि आपके पास {कार: 1, माउस: 2 ... ज़ेबरा: 99 99} जैसे पूर्णांक के शब्दों का मैपिंग है, तो आपका इनपुट टेक्स्ट उन पूर्णांक आईडी के प्रतिनिधित्व वाले शब्दों का वेक्टर होगा, जैसे [1, 2 , 99 99 ...], जिसका मतलब होगा [कार, माउस, ज़ेबरा ...]।लेकिन यह शब्दावली की लंबाई के साथ वास्तविक संख्याओं के वैक्टरों को शब्दों को मैप करने में सक्षम प्रतीत होता है, इसलिए यदि आपके पाठ में 1000 अद्वितीय शब्द हैं, तो आप प्रत्येक शब्द को 1000 की लंबाई के साथ वास्तविक संख्याओं के वेक्टर में मैप करेंगे। मुझे यकीन नहीं है कि मैं लगता है कि यह ज्यादातर वजन का प्रतिनिधित्व करता है कि एक शब्द का अर्थ अन्य सभी शब्दों के समान है, लेकिन मुझे यकीन नहीं है कि सही है और wheher शब्दों को एम्बेड करने के अन्य तरीके हैं।

संबंधित मुद्दे