疯狂交互学习的BM3推荐算法(论文复现)

news2024/11/27 8:23:40

疯狂交互学习的BM3推荐算法(论文复现)

本文所涉及所有资源均在传知代码平台可获取

文章目录

    • 疯狂交互学习的BM3推荐算法(论文复现)
      • 多模态推荐系统
        • 优点
      • 示例
      • 对比学习
      • 什么是对比学习?
        • 关键思想
        • 优点
      • 自监督学习
      • 什么是自监督学习?
        • 优点
      • 实现自监督学习的方法
      • 解决方案
      • 框架图
      • 损失函数(每一步都是自监督对比)
      • 图重构损失
      • 模态间对齐损失
      • 模态内特征遮蔽损失
      • 实验分析
        • 环境部署
        • 数据集配置
        • 代码运行
        • 运行截图
      • 代码分析
        • Loss分析
        • 参数代码分析
      • 相关文件作用分析
      • 代码算法复现结果
      • 创新思路方向
      • 总结

多模态推荐系统

什么是多模态推荐系统?

多模态推荐系统是一种利用多种不同类型的数据源(例如文本、图像、视频、音频等)来进行推荐的系统。传统的推荐系统通常只依赖于单一模态的数据,例如用户的评分或点击行为,而多模态推荐系统则结合了来自多个模态的信息,从而可以提供更准确和个性化的推荐。

优点
  • 提高推荐准确性:通过结合多种数据源,可以更全面地了解用户的偏好。
  • 丰富的用户体验:多模态数据可以为用户提供更多样化的推荐内容。
  • 处理冷启动问题:在用户数据不足的情况下,可以利用其他模态的数据进行推荐。

示例

假设我们有一个电商平台,用户在平台上浏览和购买商品。我们可以使用以下多模态数据来构建推荐系统:

  • 文本:商品的描述和用户的评论。
  • 图像:商品的图片。
  • 行为:用户的点击和购买记录。

对比学习

什么是对比学习?

对比学习是一种自监督学习的方法,通过学习样本之间的相似性和差异性来学习数据的有用表示。目标是使得相似的样本在表示空间中更接近,不相似的样本更远离。

关键思想
  • 正样本对 (Positive Pairs):具有相似特征的样本对。
  • 负样本对 (Negative Pairs):具有不同特征的样本对。
  • 损失函数:通过最小化正样本对之间的距离,最大化负样本对之间的距离来训练模型。
优点
  • 无需大量标注数据:对比学习可以在无监督环境中工作。
  • 提升特征表达能力:通过对比学习,模型可以学习到更有辨别力的特征。

自监督学习

什么是自监督学习?

自监督学习是一种无监督学习的方法,通过生成伪标签来进行训练。模型利用自身的数据生成训练信号,而不是依赖外部的标签数据。自监督学习的目标是通过设计预训练任务,使模型能够学习到数据的有用表示。

优点
  • 减少对标签数据的依赖:不需要大量的人工标注数据。
  • 学习到通用特征:通过预训练任务,模型可以学习到适用于多个下游任务的通用特征。

实现自监督学习的方法

常见的自监督学习方法包括:

  • 图像领域:通过图像旋转、遮挡、拼图等任务来生成伪标签。
  • 文本领域:通过词汇预测、句子排序等任务来生成伪标签。

论文问题提出

  • 除了用户-项目交互图之外,现有的最先进的方法通常使用辅助图(例如,用户-用户或项目-项目关系图),以增强所学习的用户和/或项目的表示。这些表示通常使用图卷积网络在辅助图上传播和聚合,这在计算和存储器方面可能非常昂贵,特别是对于大型图。
  • 现有的多模态推荐方法通常利用贝叶斯个性化排名(BPR)损失中随机抽样的否定示例来指导用户/项目表示的学习,这增加了大型图上的计算成本,并且还可能将噪声监督信号带入训练过程。

解决方案

  • 自监督学习的应用:

BM3 提出了一个新的自监督学习模型,不需要使用负样本或复杂的图增强技术。这简化了现有的自监督学习框架,减少了模型参数。

  • Dropout 增强机制:

通过 dropout 增强生成用户和项目的对比视图,而不是通过图或图像增强。这种设计减少了内存和计算成本。

  • 多模态对比损失函数:

设计了一个专门用于多模态推荐的对比损失函数,该函数在重建用户-项目交互图的同时对齐不同模态之间的特征,并减少来自同一模态的不同增强视图之间的差异。

框架图

在这里插入图片描述

该框架图展示了BM3模型的结构,包括几个关键部分。首先是"Backbone Network"(骨干网络),它接收用户和物品的ID嵌入,并生成初始嵌入表示 huh**u 和 hih**i。然后,这些嵌入与物品的视觉特征和文本特征通过投影网络 fvf**v 和 ftf**t 进行处理,生成图像和文本的嵌入表示 hvh**v 和 hth**t。接下来,“Contrastive View Generator”(对比视图生成器)通过增强技术生成这些嵌入的对比视图(例如 hu*h*u、 hi*h*i、 hv*h*v、 ht*h*t),并应用于三个损失函数。“Graph Reconstruction Loss” LrecLrec 通过对比用户和物品嵌入及其对比视图来增强嵌入表示的鲁棒性和泛化能力;“Inter-modality Feature Alignment Loss” LalignLalign 通过对比不同模态(例如图像和文本)的嵌入和对比视图,促进跨模态的一致性;“Intra-modality Feature Masked Loss” LmaskLmask 通过对比同一模态内部的嵌入和对比视图,进一步增强单模态的鲁棒性。最终,这些损失函数的加权和形成了整体的多模态对比损失 LL,优化模型以提升推荐系统的性能。

损失函数(每一步都是自监督对比)

图重构损失

在这里插入图片描述

Lrec=−(cos(h**u,h**i′)+cos(h**i,h**u′))

-huh**u是用户的嵌入表示。
-hih**i是项目的嵌入表示。
-hu′h**u′是用户的对比视图嵌入表示。
-hi′h**i′是项目的对比视图嵌入表示。

  • 假设用户uu对项目ii有正反馈,那么huh**u和hih**i应该有较高的相似度。
  • 通过对比学习,如果huh**u与hi′h**i′(项目的对比视图)也有较高的相似度,这表明模型对项目特征的变化(如视图变化、噪声)具有鲁棒性。
  • 新用户u′u′可能没有与很多项目交互过,但如果hu′h**u′(用户的对比视图)与某些项目的嵌入hih**i保持相似性,那么模型可以根据hu′h**u′推荐相关的项目ii
  • 类似地,新项目i′i′可能没有很多用户交互数据,但如果hi′h**i′(项目的对比视图)与某些用户的嵌入huh**u保持相似性,那么模型可以根据hi′h**i′推荐给相关的用户uu
  • 如果模型只学习huh**u和hih**i的相似性,可能会导致模型只记住某些用户-项目对,而无法泛化到其他用户-项目对。
  • 通过对称的损失,即huh**u和hi′h**i′以及hih**i和hu′h**u′的相似性,模型必须学习更广泛的特征,从而减少模式崩溃的风险。
  1. 增强鲁棒性:通过对比学习,模型需要在不同的增强视图之间保持一致性,这使得模型对噪声和变动具有更强的鲁棒性。用户的嵌入和项目的对比视图之间的一致性可以防止模型过拟合到特定的用户-项目对
  2. 促进泛化能力:通过对比用户和项目的对比视图嵌入,模型能够学习到更通用的特征表示。这使得模型在面对新的数据或未见过的用户-项目对时,仍然能够保持较好的性能
  3. 减少模式崩溃:在对比学习中,如果只关注正例对的相似性,可能会导致模式崩溃(模式崩溃指的是模型只记住了特定的模式而未能学习到通用的特征)。通过对称的对比视图嵌入损失,可以有效防止模式崩溃

模态间对齐损失

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相当于Item是标签,这些Text和Image是特征,相互学习的过程,把Text赋予标签信息,然后在Item里面增加更多的Text和Image的特征信息,同时由于Dropout可以保证学习的不崩溃

  1. 统一性和稳定性

    • 项目(item)的嵌入表示相对于用户(user)的嵌入表示更为稳定和统一。用户的行为和兴趣可能会随时间和情境发生变化,而项目的特征相对固定,因此使用项目嵌入可以提供更稳定的对齐基础。
  2. 多视图一致性

    • 多视图特征表示 $ h_m’ $ 是从不同模态(如文本、图像、音频等)中提取的。这些特征通常描述的是项目的不同方面,因此使用项目的嵌入来对齐多视图特征可以确保不同模态下的项目特征一致性。
  3. 提高泛化能力

    • 使用项目嵌入来对齐多视图特征可以帮助模型更好地捕捉项目的多模态特性,从而提高模型在处理多模态推荐任务时的泛化能力。这意味着模型可以更好地理解和推荐多种类型的项目,即使在用户行为发生变化时,模型仍然能够提供有效的推荐。

