华为开源自研AI框架昇思MindSpore应用案例:在ResNet-50网络上应用二阶优化实践

常见的优化算法可分为一阶优化算法和二阶优化算法。经典的一阶优化算法如SGD等,计算量小、计算速度快,但是收敛的速度慢,所需的迭代次数多。而二阶优化算法使用目标函数的二阶导数来加速收敛,能更快地收敛到模型最优值,所需要的迭代次数少,但由于二阶优化算法过高的计算成本,导致其总体执行时间仍然慢于一阶,故目前在深度神经网络训练中二阶优化算法的应用并不普遍。二阶优化算法的主要计算成本在于二阶信息矩阵(Hessian矩阵、FIM矩阵等)的求逆运算,时间复杂度约为𝑂(𝑛3)。

MindSpore开发团队在现有的自然梯度算法的基础上,对FIM矩阵采用近似、切分等优化加速手段,极大的降低了逆矩阵的计算复杂度,开发出了可用的二阶优化器THOR。使用8块Atlas训练系列产品,THOR可以在72min内完成ResNet50-v1.5网络和ImageNet数据集的训练,相比于SGD+Momentum速度提升了近一倍。

本篇教程将主要介绍如何在Atlas训练系列产品以及GPU上,使用MindSpore提供的二阶优化器THOR训练ResNet50-v1.5网络和ImageNet数据集。

如果你对MindSpore感兴趣,可以关注昇思MindSpore社区

在这里插入图片描述

在这里插入图片描述

一、环境准备

1.进入ModelArts官网

云平台帮助用户快速创建和部署模型,管理全周期AI工作流,选择下面的云平台以开始使用昇思MindSpore,获取安装命令,安装MindSpore2.0.0-alpha版本,可以在昇思教程中进入ModelArts官网

在这里插入图片描述

选择下方CodeLab立即体验

在这里插入图片描述

等待环境搭建完成

在这里插入图片描述

2.使用CodeLab体验Notebook实例

下载NoteBook样例代码

git clone https://gitee.com/mindspore/models.git

选择ModelArts terminal

在official/cv/ResNet目录下

选择Kernel环境

在这里插入图片描述

切换至GPU环境,切换成第一个限时免费

在这里插入图片描述

进入昇思MindSpore官网,点击上方的安装

在这里插入图片描述

获取安装命令

在这里插入图片描述

回到Notebook中,在第一块代码前加入命令
在这里插入图片描述

conda update -n base -c defaults conda

在这里插入图片描述

安装MindSpore 2.0 GPU版本

conda install mindspore=2.0.0a0 -c mindspore -c conda-forge

在这里插入图片描述

安装mindvision

pip install mindvision

在这里插入图片描述

安装下载download

pip install download

在这里插入图片描述

二、案例实现

下载完整示例代码:Resnet。

示例代码目录结构

├── resnet├── README.md├── scripts├── run_distribute_train.sh         # launch distributed training for Atlas training series├── run_eval.sh                     # launch inference for Atlas training series├── run_distribute_train_gpu.sh     # launch distributed training for GPU├── run_eval_gpu.sh                 # launch inference for GPU├── src├── dataset.py                      # data preprocessing├── CrossEntropySmooth.py           # CrossEntropy loss function├── lr_generator.py                 # generate learning rate for every step├── resnet.py                       # ResNet50 backbone├── model_utils├── config.py                   # parameter configuration├── eval.py                             # infer script├── train.py                            # train script

整体执行流程如下:

  1. 准备ImageNet数据集,处理需要的数据集;

  2. 定义ResNet50网络;

  3. 定义损失函数和THOR优化器;

  4. 加载数据集并进行训练,训练完成后,查看结果及保存模型文件;

  5. 加载保存的模型,进行推理。

准备环节

实践前,确保已经正确安装MindSpore。如果没有,可以通过MindSpore安装页面安装MindSpore。

准备数据集

下载完整的ImageNet2012数据集,将数据集解压分别存放到本地工作区的ImageNet2012/ilsvrcImageNet2012/ilsvrc_eval路径下。

目录结构如下:

└─ImageNet2012├─ilsvrc│      n03676483│      n04067472│      n01622779│      ......└─ilsvrc_eval│      n03018349│      n02504013│      n07871810│      ......

配置分布式环境变量

Atlas训练系列产品

Atlas训练系列产品的分布式环境变量配置参考rank table启动方式。

GPU

GPU的分布式环境配置参考mpirun启动方式。

