示例#1
0
def graph_loss(image_tower_output1, image_tower_output2,text_tower_output1, text_tower_output2,y1,y2, A, graph_threshold):
    batch_loss = []
    i = argmax(y1, axis=1)
    j = argmax(y2, axis=1)
    for k in range(len(i)):
        if (A[i[k]][j[k]] < graph_threshold):
            #Image_tower_embedding
            I = utils.cos_dist(image_tower_output1[k], image_tower_output2[k]) - A[i[k]][j[k]]
            #Text tower embedding
            T = utils.cos_dist(text_tower_output1[k], text_tower_output2[k]) - A[i[k]][j[k]]
            g_loss = I + T
            batch_loss.append(g_loss)
        else:
            g_loss = 0
            batch_loss.append(g_loss)
    # print(tf.convert_to_tensor(batch_loss).astype('float32'))
    return tf.convert_to_tensor(batch_loss,dtype='float32')
示例#2
0
def adv_interp(inputs,
               y,
               base_net,
               num_classes,
               epsilon=8,
               epsilon_y=0.5,
               v_min=0,
               v_max=255):
    # x: image batch with shape [batch_size, c, h, w]
    # y: one-hot label batch with shape [batch_size, num_classes]
    net = copy.deepcopy(base_net)
    x = inputs.clone()

    inv_index = torch.arange(x.size(0) - 1, -1, -1).long()
    x_prime = x[inv_index, :, :, :].detach()
    y_prime = y[inv_index, :]
    x_init = x.detach() + torch.zeros_like(x).uniform_(-epsilon, epsilon)

    x_init.requires_grad_()
    zero_gradients(x_init)
    if x_init.grad is not None:
        x_init.grad.data.fill_(0)
    net.eval()

    fea_b = net(x_init, mode='feature')
    fea_t = net(x_prime, mode='feature')

    loss_adv = cos_dist(fea_b, fea_t)
    net.zero_grad()
    loss_adv = loss_adv.mean()
    loss_adv.backward(retain_graph=True)

    x_tilde = x_init.data - epsilon * torch.sign(x_init.grad.data)

    x_tilde = torch.min(torch.max(x_tilde, inputs - epsilon), inputs + epsilon)
    x_tilde = torch.clamp(x_tilde, v_min, v_max)

    y_bar_prime = (1 - y_prime) / (num_classes - 1.0)
    y_tilde = (1 - epsilon_y) * y + epsilon_y * y_bar_prime

    return x_tilde.detach(), y_tilde.detach()
示例#3
0
def MMR(final_lis, stopwords, model):
    """
    根据MMR算法 保证摘要句子多样性
    :param final_lis: 初步摘要(句子,权重)列表
    :param stopwords:停用词表
    :param model:词向量模型
    :return:最终摘要的句子列表
    """
    #根据final_lis 获取句子列表
    sen_lis = [x[0] for x in final_lis]
    #权重列表
    weight_lis = [x[1] for x in final_lis]
    #定义摘要列表
    summary_lis = []
    #首先挑出来权重最大的一句话,它必然是摘要列表中的一句
    summary_lis.append(sen_lis[0])
    #为了方便处理 将作为最终摘要的句子 从预摘要列表里删除掉
    del sen_lis[0]
    del weight_lis[0]

    #根据要求个数摘要句子
    #如果只摘要一个句子 直接将结果返回就可以了
    if GlobalParameters.last_num == 1:
        return summary_lis
    #摘要不止一个句子 需要进行计算求解
    else:
        for i in range(len(sen_lis)):
            # 所有候选句子的向量列表
            vec_lis = [
                generate_vector.sentence_vector(x, stopwords, model)
                for x in sen_lis
            ]
            #已经作为摘要的句子向量列表
            summary_vec = [
                generate_vector.sentence_vector(x, stopwords, model)
                for x in summary_lis
            ]
            #定义各个句子的得分情况
            scores = []

            for vec1 in vec_lis:
                #计数器
                count = 0
                #初始化句子分数
                score = 0
                for vec2 in summary_vec:
                    score += GlobalParameters.alpha * weight_lis[count] - (
                        1 - GlobalParameters.alpha) * utils.cos_dist(
                            vec1, vec2)
                #求新句子与最终摘要句子的平均相似度
                count += 1
                scores.append(score / len(summary_vec))

            #根据最大分数的下标  求解对应的句子加入到摘要里面 通过array求解
            scores = np.array(scores)
            index = np.argmax(scores)
            #将对应句子加入到摘要列表
            summary_lis.append(sen_lis[index])

            #将对应句子 和 权重从预摘要列表里删除
            del sen_lis[index]
            del weight_lis[index]
        #返回指定需要的句子个数
        return summary_lis[:GlobalParameters.last_num]
示例#4
0
def get_first_summaries(text, stopwords, model):
    """

    :param text: 文档
    :param stopwords: 停用词
    :param model: 词向量模型
    :return: 摘要列表  按照权重从大到小排列[(句子,权重),(句子,权重)]
    """
    #获取(位置,句子)列表
    sentences = utils.get_sentences(text)

    #获取句子列表
    sen_lis = [x[1] for x in sentences]
    # print(sen_lis)
    #获取文档向量
    docvec = generate_vector.doc_vector(text, stopwords, model)

    #获取句子向量列表
    sen_vecs = []
    for i in range(len(sen_lis)):
        #假设是首句
        if i == 0:
            sen_vecs.append(
                generate_vector.sentence_vector(sen_lis[i], stopwords, model) *
                GlobalParameters.locFirst_weight)
        #如果是最后一句
        elif i == len(sen_lis) - 1:
            sen_vecs.append(
                generate_vector.sentence_vector(sen_lis[i], stopwords, model) *
                GlobalParameters.locLast_weight)
        #如果是中间的句子
        else:
            sen_vecs.append(
                generate_vector.sentence_vector(sen_lis[i], stopwords, model))

    #计算余弦值列表
    cos_lis = [utils.cos_dist(docvec, x) for x in sen_vecs]

    #计算关键词权重列表
    #获取关键词
    keywords = utils.get_keywords(text)

    #计算权重
    keyweights = [utils.keyword_weight(x, keywords) for x in sen_lis]

    #计算长度权重
    len_weigths = [utils.len_weight(x) for x in sen_lis]

    #根据余弦相似度 关键词权重 长度权重 计算每个句子最终权重
    final_weights = [
        cos * keyword * length for cos in cos_lis for keyword in keyweights
        for length in len_weigths
    ]

    #形成最后的(句子,权重列表)
    final_lis = []
    for sen, weight in zip(sen_lis, final_weights):
        final_lis.append((sen, weight))

    #将句子按照权重大小 从高到低排序
    final_lis = sorted(final_lis, key=lambda x: x[1], reverse=True)

    #取出第一次摘要的橘子个数
    final_lis = final_lis[:GlobalParameters.first_num]

    return final_lis
示例#5
0
文件: train.py 项目: IEEE-VIT/HUSE
def gap_loss(output_image_encoding, output_text_encoding):
    gap_loss = utils.cos_dist(output_image_encoding, output_text_encoding)
    return tf.convert_to_tensor(gap_loss)