探索前沿科技:从迁移学习看人工智能的无限可能性

从迁移学习看人工智能的无限可能性

    • 1 引言
      • 1.1 什么是迁移学习
        • 1.1.1 迁移学习的定义
        • 1.1.2 迁移学习的起源和背景
      • 1.2 迁移学习的重要性
        • 1.2.1 解决小数据集问题
        • 1.2.2 提高模型训练效率
        • 1.2.3 应用于不同领域的广泛性
      • 1.3 迁移学习的前景
    • 2 迁移学习的基本概念
      • 2.1 源域和目标域
        • 2.1.1 定义与区别
        • 2.1.2 示例说明
      • 2.2 特征迁移与参数迁移
        • 2.2.1 特征迁移的概念与应用
        • 2.2.2 参数迁移的概念与应用
      • 2.3 迁移学习的类型
        • 2.3.1 有监督迁移学习
        • 2.3.2 无监督迁移学习
        • 2.3.3 半监督迁移学习
        • 2.3.4 强化迁移学习
    • 3. 迁移学习的常见方法
      • 3.1 微调预训练模型
        • 预训练模型的选择
        • 微调的过程与技巧
      • 3.2 特征提取
        • 使用预训练模型提取特征
        • 如何结合新模型进行训练
      • 3.3 多任务学习
        • 多任务学习的概念
        • 如何在迁移学习中应用多任务学习
      • 3.4 对抗训练
        • 对抗训练的基本原理
        • 在迁移学习中的应用
    • 4. 迁移学习的应用案例
      • 4.1 计算机视觉
      • 4.2 自然语言处理
      • 4.3 医疗健康
      • 4.4 自动驾驶
    • 5. 迁移学习的挑战与未来发展
      • 5.1 迁移学习的挑战
      • 5.2 迁移学习的发展方向

1 引言

1.1 什么是迁移学习

1.1.1 迁移学习的定义

迁移学习(Transfer Learning)是一种机器学习方法,旨在利用已训练好的模型或知识来解决新的但相关的问题。传统的机器学习和深度学习方法通常依赖于大量标注数据和长时间的训练过程,而迁移学习通过将已有模型在相关任务中的知识迁移到新任务中,可以在较少数据和较少计算资源的情况下实现高效的模型训练。

简单来说,迁移学习可以分为两种主要方式:特征迁移(Feature Transfer)和参数迁移(Parameter Transfer)。特征迁移通过提取已训练模型的特征用于新任务,而参数迁移则直接微调预训练模型的参数以适应新任务。
在这里插入图片描述

1.1.2 迁移学习的起源和背景

迁移学习的概念源自人类学习的启发。在人类认知过程中,我们常常会将已有的知识和经验应用于新的领域。例如,一个已经学会骑自行车的人,在学习骑摩托车时会相对容易,因为两者的平衡和控制技巧有相似之处。同样地,迁移学习在人工智能领域也试图利用这一特性。

早期的迁移学习研究可以追溯到1990年代,但真正的发展和广泛应用是在深度学习兴起之后。随着计算能力的提升和大规模数据集的出现,深度神经网络在图像、语音和自然语言处理等领域表现出色。然而,训练这些深度模型通常需要大量的标注数据和计算资源,这在实际应用中往往是不可行的。迁移学习通过利用预训练模型,大大减少了训练所需的数据量和计算时间,从而成为解决这些问题的重要手段。

1.2 迁移学习的重要性

1.2.1 解决小数据集问题

在很多实际应用中,获取大规模标注数据集既昂贵又耗时。例如,在医疗领域,收集和标注医学影像数据需要专业人员的参与,而在自动驾驶领域,标注大量驾驶场景数据也是一项巨大的工程。迁移学习通过利用在大数据集上预训练的模型,可以在小数据集上实现较好的性能,显著降低了数据需求。

1.2.2 提高模型训练效率

传统的深度学习模型训练通常需要大量的计算资源和长时间的训练过程。而迁移学习可以通过微调预训练模型的方式,快速适应新的任务。这不仅缩短了训练时间,还降低了对高性能计算资源的需求。在实际应用中,这意味着更快的模型部署和更新,从而能够更及时地响应业务需求和变化。

1.2.3 应用于不同领域的广泛性