加载处理数据集

分布式训练时,通过并行的方式加载数据集,同时通过MindSpore提供的数据增强接口对数据集进行处理。加载处理数据集的脚本在源码的src/dataset.py脚本中。

import os
import mindspore as ms
import mindspore.dataset as ds
import mindspore.dataset.vision as vision
import mindspore.dataset.transforms as transforms
from mindspore.communication import init, get_rank, get_group_sizedef create_dataset2(dataset_path, do_train, repeat_num=1, batch_size=32, target="Ascend", distribute=False,enable_cache=False, cache_session_id=None):"""Create a training or evaluation ImageNet2012 dataset for ResNet50.Args:dataset_path(string): the path of dataset.do_train(bool): whether the dataset is used for training or evaluation.repeat_num(int): the repeat times of dataset. Default: 1batch_size(int): the batch size of dataset. Default: 32target(str): the device target. Default: Ascenddistribute(bool): data for distribute or not. Default: Falseenable_cache(bool): whether tensor caching service is used for evaluation. Default: Falsecache_session_id(int): if enable_cache is set, cache session_id need to be provided. Default: NoneReturns:dataset"""if target == "Ascend":device_num, rank_id = _get_rank_info()else:if distribute:init()rank_id = get_rank()device_num = get_group_size()else:device_num = 1if device_num == 1:data_set = ds.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True)else:data_set = ds.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True,num_shards=device_num, shard_id=rank_id)image_size = 224mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]std = [0.229 * 255, 0.224 * 255, 0.225 * 255]# define map operationsif do_train:trans = [vision.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)),vision.RandomHorizontalFlip(prob=0.5),vision.Normalize(mean=mean, std=std),vision.HWC2CHW()]else:trans = [vision.Decode(),vision.Resize(256),vision.CenterCrop(image_size),vision.Normalize(mean=mean, std=std),vision.HWC2CHW()]type_cast_op = transforms.TypeCast(ms.int32)data_set = data_set.map(operations=trans, input_columns="image", num_parallel_workers=8)# only enable cache for evalif do_train:enable_cache = Falseif enable_cache:if not cache_session_id:raise ValueError("A cache session_id must be provided to use cache.")eval_cache = ds.DatasetCache(session_id=int(cache_session_id), size=0)data_set = data_set.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8,cache=eval_cache)else:data_set = data_set.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8)# apply batch operationsdata_set = data_set.batch(batch_size, drop_remainder=True)# apply dataset repeat operationdata_set = data_set.repeat(repeat_num)return data_set

MindSpore支持进行多种数据处理和增强的操作,各种操作往往组合使用,具体可以参考数据处理和数据增强章节。

定义网络

本示例中使用的网络模型为ResNet50-v1.5,定义ResNet50网络。

网络构建完成以后,在__main__函数中调用定义好的ResNet50:

...
from src.resnet import resnet50 as resnet
...
if __name__ == "__main__":...# define netnet = resnet(class_num=config.class_num)...

定义损失函数及THOR优化器

定义损失函数

MindSpore支持的损失函数有SoftmaxCrossEntropyWithLogitsL1LossMSELoss等。THOR优化器需要使用SoftmaxCrossEntropyWithLogits损失函数。

损失函数的实现步骤在src/CrossEntropySmooth.py脚本中。这里使用了深度网络模型训练中的一个常用trick:label smoothing,通过对真实标签做平滑处理,提高模型对分类错误标签的容忍度,从而可以增加模型的泛化能力。

class CrossEntropySmooth(LossBase):"""CrossEntropy"""def __init__(self, sparse=True, reduction='mean', smooth_factor=0., num_classes=1000):super(CrossEntropySmooth, self).__init__()self.onehot = ops.OneHot()self.sparse = sparseself.on_value = ms.Tensor(1.0 - smooth_factor, ms.float32)self.off_value = ms.Tensor(1.0 * smooth_factor / (num_classes - 1), ms.float32)self.ce = nn.SoftmaxCrossEntropyWithLogits(reduction=reduction)def construct(self, logit, label):if self.sparse:label = self.onehot(label, ops.shape(logit)[1], self.on_value, self.off_value)loss = self.ce(logit, label)return loss

__main__函数中调用定义好的损失函数:

...
from src.CrossEntropySmooth import CrossEntropySmooth
...
if __name__ == "__main__":...# define the loss functionif not config.use_label_smooth:config.label_smooth_factor = 0.0loss = CrossEntropySmooth(sparse=True, reduction="mean",smooth_factor=config.label_smooth_factor, num_classes=config.class_num)...

