第一周学习--联邦学习

news2024/12/23 17:39:31
OUC读研--第一周

目录

1、课程学习

2、fedavg的算法实现

关于代码详解

1、client

__init__ 方法

local_train 方法

2、server

3、get_dataset

函数定义

数据集加载

MNIST 数据集

CIFAR-10 数据集

返回值

使用示例

4、 main

代码解释

可能的改进点

5、models

3、搭建federal learning 的框架(已完成)

4、学习pytorch(学习ing)

5、阅读文献

1、课程学习

  • 1.王树森从技术的角度讲解Introduction to Federated Learning 

https://www.youtube.com/watch?v=STxtRucv_zo

  • 2.李沐 

00 预告【动手学深度学习v2】_哔哩哔哩_bilibili

2、fedavg的算法实现

关于代码详解

1、client

当然,以下是一篇关于上述代码的汇报,主要介绍了代码的功能、结构以及关键部分的解释。


代码汇报:Client类解析

一、引言

本报告旨在详细解析Client类,该类是联邦学习或分布式学习框架中的一个重要组件。它负责处理单个客户端的本地模型训练、数据划分及配置管理。代码通过Python实现,并依赖于PyTorch框架进行模型操作。

二、代码结构概述

Client类通过定义一个初始化方法__init__和潜在的其他方法(未在提供的代码段中显示)来实现其功能。__init__方法接收多个参数,包括配置(conf)、模型(model)、训练数据集(train_dataset)以及客户端ID(id,默认为-1)。

三、关键部分解析

  1. 初始化方法 __init__

    • 参数接收:接收四个参数,分别是配置信息(conf)、模型(model)、训练数据集(train_dataset)和客户端ID(id)。
    • 模型初始化:通过调用models.get_model(self.conf["model_name"])获取指定名称的模型实例,并将其赋值给self.local_model。这表明models模块需要包含一个能够根据名称获取对应模型的函数。
    • 客户端ID设置:将传入的客户端ID赋值给self.client_id
    • 训练数据集划分:根据配置中指定的模型数量(no_models),将训练数据集均匀划分为多个部分,每个客户端负责一部分数据的训练。划分逻辑是通过计算每个客户端应拥有的数据索引范围来实现的。
    • 训练数据加载器:基于划分的索引范围,构建了一个训练数据加载器(self.train_loader)。虽然代码段未直接展示如何创建加载器,但可以推测它使用了PyTorch的DataLoader类,并可能结合了自定义的Dataset类。
  2. 数据划分逻辑

    • 使用all_range = list(range(len(self.train_dataset)))获取一个包含所有训练数据索引的列表。
    • 根据客户端ID和每个客户端应处理的数据量(data_len),计算出当前客户端应处理的数据索引范围train_indices

四、潜在改进与建议

  • 异常处理:在代码中没有看到异常处理机制,例如当conf中缺少model_nameno_models等关键配置项时,应添加相应的异常处理逻辑,以提高代码的健壮性。
  • 数据加载器实现:虽然代码片段未展示train_loader的具体实现,但建议在使用DataLoader时考虑批处理大小、打乱数据等参数,以优化训练效果。
  • 模型参数共享:在联邦学习场景中,Client类可能还需要实现与服务器进行模型参数同步的逻辑。这通常涉及到模型参数的序列化、发送和接收等操作。

五、结论

Client类是分布式学习或联邦学习框架中的关键组件,负责在单个客户端上执行模型的本地训练。通过初始化模型、划分训练数据集和构建训练数据加载器,Client类为模型的分布式训练提供了基础。未来可以进一步优化数据划分逻辑、加强异常处理,并实现模型参数的同步机制。


请注意,由于提供的代码片段是Client类的一部分,且没有展示类的完整实现(如训练方法、模型参数同步等),因此上述报告主要基于__init__方法及其相关逻辑进行解析和建议。

