def get_multiplier(self): """根据schedule定义分段线性函数 """ schedule = sorted(self.schedule.items()) if schedule[0][0] != 0: schedule = [(0, 0.)] + schedule lr = K.constant(schedule[0][1], dtype='float32') t = K.cast(self.iterations, 'float32') for i in range(len(schedule)): if i == len(schedule) - 1: x = K.constant(schedule[i][1], dtype='float32') t0 = schedule[i][0] else: dx = schedule[i + 1][1] - schedule[i][1] dt = schedule[i + 1][0] - schedule[i][0] k = 1. * dx / dt t0 = schedule[i][0] x0 = schedule[i][1] x = x0 + k * (t - t0) lr = K.switch(t >= t0, x, lr) return lr
def __init__(self, docs_encode, **kwargs): """ 余弦相似度层, 不适合大规模语料, 比如100w以上的问答对 :param docs_encode: np.array, bert-white vector of senence :param kwargs: """ self.docs_encode = docs_encode super(CosineLayer, self).__init__(**kwargs) self.docs_vector = K.constant(self.docs_encode, dtype="float32") self.l2_docs_vector = K.sqrt( K.sum(K.maximum(K.square(self.docs_vector), 1e-12), axis=-1)) # x_inv_norm