output = Lambda(lambda x: x[:, 1:max_len + 1])(bert_model.output) model = Model(bert_model.input, output) def masked_cross_entropy(y_true, y_pred): """交叉熵作为loss,并mask掉padding部分的预测 """ y_true = K.reshape(y_true, [K.shape(y_true)[0], -1]) y_mask = K.cast(K.not_equal(y_true, 0), K.floatx()) cross_entropy = K.sparse_categorical_crossentropy(y_true, y_pred) cross_entropy = K.sum(cross_entropy * y_mask) / K.sum(y_mask) return cross_entropy model.compile(loss=masked_cross_entropy, optimizer=AdaFactor(learning_rate=1e-3)) model.summary() def ge_answer(wrong): """ 解码 :param wrong: :return: """ wrong_token_ids, _ = tokenizer.encode(wrong) token_ids = wrong_token_ids + [tokenizer._token_mask_id] * max_len + [ tokenizer._token_end_id ] segemnt_ids = [0] * len(token_ids) probas = model.predict([np.array([token_ids]),
# 构建模型 model = build_transformer_model(config_path=config_path, checkpoint_path=checkpoint_path, application='unilm', keep_tokens=keep_words) y_true = model.input[0][:, 1:] y_mask = model.input[1][:, 1:] y_pred = model.output[:, :-1] cross_entropy = K.sparse_categorical_crossentropy(y_true, y_pred) cross_entropy = K.sum(cross_entropy * y_mask) / K.sum(y_mask) model.add_loss(cross_entropy) model.compile(optimizer=AdaFactor(learning_rate=1e-3)) model.summary() def ge_answer(wrong): """ 解码 :param wrong: :return: """ wrong_token_ids, _ = tokenizer.encode(wrong) token_ids = wrong_token_ids + [tokenizer._token_mask_id] * max_len + [ tokenizer._token_end_id ] segemnt_ids = [0] * len(token_ids) probas = model.predict([np.array([token_ids]), np.array([segemnt_ids])])[0]