这段代码定义了一个名为Client的类,该类模拟了联邦学习中的一个客户端。在联邦学习中,多个客户端(通常是不同的设备或数据源)在本地训练模型,然后将模型更新(而非原始数据)发送到服务器进行聚合,以保护数据的隐私。下面是对每段代码的具体解释:

__init__ 方法

  • __init__(self, conf, model, train_dataset, id = -1): 这是Client类的构造函数,用于初始化客户端实例。
    • conf: 一个配置字典,包含了模型名称、学习率、动量、本地训练轮次、批次大小、模型总数等配置信息。
    • model: 这里传入的是全局模型的引用,但在这个构造函数中实际上并未直接使用它,因为每个客户端都会基于配置中的模型名称创建一个新的本地模型。
    • train_dataset: 训练数据集,客户端将从中划分出属于自己的部分数据进行训练。
    • id: 客户端的ID,用于划分数据集。如果未指定,默认为-1(但在实际使用中,应该为每个客户端分配一个唯一的ID)。
  • 在构造函数内部,首先根据配置中的模型名称创建了一个本地模型self.local_model
  • 然后,根据客户端ID和总模型数self.conf['no_models'],从整个训练数据集中划分出属于当前客户端的数据子集,并使用这些数据子集创建一个数据加载器self.train_loader

local_train 方法

  • local_train(self, model): 这个方法用于在客户端上执行本地训练。注意,虽然方法名中有model参数,但这个方法实际上并不直接使用传入的model参数来训练,而是使用self.local_model进行训练。model参数用于在训练结束后计算本地模型与全局模型之间的差异。

  • 首先,将全局模型的参数复制到本地模型中,以便在本地数据集上进行训练。

  • 创建一个优化器optimizer,用于优化本地模型的参数。

  • 接着,将本地模型设置为训练模式,并执行配置的本地训练轮次self.conf["local_epochs"]。在每一轮中,遍历数据加载器提供的批次数据,执行前向传播、计算损失、反向传播和参数更新。

  • 如果系统支持CUDA,则将数据和目标张量移动到GPU上。

  • 在所有本地训练轮次完成后,计算本地模型与全局模型之间的差异(即每个参数的差值),并将这些差异存储在字典diff中返回。这些差异将被发送到服务器,用于更新全局模型。

总之,Client类模拟了联邦学习中的一个客户端,负责在本地数据集上训练模型,并计算本地模型与全局模型之间的差异,以便在服务器上进行聚合。

2、server

这段代码定义了一个名为 get_model 的函数,它根据传入的模型名称(name)和是否使用预训练模型(pretrained)来加载并返回相应的PyTorch模型。这个函数支持多种常见的预训练模型,包括ResNet、DenseNet、AlexNet、VGG、Inception_v3 和 GoogLeNet。如果系统支持CUDA(即NVIDIA GPU),则模型会被转移到GPU上,否则模型将保留在CPU上。

这里是函数的详细解释:

  • 参数
    • name(字符串,默认为"vgg16"):指定要加载的模型名称。
    • pretrained(布尔值,默认为True):指定是否加载预训练的权重。如果为True,则加载预训练的模型;如果为False,则加载未训练的模型。
  • 功能
    • 根据name参数的值,使用torchvision.models模块中的相应函数加载模型。
    • 如果pretrained为True,则加载包含预训练权重的模型;如果为False,则加载不包含预训练权重的模型。
    • 检查系统是否支持CUDA(即是否有可用的NVIDIA GPU)。如果支持,则将模型转移到GPU上;如果不支持,则模型将保留在CPU上。
  • 返回值
    • 返回加载并可能已转移到GPU上的模型。

这个函数的设计非常灵活,允许用户根据需要加载不同的预训练模型,并自动处理模型在CPU和GPU之间的转移。这对于在PyTorch中进行深度学习实验和项目开发非常有用。