迁移学习的应用范围非常广泛,涵盖了计算机视觉、自然语言处理、语音识别、医疗健康、金融分析、自动驾驶等多个领域。例如,在计算机视觉中,迁移学习可以用于图像分类、物体检测和图像分割;在自然语言处理中,可以用于文本分类、情感分析和机器翻译;在医疗健康中,可以用于疾病诊断和医学影像分析。

通过迁移学习,不同领域的研究人员和工程师可以共享和利用已有的模型和知识,快速构建和优化自己的模型。这不仅推动了人工智能技术的普及和应用,也促进了跨领域的创新和合作。

1.3 迁移学习的前景

迁移学习在人工智能领域展现出巨大的潜力和前景。随着研究的深入,新的迁移学习方法和技术不断涌现,进一步提升了模型的性能和应用效果。同时,迁移学习也面临一些挑战,如如何有效地避免负迁移(Negative Transfer),即源任务的知识对目标任务产生负面影响;如何处理源域和目标域数据分布的差异等。

尽管如此,迁移学习作为一种高效的模型训练方法,已经在实际应用中展现出巨大的优势。未来,随着计算能力的提升和数据资源的丰富,迁移学习必将进一步推动人工智能技术的发展,带来更多创新和突破。

2 迁移学习的基本概念

2.1 源域和目标域

2.1.1 定义与区别

在迁移学习中,我们通常会涉及到两个重要概念:源域(Source Domain)和目标域(Target Domain)。它们分别代表着两个不同的数据分布或任务。

源域(Source Domain) 是指已经训练好的模型或数据集的来源。这里的模型或数据集已经通过大量数据进行了训练和优化,具有一定的泛化能力和表征能力。例如,我们在大规模图像数据集上训练好的卷积神经网络模型可以作为一个源域。

目标域(Target Domain) 则是我们希望将源域的知识应用到的新的数据集或任务。目标域通常情况下和源域有一定的差异,可能是不同的数据分布或不同的任务要求。

在实际应用中,源域和目标域的差异性是迁移学习面临的一个重要挑战,因为这种差异性可能导致负迁移(Negative Transfer),即源域的知识对目标域的性能产生负面影响。因此,理解和处理源域和目标域之间的关系是迁移学习研究的核心之一。

2.1.2 示例说明

下面通过一个简单的示例来说明源域和目标域的概念。

假设我们有两个任务:一个是在自然环境中识别动物的任务(源域),另一个是在动物园中识别动物的任务(目标域)。虽然两个任务都涉及动物识别,但它们的数据分布和环境可能有所不同:源域可能包含大量的野外动物图像,而目标域可能以动物园中的照片为主。在这种情况下,我们可以尝试通过迁移学习,利用在源域学到的动物识别能力,来帮助提升在目标域的识别表现。

2.2 特征迁移与参数迁移

2.2.1 特征迁移的概念与应用

特征迁移(Feature Transfer)是迁移学习中常见的一种方式,其核心思想是利用源域的特征来帮助目标域的学习任务。具体来说,特征迁移通过从已经训练好的模型中提取特征,然后将这些特征应用于新的目标域任务中。

特征迁移的步骤包括以下几个关键点:

  • 特征提取:从源域模型中提取出高层次的抽象特征,这些特征通常能够较好地捕捉数据的表征。

  • 特征映射:将提取出的特征映射到目标域上,通常通过某种映射函数或者神经网络来完成。这个过程可以是线性的,也可以是非线性的,取决于源域和目标域数据的复杂性。

  • 模型微调:在映射后的特征上训练一个新的模型,通常是一个较浅层的模型,以适应目标域的具体任务。微调过程可以进一步优化模型在目标域上的表现。

特征迁移的优势在于它能够有效地利用源域的大量数据和模型经验,从而加快在目标域上的学习速度,提高模型的泛化能力。

# 示例代码:特征提取与映射示例import torch
import torchvision.models as models# 加载预训练的模型
resnet = models.resnet18(pretrained=True)# 假设有一个源域数据集的示例输入
input_data_source = torch.randn(1, 3, 224, 224)# 提取特征
features_source = resnet(input_data_source)# 在目标域中,利用特征映射来应用特征迁移
# 假设有一个目标域数据集的示例输入
input_data_target = torch.randn(1, 3, 224, 224)# 提取特征
features_target = resnet(input_data_target)# 这里省略特征映射的具体实现步骤
2.2.2 参数迁移的概念与应用