定义优化器

THOR优化器的参数更新公式如下:

𝜃𝑡+1=𝜃𝑡+𝛼𝐹−1∇𝐸

参数更新公式中各参数的含义如下:

  • 𝜃:网络中的可训参数;

  • 𝑡:迭代次数;

  • 𝛼:学习率值,参数的更新步长;

  • 𝐹−1:FIM矩阵,在网络中计算获得;

  • ∇𝐸:一阶梯度值。

从参数更新公式中可以看出,THOR优化器需要额外计算的是每一层的FIM矩阵。FIM矩阵可以对每一层参数更新的步长和方向进行自适应的调整,加速收敛的同时可以降低调参的复杂度。

在调用MindSpore封装的二阶优化器THOR时,优化器会自动调用转换接口,把之前定义好的ResNet50网络中的Conv2d层和Dense层分别转换成对应的Conv2dThor和DenseThor。 而在Conv2dThor和DenseThor中可以完成二阶信息矩阵的计算和存储。

THOR优化器转换前后的网络backbone一致,网络参数保持不变。

在训练主脚本中调用THOR优化器:

...
from mindspore.nn import thor
...
if __name__ == "__main__":...# learning rate setting and damping settingfrom src.lr_generator import get_thor_lr, get_thor_dampinglr = get_thor_lr(0, config.lr_init, config.lr_decay, config.lr_end_epoch, step_size, decay_epochs=39)damping = get_thor_damping(0, config.damping_init, config.damping_decay, 70, step_size)# define the optimizersplit_indices = [26, 53]opt = thor(net, ms.Tensor(lr), ms.Tensor(damping), config.momentum, config.weight_decay, config.loss_scale,config.batch_size, split_indices=split_indices, frequency=config.frequency)...

训练网络

配置模型保存

MindSpore提供了callback机制,可以在训练过程中执行自定义逻辑,这里使用框架提供的ModelCheckpoint函数。 ModelCheckpoint可以保存网络模型和参数,以便进行后续的fine-tuning操作。 TimeMonitorLossMonitor是MindSpore官方提供的callback函数,可以分别用于监控训练过程中单步迭代时间和loss值的变化。

...
import mindspore as ms
from mindspore.train import ModelCheckpoint, CheckpointConfig, LossMonitor, TimeMonitor
...
if __name__ == "__main__":...# define callbackstime_cb = TimeMonitor(data_size=step_size)loss_cb = LossMonitor()cb = [time_cb, loss_cb]if config.save_checkpoint:config_ck = CheckpointConfig(save_checkpoint_steps=config.save_checkpoint_epochs * step_size,keep_checkpoint_max=config.keep_checkpoint_max)ckpt_cb = ModelCheckpoint(prefix="resnet", directory=ckpt_save_dir, config=config_ck)cb += [ckpt_cb]...

配置训练网络

通过MindSpore提供的model.train接口可以方便地进行网络的训练。THOR优化器通过降低二阶矩阵更新频率,来减少计算量,提升计算速度,故重新定义一个ModelThor类,继承MindSpore提供的Model类。在ModelThor类中获取THOR的二阶矩阵更新频率控制参数,用户可以通过调整该参数,优化整体的性能。 MindSpore提供Model类向ModelThor类的一键转换接口。

...
import mindspore as ms
from mindspore import amp
from mindspore.train import Model, ConvertModelUtils
...if __name__ == "__main__":...loss_scale = amp.FixedLossScaleManager(config.loss_scale, drop_overflow_update=False)model = Model(net, loss_fn=loss, optimizer=opt, loss_scale_manager=loss_scale, metrics=metrics,amp_level="O2", keep_batchnorm_fp32=False, eval_network=dist_eval_network)if cfg.optimizer == "Thor":model = ConvertModelUtils().convert_to_thor_model(model=model, network=net, loss_fn=loss, optimizer=opt,loss_scale_manager=loss_scale, metrics={'acc'},amp_level="O2", keep_batchnorm_fp32=False)  ...

运行脚本

训练脚本定义完成之后,调scripts目录下的shell脚本,启动分布式训练进程。

Atlas训练系列产品

目前MindSpore分布式在Ascend上执行采用单卡单进程运行方式,即每张卡上运行1个进程,进程数量与使用的卡的数量一致。进程均放在后台执行,每个进程创建1个目录,目录名称为train_paralleldevice_id,用来保存日志信息,算子编译信息以及训练的checkpoint文件。下面以使用8张卡的分布式训练脚本为例,演示如何运行脚本。