注意:在使用inception_v3模型时,通常还需要对输入图像进行特定的预处理(如调整大小、裁剪和归一化),因为inception_v3模型对输入图像的大小和格式有特定的要求。这通常是在数据加载和预处理阶段完成的,而不是在模型加载时。

3、get_dataset

您提供的代码段定义了一个名为 get_dataset 的函数,该函数根据传入的目录 dir 和数据集名称 name 来加载和预处理 MNIST 或 CIFAR-10 数据集。这个函数对于在机器学习和深度学习项目中动态加载不同数据集非常有用。下面是对这段代码的详细解释:

函数定义

python复制代码

def get_dataset(dir, name):
  • dir: 数据集将被下载并存储在此目录。
  • name: 指定要加载的数据集名称,可以是 'mnist' 或 'cifar'

数据集加载

函数内部首先检查 name 参数的值,并根据该值选择加载 MNIST 还是 CIFAR-10 数据集。

MNIST 数据集

如果 name 为 'mnist',则:

  • 使用 datasets.MNIST 从指定的 dir 加载训练集和测试集。
  • 训练集 (train_dataset) 被设置为 train=True 并允许自动下载(如果数据集尚未下载)。
  • 测试集 (eval_dataset) 被设置为 train=False,不用于训练。
  • 对两个数据集都应用了 transforms.ToTensor() 转换,将 PIL 图像或 NumPy ndarray 转换为 FloatTensor,并归一化到 [0.0, 1.0]。
CIFAR-10 数据集

如果 name 为 'cifar',则:

  • 为训练集定义了一个更复杂的转换 transform_train,包括随机裁剪、随机水平翻转、转换为张量以及归一化。这些转换有助于模型在训练过程中学习到更鲁棒的特征。
  • 测试集 (eval_dataset) 使用了一个简单的转换 transform_test,仅包括转换为张量和归一化,以确保评估时数据预处理的一致性。
  • 使用 datasets.CIFAR10 从指定的 dir 加载训练集和测试集,同样允许自动下载(如果数据集尚未下载)。

返回值

函数返回训练数据集 (train_dataset) 和评估数据集 (eval_dataset)。

使用示例

假设您想要将数据集加载到名为 data_dir 的目录中,并加载 CIFAR-10 数据集,您可以这样调用 get_dataset 函数:

python复制代码

train_dataset, eval_dataset = get_dataset('data_dir', 'cifar')

这将返回 CIFAR-10 的训练集和测试集,分别用于训练和评估模型。

这段代码定义了一个名为 get_dataset 的函数,它接收两个参数:dir 和 name。这个函数的目的是根据 name 参数的值('mnist' 或 'cifar'),从指定的 dir 目录中加载相应的训练集和评估集(或测试集),并对数据进行预处理。下面是对每段代码的具体解释:

  1. 导入必要的库

    python复制代码

    import torch
    from torchvision import datasets, transforms

    这里导入了 PyTorch 库(torch)以及 PyTorch Vision 库中的 datasets 和 transforms 模块。PyTorch Vision 是 PyTorch 的一个子库,提供了许多用于图像和视频数据集的加载、转换和模型架构的工具。

  2. 定义 get_dataset 函数

    python复制代码

    def get_dataset(dir, name):

    这个函数接收一个目录路径 dir 和一个数据集名称 name 作为输入,根据 name 的值加载不同的数据集。

  3. 处理 MNIST 数据集

    python复制代码

    if name=='mnist':
    train_dataset = datasets.MNIST(dir, train=True, download=True, transform=transforms.ToTensor())
    eval_dataset = datasets.MNIST(dir, train=False, transform=transforms.ToTensor())

    如果 name 参数为 'mnist',则加载 MNIST 数据集。datasets.MNIST 是 PyTorch Vision 提供的一个类,用于加载 MNIST 数据集。这里分别为训练集和评估集指定了 train=True 和 train=False,以及 download=True(如果数据集未下载,则自动下载)。同时,使用 transforms.ToTensor() 将图像数据转换为 PyTorch 张量,并进行归一化处理(自动将像素值从 [0, 255] 缩放到 [0.0, 1.0])。

  4. 处理 CIFAR 数据集

    python复制代码

    elif name=='cifar':
    # 定义训练和测试数据转换
    transform_train = transforms.Compose([...])
    transform_test = transforms.Compose([...])
    # 加载 CIFAR10 数据集
    train_dataset = datasets.CIFAR10(dir, train=True, download=True, transform=transform_train)
    eval_dataset = datasets.CIFAR10(dir, train=False, transform=transform_test)

    如果 name 参数为 'cifar',则加载 CIFAR10 数据集。对于 CIFAR 数据集,通常需要进行更复杂的数据预处理,如随机裁剪、随机水平翻转和归一化。这里使用了 transforms.Compose 来组合多个转换操作。训练集(train_dataset)和评估集(eval_dataset)分别使用了不同的转换配置,其中训练集使用了随机裁剪和随机水平翻转来增强数据,而评估集则只进行了归一化处理。

  5. 返回数据集

    python复制代码

    return train_dataset, eval_dataset

    最后,函数返回加载好的训练集和评估集。