参数迁移(Parameter Transfer)是另一种常见的迁移学习方法,其核心思想是将源域模型的参数直接应用于目标域任务中。参数迁移通常用于目标域数据不足但与源域高度相关的情况。

参数迁移的主要步骤包括以下几点:

  • 复制参数:将源域模型的参数复制到目标域的相应模型中。这些参数通常是在源域数据上通过大量训练学习到的。

  • 微调参数:在目标域数据上微调这些参数,以适应具体的目标任务。微调过程通常需要小规模的目标域数据集,以便调整源域模型的参数以适应目标域的特定特征和分布。

参数迁移的优势在于它能够直接利用源域模型的参数和经验,从而快速实现在目标域上的模型构建和优化。

2.3 迁移学习的类型

2.3.1 有监督迁移学习

有监督迁移学习(Supervised Transfer Learning)是指在源域和目标域都有标注数据的情况下进行迁移学习。在这种情况下,我们可以直接利用标注数据来优化模型的表现,以适应目标域的特定任务。

2.3.2 无监督迁移学习

无监督迁移学习(Unsupervised Transfer Learning)是指在目标域没有标注数据的情况下进行迁移学习。这种情况下,我们通常会利用源域数据和无标注的目标域数据来进行模型优化和学习。无监督迁移学习在实际应用中具有重要意义,特别是在数据标注成本较高或难以获取标注数据的情况下。

2.3.3 半监督迁移学习

半监督迁移学习(Semi-Supervised Transfer Learning)结合了有监督和无监督迁移学习的特点,旨在利用有限的标注数据和大量的无标注数据来进行模型优化。半监督迁移学习方法在实践中可以更好地平衡数据的利用效率和模型的学习能力。

2.3.4 强化迁移学习

强化迁移学习(Reinforcement Transfer Learning)是指在强化学习领域学习经验和知识的迁移应用。在强化迁移学习中,我们通常会考虑如何在不同的强化学习任务之间共享经验和策略,以提高模型在新任务上的表现。

强化迁移学习的主要步骤包括以下几点:

  • 策略迁移:将源域任务中学习到的策略迁移到目标域任务中,以加速新任务的学习过程。

  • 价值迁移:利用源域任务中学习到的状态值函数或动作值函数来指导目标域任务中的决策和学习过程。

强化迁移学习通常应用于需要在不同环境或任务中实现长期积累经验的场景,如机器人学习、游戏玩法优化等领域。

在实际应用中,根据具体的问题和数据情况选择合适的迁移学习类型和方法,可以有效地提升模型的学习效率和泛化能力,从而适应不同领域和任务的需求。

3. 迁移学习的常见方法

3.1 微调预训练模型

在迁移学习中,微调预训练模型是一种常见且有效的方法。预训练模型如BERT(自然语言处理)和ResNet(计算机视觉)通过大规模数据集预训练,在新任务中可以通过微调来提高性能。

预训练模型的选择

选择适合目标任务的预训练模型至关重要。例如,如果任务涉及自然语言处理,BERT、GPT等预训练语言模型可能是理想选择;而对于图像识别任务,ResNet、VGG等视觉模型则是常见的预训练选择。

微调的过程与技巧

微调过程通常包括以下步骤:

  1. 加载预训练模型:从已训练好的模型中加载权重和结构。

  2. 替换顶层结构:根据新任务的输出要求,替换原模型的顶层结构(如全连接层)。

  3. 冻结部分层次:有时可以选择冻结预训练模型的低层或中间层,只微调顶层或特定层以避免过拟合,并加快训练速度。

  4. 调整学习率:通常将预训练模型的学习率设定为较低,以保留其大部分知识;而新添加的层则可以使用更高的学习率进行训练。

# 示例代码:微调BERT模型用于文本分类任务from transformers import BertForSequenceClassification, BertTokenizer
import torch# 加载预训练的BERT模型和tokenizer
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)# 准备训练数据
train_texts = ["example sentence 1", "example sentence 2"]
train_labels = torch.tensor([1, 0])  # 二分类任务的标签# 编码文本并进行微调
inputs = tokenizer(train_texts, padding=True, truncation=True, return_tensors="pt")
labels = torch.tensor(train_labels).unsqueeze(0)
outputs = model(**inputs, labels=labels)
loss = outputs.loss
loss.backward()