模态内特征遮蔽损失

在这里插入图片描述

生成对比视图:通过dropout生成图像和文本的对比视图嵌入 hv′h**v′ 和 ht′h**t′。

计算余弦相似度:计算图像嵌入 hvh**v 和其对比视图嵌入 hv′h**v′ 之间的余弦相似度,以及文本嵌入 hth**t 和其对比视图嵌入 ht′h**t′ 之间的余弦相似度:

在这里插入图片描述

计算单模态特征屏蔽损失:将上述两个余弦相似度的负值求和,得到最终的单模态特征屏蔽损失:

在这里插入图片描述

  • 假设图像 v 经过数据增强(如旋转、裁剪等)后生成对比视图 v’。通过使hv和 hv’ 具有高相似度,模型可以更好地应对图像中的噪声和变动,保证图像嵌入的一致性。
  • 如果模型能够在不同的图像视图(如不同的拍摄角度或光照条件)之间保持一致性,那么当遇到新的图像时(如不同场景或对象),模型也能够有效地提取相关特征。
  • 如果模型只学习原始图像的特征,可能会过拟合到特定的图像内容或风格。而通过对比原始图像和其增强视图,模型必须学习更通用的图像特征,从而减少模式崩溃的风险。
  • 增强单模态的鲁棒性

通过对比学习,模型需要在同一模态内的不同视图之间保持一致性,这使得模型在面对该模态的数据变动时具有更强的鲁棒性。

  • 促进模态内的泛化能力

通过对比单模态内的嵌入表示和对比视图,模型能够学习到更通用的特征表示。这使得模型在面对同一模态的新的数据时,仍然能够保持较好的性能。

  • 减少单模态的模式崩溃

在单模态的对比学习中,如果只关注单一视图的特征,可能会导致模式崩溃(即模型只记住了特定的模式而未能学习到通用的特征)。通过对比视图嵌入损失,可以有效防止模式崩溃。

实验分析

环境部署
git clone https://github.com/enoche/BM3.git

环境配置

pip install -r requirements.txt
conda install --file requirements.txt
数据集配置

通过这个地址–>dataset下载> baby`elec\sports`这三个数据集,然后将这些文件放入源码的data文件夹下。

代码运行

进入到src目录下

cd .\src

然后执行命令,-m 代表模型的名称 -d 代表数据集名称

python main.py -m BM3 -d baby
运行截图

数据集的相关统计数据

在这里插入图片描述

在这里插入图片描述

模型结构

训练的准确率结果

在这里插入图片描述

代码分析

提示:除Loss以及mian文件的分析外,在视频讲解中将会对模型进行一些简单的分析,以便帮助初学者理解模型的搭建,帮助读者进行自我创新。

Loss分析