总之,这段代码通过定义一个 get_dataset 函数,提供了一种灵活的方式来加载 MNIST 或 CIFAR10 数据集,并根据数据集的不同进行了适当的数据预处理。

4、 main

这段代码是一个简化的联邦学习(Federated Learning)框架的示例,它使用了JSON配置文件来设置实验参数,并通过模拟的服务器和客户端来执行训练过程。下面是对代码主要部分的解释和可能的改进点:

代码解释

  1. 配置文件加载:代码首先加载了一个JSON配置文件(conf_file_path),该文件包含了实验所需的各种配置,如数据集类型、模型数量、全局迭代次数等。

  2. 数据集加载:根据配置文件中的type字段,从datasets模块中加载训练集和评估集。

  3. 服务器和客户端初始化

    • 初始化一个Server对象,传入配置信息和评估数据集。
    • 根据配置中的模型数量(no_models),初始化多个Client对象,每个客户端都持有一个全局模型的副本和训练数据集的一部分。
  4. 训练过程

    • 在每个全局迭代(global_epochs)中,随机选择k个客户端进行本地训练。
    • 每个被选中的客户端执行本地训练,并返回模型更新的差异(diff)。
    • 服务器收集这些差异,并聚合它们以更新全局模型。
    • 使用评估数据集评估全局模型的性能,并打印出准确率和损失。

可能的改进点

  1. 错误处理和日志记录
    • 在加载配置文件、数据集或初始化服务器/客户端时,添加错误处理逻辑,以便在出现问题时能够优雅地处理。
    • 使用logging模块记录关键步骤和任何可能的错误,以便于调试和监控。
  2. 参数验证
    • 在使用配置文件中的参数之前,验证这些参数是否有效和合理(例如,no_modelsk应为正整数,global_epochs应大于0等)。
  3. 模型保存和加载
    • 在训练过程中定期保存全局模型的权重,以便在训练中断后能够恢复训练。
    • 允许从特定检查点加载模型,以便进行进一步的训练或评估。
  4. 客户端选择策略
    • 目前是随机选择客户端进行训练。可以考虑实现更复杂的客户端选择策略,如基于客户端性能或数据量的选择。
  5. 通信优化
    • 在实际部署中,客户端和服务器之间的通信可能成为瓶颈。可以考虑实现压缩算法来减少传输的数据量,或使用更高效的通信协议。
  6. 安全性
    • 在联邦学习中,保护客户端数据的隐私至关重要。可以考虑实现加密技术来保护传输过程中的模型更新。
  7. 代码结构和模块化
    • 将代码拆分成更小的模块和函数,以提高可读性和可维护性。
    • 使用类来封装服务器和客户端的逻辑,使代码更加面向对象。
  8. 扩展性
    • 设计系统时考虑未来的扩展性,例如支持不同类型的模型、数据集和联邦学习算法。
  9. 性能监控
    • 在训练过程中监控资源使用情况(如CPU、内存和磁盘I/O),以确保系统稳定运行。
  10. 文档和注释
    • 为代码添加详细的文档和注释,以便其他开发人员能够更容易地理解和维护代码。

