Knowledge-based-BERT(三)

news2024/11/14 1:56:29

多种预训练任务解决NLP处理SMILES的多种弊端,代码:Knowledge-based-BERT,原文:Knowledge-based BERT: a method to extract molecular features like computational chemists,代码解析继续downstream_task。模型框架如下:
在这里插入图片描述

文章目录

  • 1.load_data_for_random_splited
  • 2.model
    • 2.1.pos_weight
    • 1.2.load_pretrained_model
  • 3.run
    • 3.1.run_an_eval_global_epoch
    • 3.2.step

for task in args['task_name_list']:
    args['task_name'] = task
    args['data_path'] = '../data/task_data/' + args['task_name'] + '.npy'

    all_times_train_result = []
    all_times_val_result = []
    all_times_test_result = []
    result_pd = pd.DataFrame()
    result_pd['index'] = ['roc_auc', 'accuracy', 'sensitivity', 'specificity', 'f1-score', 'precision', 'recall',
                          'error rate', 'mcc']

    for time_id in range(args['times']):
        set_random_seed(2020+time_id)
        train_set, val_set, test_set, task_number = build_data.load_data_for_random_splited(
            data_path=args['data_path'], shuffle=True
        )
        print("Molecule graph is loaded!")

1.load_data_for_random_splited

def load_data_for_random_splited(data_path='example.npy', shuffle=True):
    data = np.load(data_path, allow_pickle=True)
    smiles_list = data[0]
    tokens_idx_list = data[1]
    labels_list = data[2]
    mask_list = data[3]
    group_list = data[4]
    if shuffle:
        random.shuffle(group_list)
    print(group_list)
    train_set = []
    val_set = []
    test_set = []
    task_number = len(labels_list[1])
    for i, group in enumerate(group_list):
        molecule = [smiles_list[i], tokens_idx_list[i], labels_list[i], mask_list[i]]
        if group == 'training':
            train_set.append(molecule)
        elif group == 'val':
            val_set.append(molecule)
        else:
            test_set.append(molecule)
    print('Training set: {}, Validation set: {}, Test set: {}, task number: {}'.format(
            len(train_set), len(val_set), len(test_set), task_number))
    return train_set, val_set, test_set, task_number

2.model

train_loader = DataLoader(dataset=train_set,
                                  batch_size=args['batch_size'],
                                  shuffle=True,
                                  collate_fn=collate_data)

        val_loader = DataLoader(dataset=val_set,
                                batch_size=args['batch_size'],
                                collate_fn=collate_data)

        test_loader = DataLoader(dataset=test_set,
                                 batch_size=args['batch_size'],
                                 collate_fn=collate_data)
        pos_weight_task = pos_weight(train_set)
        one_time_train_result = []
        one_time_val_result = []
        one_time_test_result = []
        print('***************************************************************************************************')
        print('{}, {}/{} time'.format(args['task_name'], time_id+1, args['times']))
        print('***************************************************************************************************')

        loss_criterion = torch.nn.BCEWithLogitsLoss(reduction='none', pos_weight=pos_weight_task.to(args['device']))
        model = K_BERT_WCL(d_model=args['d_model'], n_layers=args['n_layers'], vocab_size=args['vocab_size'],
                            maxlen=args['maxlen'], d_k=args['d_k'], d_v=args['d_v'], n_heads=args['n_heads'], d_ff=args['d_ff'],
                            global_label_dim=args['global_labels_dim'], atom_label_dim=args['atom_labels_dim'])
        stopper = EarlyStopping(patience=args['patience'], pretrained_model=args['pretrain_model'],
                                pretrain_layer=args['pretrain_layer'],
                                task_name=args['task_name']+'_downstream_k_bert_wcl', mode=args['mode'])
        model.to(args['device'])
        stopper.load_pretrained_model(model)
        optimizer = Adam(model.parameters(), lr=args['lr'])

2.1.pos_weight