3.2 特征提取

另一种常见的迁移学习方法是特征提取,这种方法利用预训练模型提取的特征来训练新的模型。

使用预训练模型提取特征

预训练模型在大规模数据集上训练后,其底层卷积层或编码器可以提取具有一定语义信息的特征。这些特征可以用作新任务的输入,无需重新训练整个模型。

如何结合新模型进行训练

在特征提取中,可以将预训练模型的特征提取器作为新模型的一部分,通常顶层结构会根据新任务需求进行重新设计和训练。

# 示例代码:使用预训练的ResNet模型提取图像特征import torchvision.models as models
import torch# 加载预训练的ResNet模型
resnet = models.resnet18(pretrained=True)
# 获取卷积层之前的特征提取部分
features_extractor = torch.nn.Sequential(*list(resnet.children())[:-1])# 示例输入图像
input_image = torch.rand(1, 3, 224, 224)  # 假设输入图像大小为224x224# 提取特征
features = features_extractor(input_image)

3.3 多任务学习

多任务学习是一种同时学习多个相关任务的方法,通过共享底层特征来提高模型的泛化能力和效率。

多任务学习的概念

多任务学习将多个相关任务组合在一起训练,模型在学习过程中可以通过共享的特征表示来提升性能。

如何在迁移学习中应用多任务学习

在迁移学习中,可以通过预训练的模型来初始化多任务学习的底层特征提取器,然后根据新任务的需求来训练顶层任务特定的层次。

3.4 对抗训练

对抗训练通过引入对抗性扰动来增强模型的鲁棒性和泛化能力,在迁移学习中也有广泛的应用。

对抗训练的基本原理

对抗训练基于生成对抗网络(GAN)的思想,通过在训练过程中引入对抗性样本或扰动,使得模型在面对干扰时能够保持稳定的输出。

在迁移学习中的应用

在迁移学习中,对抗训练可以帮助模型更好地适应新领域的数据分布变化,提升模型的泛化能力和抗干扰能力。

# 示例代码:对抗训练的应用示例import torch
import torch.nn as nn
import torch.optim as optim# 定义对抗训练的损失函数
criterion = nn.CrossEntropyLoss()
# 定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)# 对抗训练过程
for epoch in range(num_epochs):for inputs, labels in train_loader:# 生成对抗性样本adversarial_inputs = generate_adversarial_examples(inputs, labels, model)# 前向传播outputs = model(adversarial_inputs)loss = criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()

以上是关于迁移学习常见方法的详细展开和示例说明。这些方法不仅在学术研究中被广泛应用,也在实际的人工智能项目中取得了显著效果。希望这些内容能够为您提供深入理解和实践迁移学习的参考。

4. 迁移学习的应用案例

4.1 计算机视觉

在计算机视觉领域,迁移学习被广泛应用于多个任务,包括图像分类、物体检测和图像分割等。

  1. 图像分类

    迁移学习通过利用预训练的深度神经网络模型(如ResNet、VGG等),可以显著提高新任务的分类准确性和收敛速度。通过冻结底层特征提取器的权重并微调顶层分类器,可以在少量标注数据的情况下,实现对新类别的高效分类。

    # 示例代码
    import tensorflow as tf
    from tensorflow.keras.applications import ResNet50base_model = ResNet50(weights='imagenet', include_top=False)
    # 冻结除了顶层以外的所有层
    for layer in base_model.layers:layer.trainable = False# 添加顶层分类器进行微调
    model = tf.keras.Sequential([base_model,tf.keras.layers.GlobalAveragePooling2D(),tf.keras.layers.Dense(10, activation='softmax')
    ])
    
  2. 物体检测

    在物体检测任务中,迁移学习可以利用预训练的对象检测模型(如Faster R-CNN、YOLO),通过微调网络结构和调整输入层,快速适应新的检测类别或场景。

    # 示例代码
    from torchvision import models
    import torchvision.transforms as transformsmodel = models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
    # 替换和/或微调最后一个分类器层
    
  3. 图像分割

    图像分割任务中,迁移学习可以利用已有数据集的分割模型(如Mask R-CNN、U-Net),通过微调网络结构和调整损失函数,实现对新数据集的语义分割。

    # 示例代码
    from segmentation_models import Unet
    import segmentation_models as smmodel = Unet('resnet34', input_shape=(None, None, 3), encoder_weights='imagenet')
    # 在新数据集上微调模型
    