这部分通过在不同模态不同视图之间进行Loss,可以实现论文中的Loss创新,并且框架中Dropout也在该部分,具体分析均在以下代码的注释当中

    def calculate_loss(self, interactions):
        # online network
        u_online_ori, i_online_ori = self.forward()
        t_feat_online, v_feat_online = None, None
        if self.t_feat is not None:
            t_feat_online = self.text_trs(self.text_embedding.weight)
        if self.v_feat is not None:
            v_feat_online = self.image_trs(self.image_embedding.weight)

        with torch.no_grad():  # 停止梯度更新,这样在下面的操作中不会计算梯度,节省内存和计算资源
            u_target, i_target = u_online_ori.clone(), i_online_ori.clone()  # 复制在线用户和物品的原始特征向量
            u_target.detach()  # 分离用户目标特征向量,使其不参与梯度计算
            i_target.detach()  # 分离物品目标特征向量,使其不参与梯度计算
            u_target = F.dropout(u_target, self.dropout)  # 对用户目标特征向量应用Dropout,生成用户对比试图
            i_target = F.dropout(i_target, self.dropout)  # 对物品目标特征向量应用Dropout,生成物品对比试图

            if self.t_feat is not None:  # 检查时间特征是否存在
                t_feat_target = t_feat_online.clone()  # 复制时间特征向量
                t_feat_target = F.dropout(t_feat_target, self.dropout)  # 对时间特征向量应用Dropout,生成image对比试图
            if self.v_feat is not None:  # 检查image特征是否存在
                v_feat_target = v_feat_online.clone()  # 复制image特征
                v_feat_target = F.dropout(v_feat_target, self.dropout)  # 对image特征向量Dropout,生成text对比试图

        # 预测用户和物品的在线特征向量
        u_online, i_online = self.predictor(u_online_ori), self.predictor(i_online_ori)

        # 获取交互数据中的用户和物品索引
        users, items = interactions[0], interactions[1]

        # 根据用户和物品索引提取相应的在线特征和目标特征
        u_online = u_online[users, :]  # 提取在线用户特征
        i_online = i_online[items, :]  # 提取在线物品特征
        u_target = u_target[users, :]  # 提取目标用户特征
        i_target = i_target[items, :]  # 提取目标物品特征

        # 初始化各类损失为0
        loss_t, loss_v, loss_tv, loss_vt = 0.0, 0.0, 0.0, 0.0

        if self.t_feat is not None:  # 检查时间特征是否存在
            t_feat_online = self.predictor(t_feat_online)  # 通过预测器更新在线时间特征
            t_feat_online = t_feat_online[items, :]  # 提取更新后的在线时间特征
            t_feat_target = t_feat_target[items, :]  # 提取目标时间特征
            # 计算时间特征和物品目标特征的余弦相似度损失
            loss_t = 1 - cosine_similarity(t_feat_online, i_target.detach(), dim=-1).mean()
            # 计算时间特征和目标时间特征的余弦相似度损失
            loss_tv = 1 - cosine_similarity(t_feat_online, t_feat_target.detach(), dim=-1).mean()

        if self.v_feat is not None:  # 检查视觉特征是否存在
            v_feat_online = self.predictor(v_feat_online)  # 通过预测器更新在线视觉特征
            v_feat_online = v_feat_online[items, :]  # 提取更新后的在线视觉特征
            v_feat_target = v_feat_target[items, :]  # 提取目标视觉特征
            # 计算视觉特征和物品目标特征的余弦相似度损失
            loss_v = 1 - cosine_similarity(v_feat_online, i_target.detach(), dim=-1).mean()
            # 计算视觉特征和目标视觉特征的余弦相似度损失
            loss_vt = 1 - cosine_similarity(v_feat_online, v_feat_target.detach(), dim=-1).mean()

        # 计算用户在线特征和物品目标特征的余弦相似度损失
        loss_ui = 1 - cosine_similarity(u_online, i_target.detach(), dim=-1).mean()
        # 计算物品在线特征和用户目标特征的余弦相似度损失
        loss_iu = 1 - cosine_similarity(i_online, u_target.detach(), dim=-1).mean()

        # 返回总损失,包括余弦相似度损失、正则化损失和对比损失
        return (loss_ui + loss_iu).mean() + self.reg_weight * self.reg_loss(u_online_ori, i_online_ori) + \
            self.cl_weight * (loss_t + loss_v + loss_tv + loss_vt).mean()
参数代码分析

具体分析请看注释

    # 创建ArgumentParser对象用于解析命令行参数
parser = argparse.ArgumentParser()
# 添加命令行参数 --model 或 -m,用于指定模型名称,默认值为 'BM3'
parser.add_argument('--model', '-m', type=str, default='BM3', help='name of models')
# 添加命令行参数 --dataset 或 -d,用于指定数据集名称,默认值为 'baby'
parser.add_argument('--dataset', '-d', type=str, default='baby', help='name of datasets')
# 定义包含GPU配置信息的字典
config_dict = {
    'gpu_id': 0,
}
# 解析命令行参数,将结果存储在 args 对象中
args, _ = parser.parse_known_args()
# 调用 quick_start 函数,传递模型名称、数据集名称、配置字典以及是否保存模型的标志
quick_start(model=args.model, dataset=args.dataset, config_dict=config_dict, save_model=True)

相关文件作用分析