def pos_weight(train_set):
    smiles, tokens_idx, labels, mask = map(list, zip(*train_set))
    task_pos_weight_list = []
    for j in range(len(labels[1])):
        num_pos = 0
        num_impos = 0
        for i in labels:
            if i[j] == 1:
                num_pos = num_pos + 1
            if i[j] == 0:
                num_impos = num_impos + 1
        task_pos_weight = num_impos / (num_pos+0.00000001)
        task_pos_weight_list.append(task_pos_weight)
    return torch.tensor(task_pos_weight_list)
  • 这里不理解为什么这么设置 task_pos_weight_list

1.2.load_pretrained_model

    def load_pretrained_model(self, model):
        if self.pretrain_layer == 1:
            pretrained_parameters = ['embedding.tok_embed.weight', 'embedding.pos_embed.weight', 'embedding.norm.weight', 'embedding.norm.bias', 'layers.0.enc_self_attn.linear.weight', 'layers.0.enc_self_attn.linear.bias', 'layers.0.enc_self_attn.layernorm.weight', 'layers.0.enc_self_attn.layernorm.bias', 'layers.0.enc_self_attn.W_Q.weight', 'layers.0.enc_self_attn.W_Q.bias', 'layers.0.enc_self_attn.W_K.weight', 'layers.0.enc_self_attn.W_K.bias', 'layers.0.enc_self_attn.W_V.weight', 'layers.0.enc_self_attn.W_V.bias', 'layers.0.pos_ffn.fc.0.weight', 'layers.0.pos_ffn.fc.2.weight', 'layers.0.pos_ffn.layernorm.weight', 'layers.0.pos_ffn.layernorm.bias']

        elif self.pretrain_layer == 2:
            pretrained_parameters = ['embedding.tok_embed.weight', 'embedding.pos_embed.weight', 'embedding.norm.weight', 'embedding.norm.bias', 'layers.0.enc_self_attn.linear.weight', 'layers.0.enc_self_attn.linear.bias', 'layers.0.enc_self_attn.layernorm.weight', 'layers.0.enc_self_attn.layernorm.bias', 'layers.0.enc_self_attn.W_Q.weight', 'layers.0.enc_self_attn.W_Q.bias', 'layers.0.enc_self_attn.W_K.weight', 'layers.0.enc_self_attn.W_K.bias', 'layers.0.enc_self_attn.W_V.weight', 'layers.0.enc_self_attn.W_V.bias', 'layers.0.pos_ffn.fc.0.weight', 'layers.0.pos_ffn.fc.2.weight', 'layers.0.pos_ffn.layernorm.weight', 'layers.0.pos_ffn.layernorm.bias', 'layers.1.enc_self_attn.linear.weight', 'layers.1.enc_self_attn.linear.bias', 'layers.1.enc_self_attn.layernorm.weight', 'layers.1.enc_self_attn.layernorm.bias', 'layers.1.enc_self_attn.W_Q.weight', 'layers.1.enc_self_attn.W_Q.bias', 'layers.1.enc_self_attn.W_K.weight', 'layers.1.enc_self_attn.W_K.bias', 'layers.1.enc_self_attn.W_V.weight', 'layers.1.enc_self_attn.W_V.bias', 'layers.1.pos_ffn.fc.0.weight', 'layers.1.pos_ffn.fc.2.weight', 'layers.1.pos_ffn.layernorm.weight', 'layers.1.pos_ffn.layernorm.bias']

        elif self.pretrain_layer == 3:
		...
		elif self.pretrain_layer == 'all_12layer':
            pretrained_parameters = ['embedding.tok_embed.weight', 'embedding.pos_embed.weight',
                                     'embedding.norm.weight', 'embedding.norm.bias',
                                     'layers.0.enc_self_attn.linear.weight', 'layers.0.enc_self_attn.linear.bias',
                                     'layers.0.enc_self_attn.layernorm.weight', 'layers.0.enc_self_attn.layernorm.bias',
                                     'layers.0.enc_self_attn.W_Q.weight', 'layers.0.enc_self_attn.W_Q.bias',
                                     'layers.0.enc_self_attn.W_K.weight', 'layers.0.enc_self_attn.W_K.bias',
                                     'layers.0.enc_self_attn.W_V.weight', 'layers.0.enc_self_attn.W_V.bias',
                                     'layers.0.pos_ffn.fc.0.weight', 'layers.0.pos_ffn.fc.2.weight',
                                     'layers.0.pos_ffn.layernorm.weight', 'layers.0.pos_ffn.layernorm.bias',
                                     'layers.1.enc_self_attn.linear.weight', 'layers.1.enc_self_attn.linear.bias',
                                     'layers.1.enc_self_attn.layernorm.weight', 'layers.1.enc_self_attn.layernorm.bias',
                                     'layers.1.enc_self_attn.W_Q.weight', 'layers.1.enc_self_attn.W_Q.bias',
                                     'layers.1.enc_self_attn.W_K.weight', 'layers.1.enc_self_attn.W_K.bias',
                                     'layers.1.enc_self_attn.W_V.weight', 'layers.1.enc_self_attn.W_V.bias',
                                     'layers.1.pos_ffn.fc.0.weight', 'layers.1.pos_ffn.fc.2.weight',
                                     'layers.1.pos_ffn.layernorm.weight', 'layers.1.pos_ffn.layernorm.bias',
                                     'layers.2.enc_self_attn.linear.weight', 'layers.2.enc_self_attn.linear.bias',
                                     'layers.2.enc_self_attn.layernorm.weight', 'layers.2.enc_self_attn.layernorm.bias',
                                     'layers.2.enc_self_attn.W_Q.weight', 'layers.2.enc_self_attn.W_Q.bias',
                                     'layers.2.enc_self_attn.W_K.weight', 'layers.2.enc_self_attn.W_K.bias',
                                     'layers.2.enc_self_attn.W_V.weight', 'layers.2.enc_self_attn.W_V.bias',
                                     'layers.2.pos_ffn.fc.0.weight', 'layers.2.pos_ffn.fc.2.weight',
                                     'layers.2.pos_ffn.layernorm.weight', 'layers.2.pos_ffn.layernorm.bias',
                                     'layers.3.enc_self_attn.linear.weight', 'layers.3.enc_self_attn.linear.bias',
                                     'layers.3.enc_self_attn.layernorm.weight', 'layers.3.enc_self_attn.layernorm.bias',
                                     'layers.3.enc_self_attn.W_Q.weight', 'layers.3.enc_self_attn.W_Q.bias',
                                     'layers.3.enc_self_attn.W_K.weight', 'layers.3.enc_self_attn.W_K.bias',
                                     'layers.3.enc_self_attn.W_V.weight', 'layers.3.enc_self_attn.W_V.bias',
                                     'layers.3.pos_ffn.fc.0.weight', 'layers.3.pos_ffn.fc.2.weight',
                                     'layers.3.pos_ffn.layernorm.weight', 'layers.3.pos_ffn.layernorm.bias',
                                     'layers.4.enc_self_attn.linear.weight', 'layers.4.enc_self_attn.linear.bias',
                                     'layers.4.enc_self_attn.layernorm.weight', 'layers.4.enc_self_attn.layernorm.bias',
                                     'layers.4.enc_self_attn.W_Q.weight', 'layers.4.enc_self_attn.W_Q.bias',
                                     'layers.4.enc_self_attn.W_K.weight', 'layers.4.enc_self_attn.W_K.bias',
                                     'layers.4.enc_self_attn.W_V.weight', 'layers.4.enc_self_attn.W_V.bias',
                                     'layers.4.pos_ffn.fc.0.weight', 'layers.4.pos_ffn.fc.2.weight',
                                     'layers.4.pos_ffn.layernorm.weight', 'layers.4.pos_ffn.layernorm.bias',
                                     'layers.5.enc_self_attn.linear.weight', 'layers.5.enc_self_attn.linear.bias',
                                     'layers.5.enc_self_attn.layernorm.weight', 'layers.5.enc_self_attn.layernorm.bias',
                                     'layers.5.enc_self_attn.W_Q.weight', 'layers.5.enc_self_attn.W_Q.bias',
                                     'layers.5.enc_self_attn.W_K.weight', 'layers.5.enc_self_attn.W_K.bias',
                                     'layers.5.enc_self_attn.W_V.weight', 'layers.5.enc_self_attn.W_V.bias',
                                     'layers.5.pos_ffn.fc.0.weight', 'layers.5.pos_ffn.fc.2.weight',
                                     'layers.5.pos_ffn.layernorm.weight', 'layers.5.pos_ffn.layernorm.bias',

                                     'layers.6.enc_self_attn.linear.weight', 'layers.6.enc_self_attn.linear.bias',
                                     'layers.6.enc_self_attn.layernorm.weight', 'layers.6.enc_self_attn.layernorm.bias',
                                     'layers.6.enc_self_attn.W_Q.weight', 'layers.6.enc_self_attn.W_Q.bias',
                                     'layers.6.enc_self_attn.W_K.weight', 'layers.6.enc_self_attn.W_K.bias',
                                     'layers.6.enc_self_attn.W_V.weight', 'layers.6.enc_self_attn.W_V.bias',
                                     'layers.6.pos_ffn.fc.0.weight', 'layers.6.pos_ffn.fc.2.weight',
                                     'layers.6.pos_ffn.layernorm.weight', 'layers.6.pos_ffn.layernorm.bias',
                                     'layers.7.enc_self_attn.linear.weight', 'layers.7.enc_self_attn.linear.bias',
                                     'layers.7.enc_self_attn.layernorm.weight', 'layers.7.enc_self_attn.layernorm.bias',
                                     'layers.7.enc_self_attn.W_Q.weight', 'layers.7.enc_self_attn.W_Q.bias',
                                     'layers.7.enc_self_attn.W_K.weight', 'layers.7.enc_self_attn.W_K.bias',
                                     'layers.7.enc_self_attn.W_V.weight', 'layers.7.enc_self_attn.W_V.bias',
                                     'layers.7.pos_ffn.fc.0.weight', 'layers.7.pos_ffn.fc.2.weight',
                                     'layers.7.pos_ffn.layernorm.weight', 'layers.7.pos_ffn.layernorm.bias',
                                     'layers.8.enc_self_attn.linear.weight', 'layers.8.enc_self_attn.linear.bias',
                                     'layers.8.enc_self_attn.layernorm.weight', 'layers.8.enc_self_attn.layernorm.bias',
                                     'layers.8.enc_self_attn.W_Q.weight', 'layers.8.enc_self_attn.W_Q.bias',
                                     'layers.8.enc_self_attn.W_K.weight', 'layers.8.enc_self_attn.W_K.bias',
                                     'layers.8.enc_self_attn.W_V.weight', 'layers.8.enc_self_attn.W_V.bias',
                                     'layers.8.pos_ffn.fc.0.weight', 'layers.8.pos_ffn.fc.2.weight',
                                     'layers.8.pos_ffn.layernorm.weight', 'layers.8.pos_ffn.layernorm.bias',
                                     'layers.9.enc_self_attn.linear.weight', 'layers.9.enc_self_attn.linear.bias',
                                     'layers.9.enc_self_attn.layernorm.weight', 'layers.9.enc_self_attn.layernorm.bias',
                                     'layers.9.enc_self_attn.W_Q.weight', 'layers.9.enc_self_attn.W_Q.bias',
                                     'layers.9.enc_self_attn.W_K.weight', 'layers.9.enc_self_attn.W_K.bias',
                                     'layers.9.enc_self_attn.W_V.weight', 'layers.9.enc_self_attn.W_V.bias',
                                     'layers.9.pos_ffn.fc.0.weight', 'layers.9.pos_ffn.fc.2.weight',
                                     'layers.9.pos_ffn.layernorm.weight', 'layers.9.pos_ffn.layernorm.bias',
                                     'layers.10.enc_self_attn.linear.weight', 'layers.10.enc_self_attn.linear.bias',
                                     'layers.10.enc_self_attn.layernorm.weight',
                                     'layers.10.enc_self_attn.layernorm.bias', 'layers.10.enc_self_attn.W_Q.weight',
                                     'layers.10.enc_self_attn.W_Q.bias', 'layers.10.enc_self_attn.W_K.weight',
                                     'layers.10.enc_self_attn.W_K.bias', 'layers.10.enc_self_attn.W_V.weight',
                                     'layers.10.enc_self_attn.W_V.bias', 'layers.10.pos_ffn.fc.0.weight',
                                     'layers.10.pos_ffn.fc.2.weight', 'layers.10.pos_ffn.layernorm.weight',
                                     'layers.10.pos_ffn.layernorm.bias'
                                     'fc.1.weight', 'fc.1.bias', 'fc.3.weight', 'fc.3.bias', 'classifier_global.weight',
                                     'classifier_global.bias', 'classifier_atom.weight', 'classifier_atom.bias']
		pretrained_model = torch.load(self.pretrained_model, map_location=torch.device('cpu'))
        # pretrained_model = torch.load(self.pretrained_model)
        model_dict = model.state_dict()
        pretrained_dict = {k: v for k, v in pretrained_model['model_state_dict'].items() if k in pretrained_parameters}
        model_dict.update(pretrained_dict)
        model.load_state_dict(pretrained_dict, strict=False)