5、models

这段代码定义了一个名为 get_model 的函数,它根据传入的模型名称(name)和是否使用预训练模型(pretrained)来加载并返回相应的PyTorch模型。这个函数支持多种常见的预训练模型,包括ResNet、DenseNet、AlexNet、VGG、Inception_v3 和 GoogLeNet。如果系统支持CUDA(即NVIDIA GPU),则模型会被转移到GPU上,否则模型将保留在CPU上。

这里是函数的详细解释:

  • 参数
    • name(字符串,默认为"vgg16"):指定要加载的模型名称。
    • pretrained(布尔值,默认为True):指定是否加载预训练的权重。如果为True,则加载预训练的模型;如果为False,则加载未训练的模型。
  • 功能
    • 根据name参数的值,使用torchvision.models模块中的相应函数加载模型。
    • 如果pretrained为True,则加载包含预训练权重的模型;如果为False,则加载不包含预训练权重的模型。
    • 检查系统是否支持CUDA(即是否有可用的NVIDIA GPU)。如果支持,则将模型转移到GPU上;如果不支持,则模型将保留在CPU上。
  • 返回值
    • 返回加载并可能已转移到GPU上的模型。

这个函数的设计非常灵活,允许用户根据需要加载不同的预训练模型,并自动处理模型在CPU和GPU之间的转移。这对于在PyTorch中进行深度学习实验和项目开发非常有用。

注意:在使用inception_v3模型时,通常还需要对输入图像进行特定的预处理(如调整大小、裁剪和归一化),因为inception_v3模型对输入图像的大小和格式有特定的要求。这通常是在数据加载和预处理阶段完成的,而不是在模型加载时。

3、搭建federal learning 的框架(已完成)

4、学习pytorch(学习ing)

5、阅读文献

这篇文献《Communication-Efficient Learning of Deep Networks from Decentralized Data》的核心要点可以总结如下:

联邦学习概述:

联邦学习:一种分布式学习范式,允许在移动设备上进行数据训练,而不必将数据传输到数据中心,从而保护用户隐私。
数据隐私保护:移动设备上的数据通常是敏感的,且量大,不适合上传到数据中心训练,联邦学习通过仅传输模型更新来解决这一问题。


联邦学习的优势:

隐私和安全:由于数据保留在本地,攻击面仅限于设备本身,减少了数据中心泄露的风险。
通信效率:通过迭代模型平均,减少了所需的通信轮次,相比同步随机梯度下降方法,通信成本降低了10到100倍。


联邦优化特性:

非独立同分布(Non-IID)数据:客户端的数据基于用户行为,不具有代表性。
数据不平衡:不同用户的使用习惯不同,导致数据量差异大。
分布式规模:参与优化的客户端数量远大于每个客户端的平均数据量。
通信限制:移动设备经常离线或网络条件差,对通信成本有严格要求。


FederatedAveraging 算法:

算法基础:基于本地随机梯度下降(SGD)与服务器模型平均相结合。
参数优化:通过增加每轮通信中的客户端数量(C)、每个客户端的本地训练周期数(E)和本地小批量大小(B)来优化模型训练。
实验结果:FedAvg 算法在 MNIST、CIFAR-10 和莎士比亚数据集上展示了显著的通信效率提升和模型质量优化。


实验设计与结果:

模型架构:涵盖了多层感知机(MLP)、卷积神经网络(CNN)、字符级和单词级长短期记忆网络(LSTM)。
数据集:使用 MNIST、CIFAR-10、莎士比亚作品数据集以及大规模社交媒体文本数据集进行训练和测试。
通信效率:FedAvg 相比 FedSGD 在达到相同测试准确率时,显著减少了通信轮次,如 CIFAR-10 数据集上达到 85% 准确率时,FedAvg 仅需 2000 轮通信,而 FedSGD 需要 3750 轮。


联邦学习的挑战与未来方向:

挑战:包括客户端数据集的动态变化、客户端可用性的复杂性、客户端无响应或发送错误更新等问题。
未来方向:结合差分隐私、安全多方计算等技术进一步增强隐私保护;探索更高效的通信压缩算法;应对更多实际部署中的挑战。


实际应用潜力:

移动应用增强:联邦学习可以显著提升移动设备上语言模型和图像模型的性能,从而改善用户体验。
实时数据利用:利用移动设备上实时生成的大量数据,通过联邦学习不断优化模型,为用户提供更个性化的服务。

总结:这篇文献提出了联邦学习框架,通过保留数据在本地并仅传输模型更新,实现了高效且隐私保护的深度学习。FederatedAveraging 算法通过优化本地计算和通信策略,显著提高了模型训练的效率和质量,展示了联邦学习在实际应用中的巨大潜力。

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

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

相关文章

机器学习之 K-means算法的代码实现

K-means 算法简介 K-means 是一种常用的无监督学习算法,主要用于数据聚类。它的主要思想是将数据集中的数据分成 K 个簇(Cluster),使得簇内的数据点尽可能相似,而簇间的差异尽可能大。K-means 算法的核心步骤包括初始…

关于类与构造函数继承的小挑战