BM3/
├── data/                           # 数据目录
│   ├── baby/                       # 婴儿数据目录
│   ├── clothing/                   # 服装数据目录
│   └── sports/                     # 运动数据目录
│
├── src/                            # 源代码目录
│   ├── common/                     # 公共模块目录
│   ├── configs/                    # 配置目录
│   ├── log/                        # 日志目录
│   ├── models/                     # 模型目录
│   │   └── bm3.py                  # BM3模型代码
│   └── utils/                      # 工具目录
│       └── main.py                 # 主程序代码
│
├── trained-models-logs/            # 训练模型日志目录
│
├── .gitignore                      # git忽略文件
├── LICENSE                         # 许可证文件
├── README.md                       # 项目说明文件
└── requirements.txt                # 项目依赖文件

代码算法复现结果

提示:由于领域特殊性,其他预测数据无法展示,只能对模型预测的相关准确率指标数据进行分享,请见谅,同时由于不同服务器以及相应python包版本存在差异,会存在复现结果不尽相同,这是正常现象。该结果在RTX 4090得到。

CategoryN@10N@20R@10R@20
Baby0.05590.08800.02960.0383
Sports0.06460.09780.03450.0435
Electronics0.04340.06430.02470.0301

创新思路方向

通过对现有数据集进行统计我们可以发现,现在大部分数据集都存在交互稀疏性的问题

在这里插入图片描述

这样的稀疏性将会严重影响模型的性能以及准确率,这是一个可以着重解决的问题

目前在用户与物品的交互信息存在大量的噪声,许多交互并不能表明用户对于该物品存在兴趣,并且由时序问题,对于在不同的时间段,同一个用户的兴趣点可能发生变化,在前的大量的交互可能对改变后的兴趣产生影响,可以引入Tempary进行学习

总结

BM3模型是一种创新的多模态推荐系统,它通过自监督学习框架,利用dropout增强机制和多模态对比损失函数,在不使用负样本或复杂图增强技术的情况下,有效地对齐不同模态的特征并减少内部视图的差异。该模型通过图重构损失、模态间对齐损失和模态内特征遮蔽损失,增强了模型的鲁棒性、泛化能力,并减少了模式崩溃的风险。实验结果表明,BM3在多个数据集上都取得了优异的性能。

通过对现有数据集的统计分析,我们发现交互稀疏性和噪声是推荐系统领域的主要挑战。读者可以针对这部分问题进行相应的解决创新

文章代码资源点击附件获取

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

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

相关文章

【只出现一次的数字 III】python刷题记录

R2-位运算专题. 目录 哈希表 位运算 ps: 一眼哈希表啊 哈希表 class Solution:def singleNumber(self, nums: List[int]) -> List[int]:dictdefaultdict(int)ret[]for num in nums:dict[num]1for key in dict.keys():if dict[key]1:ret.append(key)return ret怎么用位…

支持AI的好用的编辑器aieditor

一、工具概述 AiEditor 是一个面向 AI 的下一代富文本编辑器,她基于 Web Component,因此支持 Layui、Vue、React、Angular 等几乎任何前端框架。她适配了 PC Web 端和手机端,并提供了 亮色 和 暗色 两个主题。除此之外,她还提供了…

Hive3:库操作常用语句

1、创建库 create database if not exists myhive;2、选择库 use myhive;3、查看当前选择的库 SELECT current_database();4、查看库详细信息 desc database myhive;可以查看数据文件在hdfs集群中的存储位置 5、创建库时制定hdfs的存储位置 create database myhive2 …

机器学习课程学习周报六

机器学习课程学习周报六 文章目录 机器学习课程学习周报六摘要Abstract一、机器学习部分1.1 循环神经网络概述1.2 循环神经网络架构1.2.1 深层循环神经网络1.2.2 Elman网络和Jordan网络1.2.3 双向循环神经网络 1.3 长短期记忆网络1.4 LSTM原理1.5 RNN的学习方式1.6 RNN中的梯度…

基于站点的中国6小时PM2.5数据集(1960-2020)

基于站点的中国6小时PM2.5数据集(1960-2020) 数据介绍 几十年来,PM2.5改变了地球上的辐射平衡,增加了环境和健康风险,但直到2013年才在中国得到广泛监测。历史长期 PM2.5具有高时间分辨率的记录是必不可少的&#xff0…

段页式存储-系统架构师(三十七)

1、一个完整的系统需要从不同的角度进行描述,下图属于软件架构设计中的(),用于()视图来描述软件系统。 问题1 A对象图 B时序图 C构件图 D类图 问题2 A进程 B开发 C物理 D逻辑 解析: 从…