使用以下命令运行脚本:

bash run_distribute_train.sh <RANK_TABLE_FILE> <DATASET_PATH> [CONFIG_PATH]

脚本需要传入变量RANK_TABLE_FILEDATASET_PATHCONFIG_PATH,其中:

  • RANK_TABLE_FILE:组网信息文件的路径。(rank table文件的生成,参考HCCL_TOOL)

  • DATASET_PATH:训练数据集路径。

  • CONFIG_PATH:配置文件路径。

其余环境变量请参考安装教程中的配置项。

训练过程中loss打印示例如下:

...
epoch: 1 step: 5004, loss is 4.4182425
epoch: 2 step: 5004, loss is 3.740064
epoch: 3 step: 5004, loss is 4.0546017
epoch: 4 step: 5004, loss is 3.7598825
epoch: 5 step: 5004, loss is 3.3744206
...
epoch: 40 step: 5004, loss is 1.6907625
epoch: 41 step: 5004, loss is 1.8217756
epoch: 42 step: 5004, loss is 1.6453942
...

训练完后,每张卡训练产生的checkpoint文件保存在各自训练目录下,device_0产生的checkpoint文件示例如下:

└─train_parallel0├─ckpt_0├─resnet-1_5004.ckpt├─resnet-2_5004.ckpt│      ......├─resnet-42_5004.ckpt│      ......

其中, *.ckpt:指保存的模型参数文件。checkpoint文件名称具体含义:网络名称-epoch数_step数.ckpt。

GPU

在GPU硬件平台上,MindSpore采用OpenMPI的mpirun进行分布式训练,进程创建1个目录,目录名称为train_parallel,用来保存日志信息和训练的checkpoint文件。下面以使用8张卡的分布式训练脚本为例,演示如何运行脚本。

使用以下命令运行脚本:

bash run_distribute_train_gpu.sh <DATASET_PATH> <CONFIG_PATH>

脚本需要传入变量DATASET_PATHCONFIG_PATH,其中:

  • DATASET_PATH:训练数据集路径。

  • CONFIG_PATH:配置文件路径。

在GPU训练时,无需设置DEVICE_ID环境变量,因此在主训练脚本中不需要调用int(os.getenv('DEVICE_ID'))来获取卡的物理序号,同时context中也无需传入device_id。我们需要将device_target设置为GPU,并需要调用init()来使能NCCL。

训练过程中loss打印示例如下:

...
epoch: 1 step: 5004, loss is 4.2546034
epoch: 2 step: 5004, loss is 4.0819564
epoch: 3 step: 5004, loss is 3.7005644
epoch: 4 step: 5004, loss is 3.2668946
epoch: 5 step: 5004, loss is 3.023509
...
epoch: 36 step: 5004, loss is 1.645802
...

训练完后,保存的模型文件示例如下:

└─train_parallel├─ckpt_0├─resnet-1_5004.ckpt├─resnet-2_5004.ckpt│      ......├─resnet-36_5004.ckpt│      ............├─ckpt_7├─resnet-1_5004.ckpt├─resnet-2_5004.ckpt│      ......├─resnet-36_5004.ckpt│      ......

模型推理

使用训练过程中保存的checkpoint文件进行推理,验证模型的泛化能力。首先通过load_checkpoint接口加载模型文件,然后调用Modeleval接口对输入图片类别作出预测,再与输入图片的真实类别做比较,得出最终的预测精度值。

定义推理网络

  1. 使用load_checkpoint接口加载模型文件。

  2. 使用model.eval接口读入测试数据集,进行推理。

  3. 计算得出预测精度值。

...
import mindspore as ms
from mindspore.train import Model
...if __name__ == "__main__":...# define netnet = resnet(class_num=config.class_num)# load checkpointparam_dict = ms.load_checkpoint(args_opt.checkpoint_path)ms.load_param_into_net(net, param_dict)net.set_train(False)# define lossif args_opt.dataset == "imagenet2012":if not config.use_label_smooth:config.label_smooth_factor = 0.0loss = CrossEntropySmooth(sparse=True, reduction='mean',smooth_factor=config.label_smooth_factor, num_classes=config.class_num)else:loss = SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')# define modelmodel = Model(net, loss_fn=loss, metrics={'top_1_accuracy', 'top_5_accuracy'})# eval modelres = model.eval(dataset)print("result:", res, "ckpt=", args_opt.checkpoint_path)...