3.run

for epoch in range(args['num_epochs']):
        train_score = run_a_train_global_epoch(args, epoch, model, train_loader, loss_criterion, optimizer)
        # Validation and early stop
        _ = run_an_eval_global_epoch(args, model, train_loader)[0]
        val_score = run_an_eval_global_epoch(args, model, val_loader)[0]
        test_score = run_an_eval_global_epoch(args, model, test_loader)[0]
        if epoch < 5:
            early_stop = stopper.step(0, model)
        else:
            early_stop = stopper.step(val_score, model)
        print('epoch {:d}/{:d}, {}, lr: {:.6f},  train: {:.4f}, valid: {:.4f}, best valid {:.4f}, '
              'test: {:.4f}'.format(
              epoch + 1, args['num_epochs'], args['metric_name'], optimizer.param_groups[0]['lr'], train_score, val_score,
              stopper.best_score, test_score))
        if early_stop:
            break
stopper.load_checkpoint(model)

3.1.run_an_eval_global_epoch

def run_an_eval_global_epoch(args, model, data_loader):
    model.eval()
    eval_meter = Meter()
    with torch.no_grad():
        for batch_id, batch_data in enumerate(data_loader):
            smiles, token_idx, global_labels, mask = batch_data
            token_idx = token_idx.long().to(args['device'])
            mask = mask.float().to(args['device'])
            global_labels = global_labels.float().to(args['device'])
            logits_global = model(token_idx)
            eval_meter.update(logits_global, global_labels, mask=mask)
            del token_idx, global_labels
            torch.cuda.empty_cache()
    y_pred, y_true = eval_meter.compute_metric('return_pred_true')
    y_true_list = y_true.squeeze(dim=1).tolist()
    y_pred_list = torch.sigmoid(y_pred).squeeze(dim=1).tolist()
    # save prediction
    y_pred_label = [1 if x >= 0.5 else 0 for x in y_pred_list]
    auc = metrics.roc_auc_score(y_true_list, y_pred_list)
    accuracy = metrics.accuracy_score(y_true_list, y_pred_label)
    se, sp = sesp_score(y_true_list, y_pred_label)
    pre, rec, f1, sup = metrics.precision_recall_fscore_support(y_true_list, y_pred_label)
    mcc = metrics.matthews_corrcoef(y_true_list, y_pred_label)
    f1 = f1[1]
    rec = rec[1]
    pre = pre[1]
    err = 1 - accuracy
    result = [auc, accuracy, se, sp, f1, pre, rec, err, mcc]
    return result

