使用keras的句子相似度



我正在尝试使用STS数据集基于这项工作实现句子相似度架构。标签是标准化的相似度分数,从0到1,因此假设它是一个回归模型。

我的问题是损失从第一个历元开始直接到NaN。我做错了什么?

我已经尝试更新到最新的keras和ano版本。

我的模型代码是:

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)

我也尝试使用一个简单的Lambda而不是Merge层,但它有相同的结果。

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])

nan是深度学习回归中的一个常见问题。由于您正在使用暹罗网络,您可以尝试以下操作:

  1. 检查你的数据:它们需要规范化吗?
  2. 尝试在你的网络中添加一个Dense层作为最后一层,但是要小心选择一个激活函数,例如relu
  3. 尝试使用其他损失函数,例如:contrastive_loss
  4. 降低你的学习速率,例如0.0001
  5. cos模式没有仔细处理除零,可能是NaN
  6. 的原因。
让深度学习完美地工作并不容易。

我没有遇到nan问题,但我的损失不会改变。我发现了这个信息看看这个

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))

相关内容

  • 没有找到相关文章

最新更新