执行推理

推理网络定义完成之后,调用scripts目录下的shell脚本,进行推理。

Atlas训练系列产品

在Atlas训练系列产品平台上,推理的执行命令如下:

bash run_eval.sh <DATASET_PATH> <CHECKPOINT_PATH> <CONFIG_PATH>

脚本需要传入变量DATASET_PATHCHECKPOINT_PATH<CONFIG_PATH>,其中:

  • DATASET_PATH:推理数据集路径。

  • CHECKPOINT_PATH:保存的checkpoint路径。

  • CONFIG_PATH:配置文件路径。

目前推理使用的是单卡(默认device 0)进行推理,推理的结果如下:

result: {'top_5_accuracy': 0.9295574583866837, 'top_1_accuracy': 0.761443661971831} ckpt=train_parallel0/resnet-42_5004.ckpt
  • top_5_accuracy:对于一个输入图片,如果预测概率排名前五的标签中包含真实标签,即认为分类正确;

  • top_1_accuracy:对于一个输入图片,如果预测概率最大的标签与真实标签相同,即认为分类正确。

GPU

在GPU硬件平台上,推理的执行命令如下:

  bash run_eval_gpu.sh <DATASET_PATH> <CHECKPOINT_PATH> <CONFIG_PATH>

脚本需要传入变量DATASET_PATHCHECKPOINT_PATHCONFIG_PATH,其中:

  • DATASET_PATH:推理数据集路径。

  • CHECKPOINT_PATH:保存的checkpoint路径。

  • CONFIG_PATH:配置文件路径。

推理的结果如下:

result: {'top_5_accuracy': 0.9287972151088348, 'top_1_accuracy': 0.7597031049935979} ckpt=train_parallel/resnet-36_5

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

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

相关文章

三星硬盘格式化后怎么恢复数据

在数字化时代&#xff0c;硬盘作为数据存储的核心部件&#xff0c;承载着我们的重要文件、照片、视频等资料。然而&#xff0c;不慎的格式化操作可能使我们失去宝贵的数据。面对这样的困境&#xff0c;许多用户可能会感到无助和焦虑。本文旨在为三星硬盘用户提供格式化后的数据…

geotrust企业通配符证书2990

随着时代的变化&#xff0c;人们获取信息的方式由报纸、书籍变为手机、电脑&#xff0c;因此很多企事业单位用户开始在互联网中创建网站来进行宣传&#xff0c;吸引客户。为了维护网站安全环境&#xff0c;保护客户数据&#xff0c;企事业单位也开始使用SSL数字证书&#xff0c…

ubuntu install vivado 2023

Downloads sudo mkdir /opt/vivado

算法练习day7

四数相加II 代码随想录 0454.四数相加II 454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; &#xff08;用时&#xff1a;0.5小时&#xff09; 思路 本道题是需要在四个数组中&#xff0c;各找一个数&#xff0c;这些数加起来能够等于0&#xff0c;那么就是答案元…

onnx模型截取部分

这个是有需求的&#xff0c;比如有多个输入节点&#xff0c;我只用其中几个&#xff0c;或有多个输出节点&#xff0c;我只用其中几个。 比如这个输入&#xff0c;我们可以直接把transpose去掉&#xff0c;用类pytorch的N,C,H,W的格式输入。 还有如下输出&#xff1a; tran…

喜报|才聚荣获“2024年度PMI(中国)注册教育机构杰出机构奖”!

5月10日&#xff0c;“2024PMI&#xff08;中国&#xff09;注册教育机构合作伙伴大会”隆重举行&#xff0c;才聚集团受邀参加此次盛会。 本次大会就项目管理职业生态、发展趋势等热门问题进行了深入探讨分析。 PMP认证自1999年引入中国&#xff0c;为国家培养了大量项目管理…

Springboot+Vue项目-基于Java+MySQL的宠物商城网站系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

618有什么好物推荐?618平价好物清单,让你买到物超所值的好货!

618大促即将开启&#xff0c;大家是不是已经跃跃欲试&#xff0c;准备大肆采购一番了呢&#xff1f;别心急&#xff0c;让我为你揭晓几款数码、家居领域中的明星产品。这些好物不仅实用&#xff0c;而且性价比超高&#xff0c;让你在享受购物乐趣的同时&#xff0c;也能买到真正…

