2016-09-02 17 views
8

का उपयोग करते हुए वाक्य समानता इस work using the STS dataset पर आधारित वाक्य समानता आर्किटेक्चर को लागू करने का प्रयास कर रहा हूं। लेबल सामान्यीकृत समानता स्कोर 0 से 1 तक होते हैं, इसलिए इसे एक रिग्रेशन मॉडल माना जाता है।कैमरे

मेरी समस्या यह है कि नुकसान पहली युग से शुरू होने पर सीधे NaN पर जाता है। मैं क्या गलत कर रहा हूं?

मैंने पहले से ही नवीनतम केरे और थानो संस्करणों को अद्यतन करने का प्रयास किया है।

अपने मॉडल के लिए कोड है:

def create_lstm_nn(input_dim): 
    seq = Sequential()` 
    # embedd using pretrained 300d embedding 
    seq.add(Embedding(vocab_size, emb_dim, mask_zero=True, weights=[embedding_weights])) 
    # encode via LSTM 
    seq.add(LSTM(128)) 
    seq.add(Dropout(0.3)) 
    return seq 

lstm_nn = create_lstm_nn(input_dim) 

input_a = Input(shape=(input_dim,)) 
input_b = Input(shape=(input_dim,)) 

processed_a = lstm_nn(input_a) 
processed_b = lstm_nn(input_b) 

cos_distance = merge([processed_a, processed_b], mode='cos', dot_axes=1) 
cos_distance = Reshape((1,))(cos_distance) 
distance = Lambda(lambda x: 1-x)(cos_distance) 

model = Model(input=[input_a, input_b], output=distance) 

# train 
rms = RMSprop() 
model.compile(loss='mse', optimizer=rms) 
model.fit([X1, X2], y, validation_split=0.3, batch_size=128, nb_epoch=20) 

मैं भी Merge परत के बजाय एक सरल Lambda उपयोग करने की कोशिश, लेकिन यह एक ही परिणाम है।

def cosine_distance(vests): 
    x, y = vests 
    x = K.l2_normalize(x, axis=-1) 
    y = K.l2_normalize(y, axis=-1) 
    return -K.mean(x * y, axis=-1, keepdims=True) 

def cos_dist_output_shape(shapes): 
    shape1, shape2 = shapes 
    return (shape1[0],1) 

distance = Lambda(cosine_distance, output_shape=cos_dist_output_shape)([processed_a, processed_b]) 
+0

पाया हाय, मैं देख रहा हूँ आप StackOverflow के लिए नए हैं। समस्या की पहचान करने में हमारी सहायता के लिए, और उत्तर प्राप्त करने के लिए आपको तेज़ी से आवश्यकता है, क्या कोई अतिरिक्त जानकारी है जो आप प्रदान कर सकते हैं? आप क्या त्रुटियां देख रहे हैं, अगर कोई है? इसके बजाय आप किसकी अपेक्षा करते थे? –

+0

अच्छी तरह से, अब मैं यह पता लगाने की कोशिश कर रहा हूं कि प्रशिक्षण के दौरान मेरा नेटवर्क ** नैन ** क्यों हो जाता है। – lila

+0

शायद आपकी सीखने की दर बहुत अधिक है। शायद एक और समस्या है। यदि आप थेनो का उपयोग कर रहे हैं तो आप अपनी स्क्रिप्ट को अपवाद फेंकने के लिए ['THEANO_FLAGS = 'mode = NanGuardMode''] (http://deeplearning.net/software/theano/tutorial/modes.html) का उपयोग कर सकते हैं। 'नैन' मान का पता लगाया गया है, जिससे आप इस मुद्दे के स्थान पर एक ट्रेसबैक दे रहे हैं। – nemo

उत्तर

1

नैन गहरी सीखने के प्रतिगमन में एक आम मुद्दा है। चूंकि आप सियामीज़ नेटवर्क का उपयोग कर रहे हैं, तो आप अनुवर्ती कोशिश कर सकते हैं:

  1. अपना डेटा जांचें: क्या उन्हें सामान्यीकृत करने की आवश्यकता है?
  2. अंतिम परत के रूप में अपने नेटवर्क में एक घने परत जोड़ने की कोशिश करें, लेकिन सक्रियण फ़ंक्शन को चुनने से सावधान रहें, उदा। relu
  3. अन्य हानि फ़ंक्शन का उपयोग करने का प्रयास करें, उदा। contrastive_loss
  4. आपकी सीखने की दर को छोटा करें, उदा। 0.0001
  5. क्योंकि मोड ध्यान से शून्य से भाग के साथ सौदा नहीं है, NaN

का कारण यह गहरी सीखने काम पूरी तरह से बनाने के लिए आसान नहीं है हो सकता है।

0

मैं nan समस्या में नहीं चला था, लेकिन मेरा नुकसान नहीं बदलेगा। मैं इस जानकारी check this out

def cosine_distance(shapes): 
    y_true, y_pred = shapes 
    def l2_normalize(x, axis): 
     norm = K.sqrt(K.sum(K.square(x), axis=axis, keepdims=True)) 
     return K.sign(x) * K.maximum(K.abs(x), K.epsilon())/ K.maximum(norm, K.epsilon()) 
    y_true = l2_normalize(y_true, axis=-1) 
    y_pred = l2_normalize(y_pred, axis=-1) 
    return K.mean(1 - K.sum((y_true * y_pred), axis=-1)) 
संबंधित मुद्दे