3.2.step

def step(self, score, model):
        if self.best_score is None:
            self.best_score = score
            self.save_checkpoint(model)
        elif self._check(score, self.best_score):
            self.best_score = score
            self.save_checkpoint(model)
            self.counter = 0
        else:
            self.counter += 1
            print(
                'EarlyStopping counter: {} out of {}'.format(self.counter, self.patience))
            if self.counter >= self.patience:
                self.early_stop = True
        return self.early_stop

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML中的div和span标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>HTML中的div和span标签</title> </head> <body> <!-- 1、div和span是什么&#xff1f;有什么用…

【linux】文件操作(IO)详述

文件操作一、引入二、系统调用接口2.1 open与close2.2 write2.3 read三、文件描述符3.1 分配规则四、重定向4.1 输出重定向4.2 追加重定向4.3 输入重定向4.4 独立性五、缓冲区5.1 缓冲区刷新策略5.2 缓冲区位置5.3 现象解释六、文件系统6.1 文件系统分区6.1.1 分区图6.1.2 介绍…

实时推荐业务介绍 grpc接口对接

5.1 实时推荐业务介绍 学习目标 目标 无应用 无 5.1.1 实时推荐逻辑 逻辑流程 1、后端发送推荐请求&#xff0c;实时推荐系统拿到请求参数 grpc对接2、根据用户进行ABTest分流 ABTest实验中心&#xff0c;用于进行分流任务&#xff0c;方便测试调整不同的模型上线3、推荐中心…