人工智能的未来:Sam Altman 揭穿搜索引擎谣言,调侃 ChatGPT 和 GPT-4 的“神奇”更新

人工智能的未来&#xff1a;Sam Altman 揭穿搜索引擎谣言&#xff0c;调侃 ChatGPT 和 GPT-4 的“神奇”更新 概述 科技界充斥着有关人工智能研究先驱组织 OpenAI 将推出类似谷歌搜索引擎的传言。然而&#xff0c;首席执行官 Sam Altman 已经平息了这些谣言&#xff0c;并透露…

mac 讨厌百度网盘怎么办

一、别拦我 首先请允许我泄个愤&#xff0c;tmd百度网盘下个1g的文件下载速度竟然超不过200k&#xff0c;只要不放在所有已打开软件的最前面&#xff0c;它就给你降到10k以内&#xff0c;关键是你慢就慢了&#xff0c;我也不是很着急&#xff0c;关键是你日常下载失败并且总是…

代码随想录算法训练营第36期DAY24

DAY24 235二叉搜索树的最近公共祖先 迭代法&#xff1a; /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solutio…

2024年5月10日有感复盘

2024年5月10日有感复盘 时间 今天是一个很美好的一天&#xff0c;原因是很平凡&#xff0c;读书很平凡&#xff0c;玩游戏很平凡&#xff0c;然后生活很平凡&#xff0c;未来可期&#xff0c;听歌很舒服&#xff0c;很喜欢一个人呆在图书馆的感觉&#xff0c;很喜欢发呆&…

DeepMind的首席执行官Demis Hassabis表示,未来一到两年内,能够独立完成复杂任务的AI代理将成为现实

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

网络安全复习

概述 重要性 网络安全威胁 OSI安全体系结构 信息与网络安全目标 机密性完整性可用性 五类安全服务 八类安全机制 网络安全体系结构 基本安全设计原则 数据加密技术 2.1数据加密技术概述 2.2经典加密 2.3对称秘钥加密 2.4公开秘钥加密 Diffie-Hellman秘钥交换 对称…

【DDR 终端稳压器】Sink and Source DDR Termination Regulator [B]

正式从这里开始 TI 的选型&#xff1b; tps54116-q1 tps51200a-q1 TPS53317 典型电路 pin功能EN对于 DDR VTT 应用&#xff0c;请将 EN 连接到 SLP_S3 对于任何其他应用&#xff0c;请使用 EN 作为 ON/OFF 功能 始终保持 EN 电压等于或低于 VIN 电压GND信号接地 连接到输…

活字格中读取粘贴板中的内容:剪切板cp,我手机就吃这一亲!

哟,小伙伴们,今天我们来聊聊一个有趣的小功能吧! 你们应该都熟悉"复制粘贴"这个操作了吧?用CtrlC和CtrlV就可以将文字或图片等内容从一处复制到另一处,方便极了。但是,如果你的设备没有键盘,就没法使用快捷键了,那可怎么办呢? 别急,我们有解决办法!开发应用的时候…

【复利思维 + 项目成功方程式】用1年,超越别人38年!

复利思维—每天进步1%。 一年后会比现在的自己优秀38倍。在做任何事情时都要考虑&#xff0c;这件事是否能随着时间不断积累扩大&#xff0c;不能积累价值的事情要及时调整和止损。 在这个过程中&#xff0c;千万不要陷入心理暗示的陷阱&#xff0c;尤其是越想得到的&#xf…

JVM调参实践总结

JVM调优–理论篇从理论层面介绍了如何对JVM调优。这里再写一篇WIKI&#xff0c;尝试记录下JVM参数使用的最佳实践&#xff0c;注意&#xff0c;这里重点介绍HotSpot VM的调参&#xff0c;其他JVM的调参可以类比&#xff0c;但不可照搬。 Java版本选择 基于Java开发应用时&…

政安晨:【Keras机器学习示例演绎】(四十二)—— 使用 KerasNLP 和 tf.distribute 进行数据并行训练

目录 简介 导入 基本批量大小和学习率 计算按比例分配的批量大小和学习率 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在…

机器学习求数组的迹

机器学习求数组的迹、也叫求矩阵的迹。 矩阵的迹&#xff0c;也称为迹数&#xff0c;是矩阵主对角线上所有元素的和。矩阵的迹具有以下重要性质&#xff1a;- 不变性&#xff1a;矩阵的迹在转置、加法、乘法等运算下保持不变。- 特征值关系&#xff1a;一个方阵的迹等于其所有特…