Golang | Leetcode Golang题解之第306题累加数

题目: 题解: func stringAdd(x, y string) string {res : []byte{}carry, cur : 0, 0for x ! "" || y ! "" || carry ! 0 {cur carryif x ! "" {cur int(x[len(x)-1] - 0)x x[:len(x)-1]}if y ! "" {cur i…

卷积神经网络的入门基本介绍 | 带你快速上手各种概念【附图解】

文章目录 1、简介2、核心概念3、关键操作4、常见架构5、训练过程6、重要概念图解⭐6.1、卷积神经网络工作⭐6.2、卷积核6.3、全连接与卷积网络的对比6.4、池化层6.5、感受野和卷积堆叠6.6、神经元计算和激活函数 7、卷积网络可以改进的地方8、结论 🍃作者介绍&#…

清爽简洁!这可能是开源界功能最强大的项目开发管理系统

💂 个人网站: IT知识小屋🤟 版权: 本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 写在前面项目简介项目特点设计思想技术栈项目展示项目获取 写在前…

(免费领源码)java+SpringBoot+mysql车辆故障报修系统26719-计算机毕业设计项目选题推荐

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,车辆维修行业当然也不例外。车辆故障报修系统是以实际运用为开发背景,运用软件工程原理和开发方法&#xff…

SpringBoot内置Tomcat启动原理

文章目录 概要整体架构流程技术细节 概要 Springboot 内嵌 tomcat是如何启动的 ? 整体架构流程 springboot启动 ---- autoconfiguration ---- tomcat springboot在启动后,通过context 确定是 org.springframework.boot.web.servlet.context.Annotatio…

微软蓝屏事件:全球网络安全与系统稳定性的警示

文章目录 每日一句正能量前言探讨软件更新流程中的风险管理和质量控制机制软件更新的风险风险管理策略质量控制措施测试流程缺陷识别实施质量控制结论 提供预防类似大规模故障的最佳方案或应急响应对策设计冗余系统实施灾难恢复计划建立高可用架构应急响应对策利用自动化工具和…

DRAM的可靠性受什么因素影响

挑战 随着IC尺寸的不断减小,它们变得更容易受到多种环境因素的损害,尤其是对于放置在高温或低温且空气中含有微粒的恶劣环境中的系统。在远程维护受限的室外偏远地区设置的系统特别容易受到攻击。 IC质量不均。晶圆内的IC可能不一定具有相同的质量。一个…

Coggle数据科学 | Kaggle赛题总结:AI数学奥赛挑战赛

本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。 原文链接:Kaggle赛题总结:AI数学奥赛挑战赛 赛题名称:AI Mathematical Olympiad - Progress Prize 1 赛题类型:大模型、…

Python开源项目月排行 2024年6月

#2024年6月2024年7月1日1wxPython一个基于C的跨平台GUI工具包wxWidgets的Python封装库。它提供了丰富的GUI组件,如按钮、文本框、菜单、对话框等,使得开发者能够轻松构建功能齐全且用户体验良好的桌面应用。wxPython的设计目标是尽可能地利用操作系统的原…

【中项】系统集成项目管理工程师-第8章 信息安全工程-8.2信息安全系统

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

OAK相机扩展NDVI功能检测植物健康情况

什么是NDVI? 首先,NDVI代表归一化差异植被指数。这听起来很花哨,但这实际上只是衡量植物健康的一种高级方法。NDVI摄像机使用可见光和近红外 (NIR) 光捕获图像。健康的植物反射更多的近红外光并吸收更多的可见光,而生病的植物反射…

spring源码 循环依赖

spring框架两大核心:IOC和AOP IOC(Inverse of Control)控制反转 将对象的创建权交给 Spring 容器去创建,利用了工厂模式将对象交给容器管理,只需要在spring配置文件中配置相应的bean,以及设置相关的属性,让spring容器…

社区养老服务小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,服务人员管理,服务产品管理,服务预约管理,服务状态管理,服务退订管理,活动管理,视频管理 微信端账号功能包…

单线程 和多线程区别,看打印输出1000个数字效果

执⾏过程: 加载func() -> 执⾏main -> 创建⼦线程t -> ⼦线程t启动 -> 执⾏func中的内容 |-> 继续执⾏main from threading import Thread #此线程不用安装自带。T是大写注意哟 def func():for i in range(1000):print(func,i) #定义一个函数打印 if __name__ …