k8s之部署有状态应用

写在前面 本文一起看下k8s对于有状态应用部署提供的解决方案。 1&#xff1a;有状态应用和无状态应用 如果是一个应用每次重启时依赖环境都能和第一次启动时的完全一致&#xff0c;则就可以称这类应用是无状态应用用&#xff0c;反之&#xff0c;就是有状态应用&#xff0c;如…

自动写代码的AI工具,已经支持 VsCode 插件安装使用

自动写代码的AI工具&#xff0c;已经支持 VsCode 插件安装使用&#xff0c;它的功能并不是「代码补全」&#xff0c;而是「代码生成」。 之前有个比较火的 GitHub Copilot&#xff0c;但是这是商业产品&#xff0c;并且没有开源&#xff0c;现在又被告了。 GitHub Copilot 面…

SQLSERVER 事务日志的 LSN 到底是什么?

一&#xff1a;背景 1. 讲故事 大家都知道数据库应用程序 它天生需要围绕着数据文件打转&#xff0c;诸如包含数据的 .mdf&#xff0c;事务日志的 .ldf&#xff0c;很多时候深入了解这两类文件的合成原理&#xff0c;差不多对数据库就能理解一半了&#xff0c;关于 .mdf 的合…

代码随想录--二叉树章节总结 Part II