4.2 自然语言处理

在自然语言处理领域,迁移学习通过在大规模语料上预训练的模型,如BERT和GPT,为各种下游任务提供了强大的基础。

  1. 语言模型微调

    通过在特定领域或任务相关的数据上进一步微调预训练的语言模型,可以显著提高模型在特定任务上的表现,如文本生成、问答系统等。

    # 示例代码
    from transformers import BertForSequenceClassification, BertTokenizertokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
    model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
    
  2. 文本分类

    迁移学习在文本分类任务中表现突出,通过在大型语料库上预训练的模型,如BERT,可以在少量标记数据的情况下,实现对新类别的高效分类。

    # 示例代码
    from transformers import BertForSequenceClassification, Trainer, TrainingArgumentsmodel = BertForSequenceClassification.from_pretrained('bert-base-uncased')
    
  3. 情感分析

    在情感分析任务中,利用预训练的语言模型(如BERT),可以有效地捕获文本中的情感信息,快速推广到新的情感分析任务中。

    # 示例代码
    from transformers import BertForSequenceClassification, Trainer, TrainingArgumentsmodel = BertForSequenceClassification.from_pretrained('bert-base-uncased')
    

4.3 医疗健康

在医疗健康领域,迁移学习对于处理医学数据和改进诊断过程具有重要意义。

  1. 疾病诊断

    通过在医学图像和病历数据上预训练的深度学习模型,如卷积神经网络(CNN),可以实现对各种疾病的自动诊断和分类。

    # 示例代码
    import tensorflow as tf
    from tensorflow.keras.applications import DenseNet121base_model = DenseNet121(weights='imagenet', include_top=False)
    # 冻结底层并添加新的分类层进行微调
    
  2. 医学影像分析

    在医学影像分析中,迁移学习可以利用预训练的模型,如UNet,实现对医学图像的精准分割和特征提取。

    # 示例代码
    from segmentation_models import Unet
    import segmentation_models as smmodel = Unet('resnet34', input_shape=(None, None, 3), encoder_weights='imagenet')
    
  3. 基因数据分析

    在基因组学中,迁移学习可以帮助挖掘复杂的基因数据模式,通过预训练的模型加速基因变异和表达分析的过程。

    # 示例代码
    from sklearn.preprocessing import StandardScaler
    from sklearn.decomposition import PCAscaler = StandardScaler()
    pca = PCA(n_components=2)
    

4.4 自动驾驶

在自动驾驶技术中,迁移学习被用于提高车辆的感知和决策能力,以及应对不同驾驶场景的适应性。

  1. 场景理解

    通过在城市和高速公路等不同场景上进行预训练,自动驾驶系统可以更好地理解和响应复杂的驾驶环境。

    # 示例代码
    from tensorflow.keras.applications import ResNet50base_model = ResNet50(weights='imagenet', include_top=False)
    # 冻结底层并添加新的分类层进行微调
    
  2. 路径规划

    基于迁移学习的路径规划模型,可以根据实时交通和道路条件,快速生成安全和高效的驾驶路径。

    # 示例代码
    from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier(n_neighbors=3)
    
  3. 行为预测

    通过在驾驶记录和行为数据上预训练,可以实现对驾驶员行为的预测,帮助提高交通安全和驾驶体验。

    # 示例代码
    from sklearn.tree import DecisionTreeClassifierdt = DecisionTreeClassifier(max_depth=5)
    

以上是迁移学习在不同领域的应用案例,展示了其在提高模型效果、节省训练时间和数据资源利用率方面的潜力和优势。迁移学习的灵活性和可适应性使其成为现代人工智能解决方案中的重要组成部分。

5. 迁移学习的挑战与未来发展

5.1 迁移学习的挑战