题目 /* 使用构造函数将电动汽车(称为 EV)作为 Car 的子 “类 ”来实现。除了品牌和当前速度外,EV 还具有当前电池电量(百分比)(“charge ”属性);实现一个 “chargeBattery ”方法…

Vitis AI 基本认知(Tiny-VGG 项目代码详解)

目录 1. 简介 1.1 Tiny-VGG 1.2 data 目录结构 2. 代码分析 2.1 Import packages 2.2 Dataset 2.3 Train step 2.4 Vali & Test step 2.5 Ceate model 2.6 Compile model 2.6.1 计算 loss 2.6.2 计算平均值 3.6.3 计算准确度 2.7 训练循环 2.7.1 自定义训练…

BLE蓝牙协议详解

BLE蓝牙协议详解 1、BLE协议栈 1、协议栈结构 蓝牙LE协议栈按功能分为三个层:Controller、Host和Application Profiles and Services。 HCI event是按BLE Spec标准设计的,是BLE Controller和Host用来交互的事件;GAP event是BLE host定义的…

环境配置 --- miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块

环境配置 — miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 CSDN 原因:fbegmm.dll文件出现问题 解决方案: 使用依赖分析工具https://github.com/lucasg/Dependencies/releases/tag/v1.11.1 检测报错提示的那个dll文件发现哪个文…

Nuclei:开源漏洞扫描器

Nuclei 拥有灵活的模板系统,可以适应各种安全检查。 它可以使用可自定义的模板向多个目标发送请求,确保零误报并实现跨多台主机的快速扫描。 它支持多种协议,包括 TCP、DNS、HTTP、SSL、文件、Whois、Websocket 等。 特征 模板库&#xf…

Java中的定时器(Timer)

目录 一、什么是定时器? 二、标准库中的定时器 三、实现定时器 一、什么是定时器? 定时器就像一个"闹钟",当它到达设定的时间后,就会执行预定的代码。 例如,我们在TCP的超时重传机制中讲过,如果服务器在规定的时间…

XDMA - AXI4 Memory Mapped

目录 1. What is SG DMA2. Descriptor3. Transfer for H2CStep 1. The host prepares stored data and creates descriptors in main memoryStep 2. The host enables DMA interruptsStep 2. The driver initializes DMA with descriptor start addressStep 3. The driver writ…

数据结构(邓俊辉)学习笔记】串 06——KMP算法:构造next[]表

文章目录 1. 递推2. 算法3. 实现 1. 递推 接下来的这节,我们就来讨论 next 查询表的构造算法。我们将会看到非常有意思是, next 表的构造过程与 KMP 主算法的流程在本质上是完全一样的。 在这里,我们不妨采用递推策略。我们只需回答这样一个…

带你深入浅出新面经:十六、十大排序之快速排序

此为面经第十六谈!关注我,每日带你深入浅出一个新面经。 我们要了解面经要如何“说”! 很重要!很重要!很重要! 我们通常采取总-分-总方式来阐述!(有些知识点,你可以去…

python脚本请求数量达到上限,http请求重试问题例子解析

在使用Python的requests库进行HTTP请求时,可能会遇到请求数量达到上限,导致Max retries exceeded with URL的错误。这通常发生在网络连接不稳定、服务器限制请求次数、或请求参数设置错误的情况下。以下是一些解决该问题的策略: 增加重试次数…

【负载均衡式在线OJ】项目设计

文章目录 程序源码用到的技术项目宏观结构代码编写思路 程序源码 https://gitee.com/not-a-stupid-child/online-judge 用到的技术 C STL 标准库。Boost 准标准库(字符串切割)。cpp-httplib 第三方开源网络库。ctemplate 第三方开源前端网页渲染库。jsoncpp 第三方开源序列化…

栈和队列有何区别?

栈和队列是两种常见的数据结构,它们分别用于解决不同类型的问题。在程序设计中,栈和队列都是非常重要的数据结构,因为它们可以帮助我们解决很多实际的问题。 栈: 首先,让我们来讨论栈, 栈是一种后进先出(…

学NLP不看这本书等于白学!一书弄懂NLP自然语言处理(附文档)

随着人工智能技术的飞速发展,自然语言处理成为了计算机科学与人工智能领域中不可或缺的关键技术之一。作为一名长期致力于人工智能和自然语言处理研究的学者,今天给大家推荐的这本《自然语言处理:大模型理论与实践》正是学NLP自然语言非常牛逼…

黑神话悟空用什么编程语言

《黑神话:悟空》作为一款备受瞩目的国产单机动作游戏,其背后的开发涉及了多种编程语言和技术。根据公开信息和游戏开发行业的普遍做法,可以推测该游戏主要使用了以下几种编程语言: C: 核心编程语言:作为《黑…

【C++ Primer Plus习题】5.7

问题: 解答: #include <iostream> #include <string> using namespace std;typedef struct _Car {string brand;int year; }Car;int main() {int count 0;cout << "请问你家有多少辆车呢?" << endl;cin >> count;cin.get();Car* ca…

Java 入门指南:Java IO流 —— 序列化与反序列化

序列化 序列化是指将对象转换为字节流的过程&#xff0c;以便能够将其存储到文件、内存、网络传输等介质中&#xff0c;或者在不同的进程、网络或机器之间进行数据交换。 序列化的逆过程称为反序列化&#xff0c;即将字节流转换为对象。过反序列化&#xff0c;可以从存储介质…

【mysql】mysql之索引学习

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

面试搜狐大型模型算法工程师,感受非凡体验!

搜狐大模型算法工程师面试题 应聘岗位&#xff1a;搜狐大模型算法工程师 面试轮数&#xff1a; 整体面试感觉&#xff1a;偏简单 面试过程回顾 1. 自我介绍 在自我介绍环节&#xff0c;我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长&#xff0c;展示了自信和沟通…

【Office】激活文件无法打开-DragonKMS--解决办法

【解决办法】右键 文件属性>>最下面勾选解除锁定即可打开。 【原因】&#xff1a;网络上下载的文件&#xff08;包括exe、zip等&#xff09;。