代码随想录–二叉树章节总结 Part II 1.Leetcode222 求完全二叉树结点的个数 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达…

Python机器学习:特征变换

&#x1f315; 特征变换 特征变换主要就是针对一个特征&#xff0c;使用合适的方法&#xff0c;对数据的分布、尺度等进行变换&#xff0c;以满足建模时对数据的需求。 特征变换可分为数据的数据的无量纲化处理和数据特征变换。 &#x1f317; 数据的无量纲化处理 常用处理…

22.0:Codejock Suite Pro for ActiveX COM:Crack

从 Visual Basic 5.0 和 6.0 开始一直到当前版本的 Visual Studio 的大多数 ActiveX 容器。与 Visual Studio 无缝集成并包含我们所有 ActiveX COM 产品的评估版本。评估版不提供 OCX 文件的 Unicode 版本。 创建包含一整套高度可定制的用户界面组件的专业应用程序&#xff0c;…

Flink-FinkSQL基本操作(Table API、动态表、事件窗口、分组聚合开窗查询、联结查询)

11 Table API和SQL 11.1 快速上手 引入TableAPI的依赖 桥接器 <dependency><groupId>org.apache.flink</groupId> <artifactId>flink-table-api-java-bridge_${scala.binary.version}</artifactId><version>${flink.version}</vers…