迁移学习作为人工智能领域的重要分支,在实际应用中面临着多重挑战,这些挑战不仅限于理论层面,还涉及到算法实现和应用场景的适配。

  1. 负迁移的风险

    负迁移是指在源领域和目标领域之间的知识传递反而导致性能下降的情况。这种现象通常由于源领域和目标领域之间的差异较大,或者数据分布发生变化而引起。解决负迁移的关键在于有效地识别和处理源领域与目标领域之间的差异,避免不适当的知识传递。

  2. 数据分布差异的影响

    迁移学习的核心问题之一是如何处理不同数据分布下的学习问题。当源领域和目标领域的数据分布不匹配时,传统的机器学习方法可能失效。因此,需要研究和设计能够有效适应数据分布变化的迁移学习算法,以提高模型的泛化能力和适应性。

  3. 计算资源的需求

    迁移学习中许多先进的算法通常需要大量的计算资源来支持模型训练和优化过程。特别是在大规模数据集和复杂模型的情况下,计算资源的需求可能成为限制迁移学习应用范围的重要因素。因此,如何在保证算法效果的前提下优化计算资源的利用,是迁移学习研究的另一个重要方向。

5.2 迁移学习的发展方向

面对迁移学习的挑战,研究者们正在探索多种新的方法和技术,以推动迁移学习的发展,并在实际应用中取得更好的效果和可靠性。

  1. 更高效的迁移学习算法

    未来的研究重点之一是设计和开发更高效的迁移学习算法。这些算法应该能够有效地处理数据分布差异、减少负迁移风险,并在不同应用场景中展现出更好的性能和稳定性。

  2. 自适应迁移学习

    自适应迁移学习是一种新兴的研究方向,其核心思想是模型能够自动地感知和适应目标领域的特征和数据分布变化。这种方法可以大大减少人工干预的需求,提高系统的自动化程度和实时性。

  3. 迁移学习与其他技术的融合

    未来的发展趋势之一是将迁移学习与其他前沿技术进行有机融合,例如深度学习、强化学习、多任务学习等。通过不同技术的结合,可以进一步提升迁移学习的效率和适应性,拓展其在复杂场景中的应用潜力。

在实际应用中,这些发展方向不仅能够帮助解决当前迁移学习面临的挑战,还能够推动其在各个领域的广泛应用,为人工智能技术的发展开辟新的可能性和前景。

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

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

相关文章

【区块链 + 智慧政务】涉税行政事业性收费“e 链通”项目 | FISCO BCOS应用案例

国内很多城市目前划转至税务部门征收的非税收入项目已达 17 项,其征管方式为行政主管部门核定后交由税务 部门征收。涉税行政事业性收费受限于传统的管理模式,缴费人、业务主管部门、税务部门、财政部门四方处于 相对孤立的状态,信息的传递靠…

无人机之机架类型篇

碳纤维机架 具有低密度、高强度和高刚度的特点,非常适合商业或工业级无人机的设计。碳纤维机架在飞行过程中具有良好的减振效果,使飞行更加稳定,但制作工艺复杂,成本较高。 工程塑料机架 以其轻便、耐冲击和易加工等特点受到一…

【C语言】深入解析选择排序

文章目录 什么是选择排序?选择排序的基本实现代码解释选择排序的优化选择排序的性能分析选择排序的实际应用结论 在C语言编程中,选择排序是一种简单且直观的排序算法。尽管它在处理大型数据集时效率不高,但由于其实现简单,常常用于…

牛客TOP101:反转链表

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 简单粗暴的写法,就是从头到尾挨个将所有结点的指向翻转即可。需要注意的是,翻转之后会失去原有指向的结点,所以需要提前保存。   具体做法就是,使用cur标记…

硬件检测工具 | CPU-Z v2.10.0 官方中文绿色版

软件简介 CPU-Z是一款广受欢迎的硬件检测工具,主要用于收集电脑处理器的详细信息。这款软件能够提供关于CPU的详细数据,包括处理器名称、编号、代号、进程和缓存等信息。此外,CPU-Z还能实时监测每个内核的内部频率和内存频率,以及…

如何在项目中打印sql和执行的时间

目标:打印DAO方法中sql和执行的时间 一种方式是去实现Mybatis的拦截器Interceptor ,比较麻烦; 这里介绍一种比较简单的实现方式; 1、如何打印sql? 配置文件加这个可以打印出com.zhenhui.ids.busi.watch包下执行的sq…

