2016-09-02 25 views
8

Tôi đang cố triển khai cấu trúc tương tự câu dựa trên số work using the STS dataset này. Nhãn là điểm tương đồng chuẩn hóa từ 0 đến 1 vì vậy nó được giả định là một mô hình hồi quy.Tương tự câu bằng cách sử dụng keras

Vấn đề của tôi là mất trực tiếp đến NaN bắt đầu từ kỷ nguyên đầu tiên. Tôi đang làm gì sai?

Tôi đã thử cập nhật lên phiên bản mới nhất và phiên bản mới nhất.

Mã cho mô hình của tôi là:

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) 

Tôi cũng đã cố gắng sử dụng một đơn giản Lambda thay vì lớp Merge, nhưng nó có cùng một kết quả.

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

Xin chào, tôi thấy bạn mới sử dụng StackOverflow. Để giúp chúng tôi xác định sự cố và để nhận được câu trả lời bạn cần nhanh hơn, bạn có thể cung cấp thêm thông tin bổ sung nào không? Bạn đang gặp lỗi gì, nếu có? Bạn đã mong đợi điều gì? –

+0

tốt, bây giờ tôi đang cố gắng tìm ra lý do tại sao mạng của tôi bị mất ** nan ** trong khi tập luyện. – lila

+0

Có thể tỷ lệ học tập của bạn quá cao. Có thể có một vấn đề khác. Nếu bạn đang sử dụng Theano bạn có thể sử dụng ['THEANO_FLAGS = 'mode = NanGuardMode''] (http://deeplearning.net/software/theano/tutorial/modes.html) khi bắt đầu kịch bản của bạn để có nó ném một ngoại lệ, nơi một Giá trị 'nan' được phát hiện, cho phép bạn truy nguyên lại vị trí của vấn đề. – nemo

Trả lời

1

nan là một vấn đề phổ biến trong hồi quy học tập sâu. Vì bạn đang sử dụng mạng Xiêm, bạn có thể thử theo dõi:

  1. kiểm tra dữ liệu của bạn: chúng có cần được chuẩn hóa không?
  2. cố gắng thêm lớp Dày đặc vào mạng của bạn làm lớp cuối cùng, nhưng hãy cẩn thận chọn một hàm kích hoạt, ví dụ: relu
  3. cố gắng sử dụng một chức năng mất mát khác, ví dụ: contrastive_loss
  4. nhỏ hơn tỷ lệ học tập của bạn, ví dụ: 0,0001
  5. chế độ cos không cẩn thận đối phó với phép chia cho không, có thể là nguyên nhân gây ra NaN

Nó không phải là dễ dàng để làm cho công việc học tập sâu một cách hoàn hảo.

0

Tôi đã không gặp sự cố nan, nhưng sự mất mát của tôi sẽ không thay đổi. Tôi đã tìm thấy thông tin này 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)) 
Các vấn đề liên quan