12、常用插件

文章目录12、常用插件推荐1&#xff1a;Alibaba Java Coding Guidelines推荐2&#xff1a;jclasslib bytecode viewer推荐3&#xff1a;Translation推荐4&#xff1a;GenerateAllSetter推荐5&#xff1a;Rainbow Brackets推荐6&#xff1a;CodeGlance Pro推荐7&#xff1a;Stat…

7.bWAPP -- INSECURE DIRECT OBJECT REFERENCES

7.bWAPP – INSECURE DIRECT OBJECT REFERENCES 0x01、Insecure DOR (Change Secret) 同 XSS - Stored (Change Secret) Low 仔细观察页面, 发现隐藏一个input标签, 作用是输入用户名, 并且配合提交的修改密码, 完成修改用户密码的操作: 这里就可以利用该用户名input标签达…

如何带好一个团队?团队管理的要点有哪些?

想带好一个团队并不是这么容易&#xff0c;尤其是对于新晋升管理者来说更是难上加难。团队管理可以大大提高工作效率。那么&#xff0c;团队管理的要点是什么呢&#xff1f; 1、远景和目标 成员们先要有一个共同的目标&#xff0c;在此基础上还必须要有一个好的愿景&#xff0…

即时通讯系列---如何下手做技术方案设计

1. 引出主题 IM整体涉及的内容比较多, 做技术方案设计需要慎重, 可以先从功能列表以及核心case逐步的总结出技术方案 本文结构: 1. 查看功能列表 2. 核心case分析 3. 总结技术方案设计 2. 如何做技术方案设计 1. 查看功能列表 功能清单 一级分类 二级分类 三级分类…

TCP/UDP网络编程

目录 一、常见的客户端服务端模型 二、Socket套接字 1、概念 2、分类 a、流套接字 b、数据报套接字 c、原始套接字 三、UDP数据报套接字编程 四、TCP数据报套接字编程 一、常见的客户端服务端模型 客户端&#xff1a;用户使用的程序。 服务端&#xff1a;给用户提…

miracl编译及使用

文章目录Windows平台编译网址 https://miracl.com/https://github.com/miracl/MIRACL Windows平台编译 源码目录下新建文件夹ms32或ms64&#xff0c;把/lib/ms32doit.bat或ms64doit.bat分别拷进去。 把源码include和source目录所有文件拷贝进要编译的ms32或ms64&#xff0c…

【高阶数据结构】海量数据如何处理? (位图 布隆过滤器)

&#x1f308;欢迎来到高阶数据结构专栏~~位图 & 布隆过滤器 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff0…

模拟实现list / list迭代器

前言&#xff1a;学习C的STL&#xff0c;我们不仅仅要求自己能够熟练地使用各种接口&#xff0c;我们还必须要求自己了解一下其底层的实现方法&#xff0c;这样可以帮助我们写出比较高效的代码程序&#xff01; ⭐在本篇文章中&#xff0c;list的迭代器是重点&#xff0c;它不…

WSL2配置网络代理

注意&#xff1a;本文参考自文章&#xff1a;WSL2配置代理&#xff0c;是对原文的补充&#xff0c;使其适用于河对岸云服务代理。 1 开启Windows代理 1.1 开启代理软件的局域网访问权限 请注意&#xff1a;本文的WSL2代理配置&#xff0c;需要Windows的代理软件已经能够正常…

HTTPS详解及HTTPS实验

目录 HTTPS 一&#xff0c;https在参考模型中的位置 二&#xff0c;什么是HTTPS 三&#xff0c;什么是SSL 1&#xff0c;SSL 协议分为两层&#xff1a; 2&#xff0c;SSL 协议提供的服务&#xff1a; 四&#xff0c;HTTPS的加密方式 1&#xff0c;常见的加密算法 2&#xff0c;…