c++包管理器

conan conan search,查看网络库 conan profile detect,生成缓存信息conan new cmake_exe/cmake_lib,创建cmakelists.txtconan install .,执行Conanfile.txt中的配置,生成相关的bat文件 项目中配置Conanfile.txt(或者…

tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…

零基础STM32单片机编程入门(十四) DS18B20温度传感器模块实战含源码

文章目录 一.概要二.DS18B20主要性能参数三.DS18B20温度传感器内部框图四.DS18B20模块原理图五.DS18B20模块跟单片机板子接线和通讯时序1.单片机跟DS18B20连接示意图2.单片机跟DS18B20通讯流程与时序3.通讯流程中的9个数据字节内容格式4.温度数据寄存器LSB/MSB格式 六.STM32单片…

【HarmonyOS】鸿蒙中如何获取用户相册图片?photoAccessHelper.PhotoViewPicker

【HarmonyOS】鸿蒙中如何获取用户相册图片?photoAccessHelper.PhotoViewPicker 前言 有同学私聊我说,之前的博客文章提到的没有HarmonyOS白名单帐号,如何在OpenHarmony Gitee开发仓里学习API接口。需要注意一个点,默认看到的文档…

图、图的遍历、最小生成树、最短路径

0、图的概念 **图:**是由顶点集合及顶点间的关系组成的一种数据结构:G (V, E),其中: 顶点集合V {x|x属于某个数据对象集}是有穷非空集合;边的集合E {(x,y)|x,y属于V}或者E {|x,y属于V && Path(x, y)}是顶…

浅学三次握手

数据要完成传输,必须要建立连接。由于建立TCP连接的过程需要来回3次,所以,将这个过程形象的叫做三次握手。 结合上面的图来看更清楚。 先说三次握手吧,连接是后续数据传输的基础。就像我们打电话一样,必须保证我和对方…

在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位一、数据实时监控的重要性二、PostgreSQ…

shell,重定向与管道符号

文章目录 一,什么是shell二,shell脚本和作用1. shell脚本2. 作用 三,shell脚本的构成内容四,创建和运行Shell脚本五,重定向与管道操作1. 交互式硬件设备2. 重定向操作概览表3. 管道操作 一,什么是shell sh…

Matlab 判断直线上一点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 判断一个点是否位于一直线上有很多方法,这里使用一种很有趣的坐标:Plucker线坐标,它的定义如下所示: 这个坐标有个很有趣的性质,我们可以使用Plucker坐标矢量构建一个Plucker矩阵: 则它与位于对应线上的齐次点…

排序(三)——归并排序(MergeSort)

欢迎来到繁星的CSDN,本期内容主要包括归并排序(MergeSort)的实现 一、归并排序的主要思路 归并排序和上一期讲的快速排序很像,都利用了分治的思想,将一整个数组拆成一个个小数组,排序完毕后进行再排序,直到整个数组排序…

文章管理小程序的设计

管理员账户功能包括:系统首页,个人中心,作者管理,文章管理,文章分类管理,论坛,系统管理 微信端账号功能包括:系统首页,文章,论坛,我的 开发系统…

代码随想录算法训练营第五十四天|99.岛屿数量 深搜、广搜、100.岛屿的最大面积

99.岛屿数量 题目链接:99.岛屿数量 文档讲解:代码随想录 状态:不会 深搜 思路: 遍历网格,发现岛屿:我们需要遍历整个二维网格,检查每一个位置上的元素。如果在遍历过程中遇到陆地(…

计网(1.1~1.4)

1.1计算机网络在信息时代的作用 21世纪的重要特征数字化、网络化和信息化 有三类网络:电信网络、有线电视网络和计算机网络 互联网两个重要基本特点,即连通性和共享 1.2因特网概述 (1)网络、互联网和互连网 网络:由若干结点和连接…

企业全历史行为数据 让你对竞争对手的一切清清楚楚

关于商业竞争,在刚进入信息时代的那些年,人们说“现代商战就是信息战”,强调用非对称的或者更快获得的信息来赢得竞争;近些年进入大数据时代,人们又说“得数据者得天下”,发现“数据算法”有很多妙用&#…