像 Keras 一样优雅地使用 pytorch-lightning

Pytorch-Lightning中的训练器—Trainer Pytorch-Lightning中训练器Trainer用法 阅读详情

你好,我是云哥。本篇文章为大家介绍一个可以帮助大家优雅地进行深度学习研究的工具:pytorch-lightning。

公众号后台回复关键字:源码,获取本文源代码!

pytorch-lightning 是建立在pytorch之上的高层次模型接口,pytorch-lightning之于pytorch,就如同keras之于tensorflow。

关于pytorch-lightning的完整入门介绍,可以参考我的另外一篇文章。

使用pytorch-lightning漂亮地进行深度学习研究

我用了约80行代码对 pytorch-lightning 做了进一步封装,使得对它不熟悉的用户可以用类似Keras的风格使用它,轻而易举地实现如下功能:

  • 模型训练(cpu,gpu,多GPU)

  • 模型评估 (自定义评估指标)

  • 最优模型参数保存(ModelCheckPoint)

  • 自定义学习率 (lr_schedule)

  • 画出优美的Loss和Metric曲线

它甚至会比Keras还要更加简单和好用一些。

这个封装的类 LightModel 添加到了我的开源仓库 torchkeras 中,用户可以用pip进行安装。

pip install -U torchkeras

以下是一个通过LightModel使用DNN模型进行二分类的完整范例。

在本例的最后,云哥将向大家表演一个"金蝉脱壳"的绝技。不要离开。????????

import numpy as np 
import pandas as pd 
from matplotlib import pyplot as plt
import torch
from torch import nn
import torch.nn.functional as F
from torch.utils.data import Dataset,DataLoader,TensorDataset
import datetime

#attention these two lines
import pytorch_lightning as pl 
import torchkeras 

一,准备数据

%matplotlib inline
%config InlineBackend.figure_format = 'svg'

#number of samples
n_positive,n_negative = 2000,2000

#positive samples
r_p = 5.0 + torch.normal(0.0,1.0,size = [n_positive,1]) 
theta_p = 2*np.pi*torch.rand([n_positive,1])
Xp = torch.cat([r_p*torch.cos(theta_p),r_p*torch.sin(theta_p)],axis = 1)
Yp = torch.ones_like(r_p)

#negative samples
r_n = 8.0 + torch.normal(0.0,1.0,size = [n_negative,1]) 
theta_n = 2*np.pi*torch.rand([n_negative,1])
Xn = torch.cat([r_n*torch.cos(theta_n),r_n*torch.sin(theta_n)],axis = 1)
Yn = torch.zeros_like(r_n)

#concat positive and negative samples
X = torch.cat([Xp,Xn],axis = 0)
Y = torch.cat([Yp,Yn],axis = 0)


#visual samples
plt.figure(figsize = (6,6))
plt.scatter(Xp[:,0],Xp[:,1],c = "r")
plt.scatter(Xn[:,0],Xn[:,1],c = "g")
plt.legend(["positive","negative"]);


# split samples into train and valid data.
ds = TensorDataset(X,Y)
ds_train,ds_valid = torch.utils.data.random_split(ds,[int(len(ds)*0.7),len(ds)-int(len(ds)*0.7)])
dl_train = DataLoader(ds_train,batch_size = 100,shuffle=True,num_workers=4)
dl_valid = DataLoader(ds_valid,batch_size = 100,num_workers=4)

二,定义模型

#define the network like torch
class Net(nn.Module):  
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(2,6)
        self.fc2 = nn.Linear(6,12) 
        self.fc3 = nn.Linear(12,1)
        
    def forward(self,x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        y = nn.Sigmoid()(self.fc3(x))
        return y       
class Model(torchkeras.LightModel):
    def shared_step(self,batch):
        x, y = batch
        prediction = self(x)
        loss = nn.BCELoss()(prediction,y)
        preds = torch.where(prediction>0.5,torch.ones_like(prediction),torch.zeros_like(prediction))
        acc = pl.metrics.functional.accuracy(preds, y)
        # attention: there must be a key of "loss" in the returned dict 
        dic = {"loss":loss,"acc":acc} 
        return dic
    
    #optimizer,and optional lr_scheduler
    def configure_optimizers(self):
        optimizer = torch.optim.Adam(self.parameters(), lr=1e-2)
        lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.0001)
        return {"optimizer":optimizer,"lr_scheduler":lr_scheduler}
 

注意,下面我们把网络结构net包装在一个model的壳之中。????????

pl.seed_everything(123)

# we wrap the network into a Model 
net = Net()
model = Model(net)

torchkeras.summary(model,input_shape =(2,))

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Linear-1                    [-1, 4]              12
            Linear-2                    [-1, 8]              40
            Linear-3                    [-1, 1]               9
================================================================
Total params: 61
Trainable params: 61
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.000008
Forward/backward pass size (MB): 0.000099
Params size (MB): 0.000233
Estimated Total Size (MB): 0.000340
----------------------------------------------------------------

三,训练模型


ckpt_callback = pl.callbacks.ModelCheckpoint(
    monitor='val_loss',
    save_top_k=1,
    mode='min'
)

# gpus=0 则使用cpu训练,gpus=1则使用1个gpu训练,gpus=2则使用2个gpu训练,gpus=-1则使用所有gpu训练,
# gpus=[0,1]则指定使用0号和1号gpu训练, gpus="0,1,2,3"则使用0,1,2,3号gpu训练
# tpus=1 则使用1个tpu训练

trainer = pl.Trainer(max_epochs=10,gpus=0,callbacks = [ckpt_callback]) 

#断点续训
#trainer = pl.Trainer(resume_from_checkpoint='./lightning_logs/version_31/checkpoints/epoch=02-val_loss=0.05.ckpt')

trainer.fit(model,dl_train,dl_valid)
GPU available: False, used: False
TPU available: None, using: 0 TPU cores

  | Name | Type | Params
------------------------------
0 | net  | Net  | 115   
------------------------------
115       Trainable params
0         Non-trainable params
115       Total params

================================================================================2021-01-24 20:47:39
epoch =  0
{'val_loss': 0.6492899060249329, 'val_acc': 0.6033333539962769}
{'acc': 0.5374999642372131, 'loss': 0.6766871809959412}

================================================================================2021-01-24 20:47:40
epoch =  1
{'val_loss': 0.5390750765800476, 'val_acc': 0.763333261013031}
{'acc': 0.676428496837616, 'loss': 0.5993633270263672}

================================================================================2021-01-24 20:47:41
epoch =  2
{'val_loss': 0.3617284595966339, 'val_acc': 0.8608333468437195}
{'acc': 0.8050000071525574, 'loss': 0.4533742070198059}

================================================================================2021-01-24 20:47:42
epoch =  3
{'val_loss': 0.21798092126846313, 'val_acc': 0.9158334732055664}
{'acc': 0.8910714387893677, 'loss': 0.28334707021713257}

================================================================================2021-01-24 20:47:43
epoch =  4
{'val_loss': 0.18157465755939484, 'val_acc': 0.9208333492279053}
{'acc': 0.926428496837616, 'loss': 0.20261192321777344}

================================================================================2021-01-24 20:47:44
epoch =  5
{'val_loss': 0.17406059801578522, 'val_acc': 0.9300000071525574}
{'acc': 0.9203571677207947, 'loss': 0.1980973333120346}

================================================================================2021-01-24 20:47:45
epoch =  6
{'val_loss': 0.16323940455913544, 'val_acc': 0.935833215713501}
{'acc': 0.9242857694625854, 'loss': 0.1862144023180008}

================================================================================2021-01-24 20:47:46
epoch =  7
{'val_loss': 0.16635416448116302, 'val_acc': 0.9300000071525574}
{'acc': 0.925000011920929, 'loss': 0.18595384061336517}

================================================================================2021-01-24 20:47:47
epoch =  8
{'val_loss': 0.1665605753660202, 'val_acc': 0.9258332848548889}
{'acc': 0.9267856478691101, 'loss': 0.18308643996715546}

================================================================================2021-01-24 20:47:48
epoch =  9
{'val_loss': 0.1757962554693222, 'val_acc': 0.9300000071525574}
{'acc': 0.9246429204940796, 'loss': 0.18282662332057953}
# visual the results
fig, (ax1,ax2) = plt.subplots(nrows=1,ncols=2,figsize = (12,5))
ax1.scatter(Xp[:,0],Xp[:,1], c="r")
ax1.scatter(Xn[:,0],Xn[:,1],c = "g")
ax1.legend(["positive","negative"]);
ax1.set_title("y_true")

Xp_pred = X[torch.squeeze(model.forward(X)>=0.5)]
Xn_pred = X[torch.squeeze(model.forward(X)<0.5)]

ax2.scatter(Xp_pred[:,0],Xp_pred[:,1],c = "r")
ax2.scatter(Xn_pred[:,0],Xn_pred[:,1],c = "g")
ax2.legend(["positive","negative"]);
ax2.set_title("y_pred")

四,评估模型

import pandas as pd 

history = model.history
dfhistory = pd.DataFrame(history) 
dfhistory 
%matplotlib inline
%config InlineBackend.figure_format = 'svg'

import matplotlib.pyplot as plt

def plot_metric(dfhistory, metric):
    train_metrics = dfhistory[metric]
    val_metrics = dfhistory['val_'+metric]
    epochs = range(1, len(train_metrics) + 1)
    plt.plot(epochs, train_metrics, 'bo--')
    plt.plot(epochs, val_metrics, 'ro-')
    plt.title('Training and validation '+ metric)
    plt.xlabel("Epochs")
    plt.ylabel(metric)
    plt.legend(["train_"+metric, 'val_'+metric])
    plt.show()
    
plot_metric(dfhistory,"loss")

plot_metric(dfhistory,"acc")


results = trainer.test(model, test_dataloaders=dl_valid, verbose = False)
print(results[0])

{'test_loss': 0.15939873456954956, 'test_acc': 0.9599999785423279}

五,使用模型

def predict(model,dl):
    model.eval()
    result = torch.cat([model.forward(t[0].to(model.device)) for t in dl])
    return(result.data)

result = predict(model,dl_valid)

result 
tensor([[9.8850e-01],
        [2.3642e-03],
        [1.2128e-04],
        ...,
        [9.9002e-01],
        [9.6689e-01],
        [1.5238e-02]])

六,保存模型

最优模型默认保存在 trainer.checkpoint_callback.best_model_path 的目录下,可以直接加载。

print(trainer.checkpoint_callback.best_model_path)
print(trainer.checkpoint_callback.best_model_score)
model_clone = Model.load_from_checkpoint(trainer.checkpoint_callback.best_model_path)
trainer_clone = pl.Trainer(max_epochs=10) 
results = trainer_clone.test(model_clone, test_dataloaders=dl_valid, verbose = False)
print(results[0])

{'test_loss': 0.20505842566490173, 'test_acc': 0.9399999976158142}

最后,给大家表演一个金蝉脱壳的绝技。????????

使用LightModel之壳训练后,可丢弃该躯壳,直接手动保存最优的网络结构net的权重。

best_net = model.net 
torch.save(best_net.state_dict(),"best_net.pt")

#加载权重
net_clone = Net()
net_clone.load_state_dict(torch.load("best_net.pt"))


data,label = next(iter(dl_valid))
with torch.no_grad():
    preds  = model(data)
    preds_clone = net_clone(data)
    
print("model prediction:\n",preds[0:10],"\n")
print("net_clone prediction:\n",preds_clone[0:10])

model prediction:
 tensor([[9.8850e-01],
        [2.3642e-03],
        [1.2128e-04],
        [1.0022e-04],
        [9.3577e-01],
        [4.9769e-02],
        [9.8537e-01],
        [9.9940e-01],
        [4.1117e-04],
        [9.4009e-01]]) 

net_clone prediction:
 tensor([[9.8850e-01],
        [2.3642e-03],
        [1.2128e-04],
        [1.0022e-04],
        [9.3577e-01],
        [4.9769e-02],
        [9.8537e-01],
        [9.9940e-01],
        [4.1117e-04],
        [9.4009e-01]])

以上。

如果对本文内容理解上有需要进一步和作者交流的地方,欢迎在公众号"算法美食屋"下留言。作者时间和精力有限,会酌情予以回复。

也可以在公众号后台回复关键字:加群,加入读者交流群和大家讨论。

原创不易,不想被白嫖。欢迎大家三连支持云哥????????:点赞,在看,分享。感谢。

pytorch-lightning遇到ModelCheckpoint不能保存模型 以上代码就是不能保存模型,很奇怪,其中#后面的各种修改也不能实现save model的作用。最后不得不手动保存。也挺简单的 ##是mvsNerf代码。目前实现的ModelCheckpoint如下。 阅读详情

相关推荐

机器学习——lightGBM(学习整理)

LightGBM 是 微软的 一个团队 在 Github 上开发的一个 开源项目,高性能 的 LightGBM 算法具有分布式 和 可以 快速处理大量数据的 特点。LightGBM 虽然 基于 决策树和 XGBoost 而生,但它 还遵循 其他不同的 策略。XGBoost 使用决策树 对一个 变量进行 拆分,并在 该变量上 探索不同的 切割点(按级别划分的 树生长策略),而LightGBM 则 专注于 按叶子节点 进行拆分,以便 获得更好的 拟合(按叶划分的树生长策略)。

CXDNW的博客 4859

pytorch lightning 按照频率/epoch/step保存模型或checkpoint

利用 **every_n_train_steps 、train_time_interval 、every_n_epochs **设置保存 checkpoint 的按照步数、时间、epoch数来保存 checkpoints 或模型,注意三者互斥,如果要同时实现对应的功能需要创建多个 MODELCHECKPOINT。在训练深度神经网络时,如果训练时间较长,我们通常希望在训练过程中定期保存模型的参数,以便稍后从该点恢复训练或进行推理。只能设置为 -1,0,1,分别表示保存所有的模型,不保存模型和保存最后一个模型。

qcwlmqy的博客 9906

2022年AI Python框架实战选型指南:PyTorch、TF、JAX、HF与Lightning深度对比

深度学习框架是AI工程落地的核心基础设施,其选型直接决定开发效率、部署稳定性与团队协作成本。从计算图机制(动态图vs静态图)、分布式训练支持、模型导出标准(SavedModel/TorchScript/ONNX)到高层抽象能力(Trainer/Pipeline),不同框架在可调试性、工业闭环性、数学表达力和开箱即用性上各具优势。PyTorch以动态图和Python原生体验主导研究与快速迭代场景;TensorFlow凭借SavedModel和TF Serving构建端到端生产链路;JAX以函数式范式和XLA编

468

torch lighting 保存最优模型和最后模型

torch lighting 保存最优模型和最后模型

WGS. 1694

PyTorch Lightning工程化实践:工业时序故障识别落地指南

神经网络不是数学推导的终点,而是工程落地的起点。本文围绕Python神经网络在真实工业场景中的可复现训练流程展开,深入解析模型构建、数据管道、训练稳定性与边缘部署四大核心环节。基于PyTorch Lightning框架,系统阐述如何应对小样本(237条)、低算力(GTX 1060/树莓派)、强噪声、类别极度不平衡等典型工程约束;重点揭示CNN+LSTM混合架构的设计权衡、Focal Loss对长尾故障类的鲁棒提升、DataModule作为数据免疫系统的分层抽样与在线增强机制,以及ONNX跨平台导出与轻量推理

weixin_33850015的博客 431

深度学习框架PyTorch、TensorFlow、JAX核心API对比与迁移指南

深度学习框架选型,关键是理解核心 API 设计差异。PyTorch、TensorFlow、JAX 分别代表动态图、工程链路与函数式变换三种范式:PyTorch 的 nn.Module 和 autograd 让模型定义与自动求导更顺手;TensorFlow 借 Keras、tf.data、SavedModel 打通训练与部署链路;JAX 用 grad、jit、vmap 把模型抽象为纯函数,适合大规模并行。理解自动求导方式、数据管道和序列化机制,可有效评估跨框架迁移成本。在快速原型验证、生产服务化、大规模并行等

weixin_30580341的博客 477

深度学习框架对比:TensorFlow、PyTorch与Keras核心特性解析

深度学习框架作为构建神经网络的核心工具,通过抽象底层计算实现了高效的模型开发。TensorFlow以其工业级部署能力著称,特别适合生产环境;PyTorch凭借动态计算图在研究中占据主导地位;而Keras则以极简API成为快速原型设计的首选。理解这些框架的设计原理和适用场景,对于优化AI项目的开发流程至关重要。在实际应用中,根据项目需求选择合适的框架组合(如Keras+TensorFlow),并利用ONNX等工具实现跨框架协作,能够显著提升开发效率。特别是在处理计算机视觉和自然语言处理任务时,合理选择框架可以

weixin_30932215的博客 467

深度学习框架对比:PyTorch与TensorFlow核心技术解析

深度学习框架作为神经网络开发的核心工具,通过计算图抽象实现高效的模型构建与训练。其核心原理是将数学运算节点化,利用GPU并行计算加速。主流框架如PyTorch采用动态计算图机制,支持灵活调试;TensorFlow则侧重工业级部署,提供完整的生产工具链。在技术价值上,框架优化包括算子融合、内存复用等技巧,显著提升训练效率。应用场景覆盖学术研究到工业部署,PyTorch适合快速原型设计,TensorFlow在服务化部署中表现突出。本文重点解析PyTorch与TensorFlow的核心技术差异及选型策略,帮助开发

dianchamian8747的博客 383

别再手动存数组了!用TensorFlow和PyTorch的Callback/钩子自动绘制Loss/Acc曲线(附完整代码)

本文介绍了如何利用TensorFlow和PyTorch的Callback/钩子机制自动绘制Loss和Accuracy曲线,告别手动记录数组的低效方式。通过详细代码示例和实战指南,帮助开发者提升深度学习训练监控效率,实现更优雅的模型训练流程。

weixin_42537499的博客 158

PyTorch、TensorFlow、JAX、MindSpore深度学习框架核心对比与选型指南

在深度学习领域,计算图是模型训练与推理的核心抽象概念,它定义了数据(张量)与运算(算子)之间的依赖关系。根据构建和执行时机的不同,计算图主要分为静态计算图和动态计算图两种范式,这直接影响了框架的编程体验、调试便利性和运行时性能。理解计算图的原理,有助于开发者选择更高效的模型开发工具,从而在学术研究、工业部署等不同场景下优化工作流程。动态计算图支持即时执行与直观调试,极大地提升了研究迭代速度;而静态计算图则便于进行全局优化,常在生产部署中追求极致性能。随着生态发展,主流框架如PyTorch和TensorFlo

weixin_30480075的博客 375

AI工程化实战指南:从Stable Diffusion微调到版权合规落地

AI生成技术已跨越‘能跑通’阶段,进入以可控性、可解释性、可部署性与权责边界为核心的工程化深水区。理解Stable Diffusion细调(如LoRA微调)、TensorFlow/Keras高效实现、版权归属争议等关键议题,本质是掌握模型轻量化适配、端侧部署优化与合规风险规避的系统能力。这些能力直接决定AI能否在电商图像增强、工业质检、教育动画等真实场景中稳定交付。本文聚焦2022年Q3–Q4技术演进主线,结合ECCV前沿论文、Keras Tuner超参优化、NeuralMarker等鲁棒性方案,提供从Ne

vanadiumlin 423

Keras生产实战:从训练监控到SavedModel部署的全链路避坑指南

Keras作为TensorFlow高阶API,本质是将深度学习数学原理封装为可调试的Python对象,其核心价值不在快速建模,而在工程可控性。理解model.compile背后的优化器状态管理、tf.data管道的I/O与CPU并行协同机制、Functional API提供的层级探针能力,是实现稳定训练与低延迟推理的前提。技术价值体现在对显存泄漏、梯度异常、序列化失效等高频故障的主动防控能力,广泛应用于电商CTR预测、金融风控、实时推荐等强SLA场景。本文聚焦Keras在真实业务中从数据加载、模型调试、训练

weixin_34326429的博客 319

别再只当代码阅读器了!手把手教你用Understand的实体定位器和信息浏览器,5分钟精准定位代码逻辑

本文深入解析Understand代码分析工具的高级功能,重点介绍实体定位器和信息浏览器的实战应用。通过5分钟快速定位代码逻辑的技巧,帮助开发者从代码阅读者升级为逻辑侦探,提升大型代码库的分析效率。文章包含过滤搜索、调用链追踪等实用方法,是掌握Understand核心功能的必备指南。

weixin_28745821的博客 293

TensorFlow与PyTorch对比:从动态图到部署选型指南

深度学习框架是AI工程实践的基石,TensorFlow与PyTorch作为两大主流选择,分别代表了静态图与动态图的底层设计哲学。自动求导机制、张量运算与模型训练循环的核心原理,决定了它们在调试体验、部署生态和应用场景上的显著差异。理解这两种框架的编程模型,有助于开发者在学术研究、工业落地与入门学习中做出更合理的选型。本文从环境搭建、实战代码、训练调试、生产部署等维度展开对比,并给出常见问题排查与行动清单,帮助读者根据项目需求权衡开发便利性与部署性能上限,最终形成适合自己的技术路径。

weixin_33796205的博客 403

应广单片机 按键点灯 PMS171B GPIO LED

我也是第一次使用这款单片机,参考网友的资料,写个最近简单的demo 测试用例 #include "extern.h" /*端口定义*/ BIT KEY : PA.0; BIT SW : PA.4; /*相应于main函数*/ void FPPA0 (void) { /*单片机内部RC震动时钟为 IHRC默认为16M,因此,IHRC/2=8M,系统时钟为8M*/ .ADJUST_IC...

大江的专栏 1002

MiniOSD DIY记

最近迷上了航模,研究了很多东西,感觉路走的长了还是适当要停下脚步休息下总结下。 这次DIY的是一块OSD设备,主要用于航模图传的叠加显示,原理也很简单就是atmel atmega328p+MAX7456芯片,网上卖的成品基本上都是一个原理图。 原理图 我按照我自己的需要做了适当的更改,去掉了DC-DC电路,直接用5V输入,因为摄像头都是5V的,所以DC-DC不是很有必要,体积上更加小了点, 打...

memoff的博客 8539

PyTorch、TensorFlow与JAX:从设计哲学到生产部署的深度对比

在深度学习领域,计算图是模型训练与推理的核心抽象,其执行模式直接决定了开发体验与系统性能。动态图(Eager Execution)与静态图(Graph Mode)是两种根本性的设计哲学,前者支持即时执行与灵活调试,便于研究实验;后者允许编译期全局优化,利于生产部署。理解这一原理,有助于把握不同框架的技术价值:PyTorch以动态图起家,为研究提供了直观的交互环境;TensorFlow凭借成熟的静态图生态,构建了强大的生产化工具链;而JAX则基于函数式编程,通过可组合的变换追求极致的性能与并行效率。这些差异最

weixin_34067102的博客 399

4G+GNSS定位模块DX-CT511N-B:AT指令实战与多协议通信指南

本文详细介绍了4G+GNSS定位模块DX-CT511N-B的AT指令实战应用与多协议通信配置。内容涵盖TCP/UDP通信、MQTT协议集成、HTTP服务交互以及GNSS定位功能的深度解析,为开发者提供从基础指令到高级调试的完整指南,助力物联网设备开发。

hope8的博客 290

AI Python框架选型实战指南:从训练到部署的工程化决策

AI Python编程框架是机器学习工程化落地的核心载体,其本质是模型训练、导出、服务化与运维能力的系统集成。理解框架底层原理,关键在于把握模型服务部署的稳定性、GPU资源调度效率及跨平台兼容性等工程约束。技术价值不仅体现在开发速度,更在于降低线上故障率、缩短迭代周期、保障服务SLA。典型应用场景包括电商图像分类、NLP情感分析、设备故障预测及轻量API服务等,需结合团队能力、基础设施与业务指标综合权衡。本文聚焦2022年生产环境验证的五套主流方案,覆盖PyTorch生态与TensorFlow生产适配两大技

weixin_30800807的博客 449

基于Simulink的异步电机参数在线辨识与自适应控制仿真

本文基于Simulink平台,详细介绍了异步电机参数在线辨识与自适应控制系统的仿真实现。针对异步电机运行中参数时变问题,采用模型参考自适应系统(MRAS)实时辨识转子电阻和互感,并结合自适应PI控制策略动态调整控制器参数。通过搭建完整的矢量控制(FOC)仿真模型,验证了系统在稳态辨识、参数摄动和动态响应等工况下的性能:参数辨识误差<1.2%,转速跟踪误差<20rpm,动态响应时间<10ms。文章还提供了详细的Simulink建模步骤、核心代码实现及性能分析,为高级电机控制系统的设计与优化提

amy_mhd的博客 73

【Bluetooth|蓝牙开发】三、一篇文章,带你总览蓝牙协议

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

深度学习框架选型:PyTorch、TensorFlow、JAX七个核心API维度对比

深度学习框架是构建和训练神经网络的基础工具,不同框架在计算图构建、自动微分和参数管理上采用不同设计哲学,直接影响开发效率与部署流程。PyTorch以动态图和Python原生体验著称,TensorFlow强调高层封装与生产部署,JAX则基于函数式变换实现高性能计算。理解这些核心差异,有助于根据项目需求进行框架选型与代码迁移。从张量创建、自动微分、模型构建、训练循环、数据加载、设备管理等关键API维度出发,对三大主流框架进行横向对比,揭示各自的设计逻辑与适用场景,为开发者提供清晰的选型参考。

weixin_33885676的博客 306

使用FSL对DTI数据进行预处理

在fsl官网我们可以看到是同时使用了AP和PA图像处理,采用的是最小二乘法将2个图像合并为1个图像。–inindex此处需要处理的是PA图像,在acq_param.txt中我们是把这个放在第一行的,此处为1,如果处理的是AP图像,则此处为2。为了校正磁场引起的畸变,对DTI的B0像分别采集了A>P和P>A的反向编码的两种B0像。即如果AP和PA只有1个B0像时,那么这里就是两行,如果各有3个B0像则这里应该是6行。假设转换后的图像为sub01_AP.nii.gz和sub01_PA.nii.gz。

weixin_52073820的博客 4842

PyTorch Wrapper:轻量封装实现可复现、可扩展的模型训练

在深度学习工程实践中,PyTorch 原生训练循环虽灵活却重复冗余,导致可复现性差、迭代效率低。其核心原理在于解耦模型定义与训练基础设施——通过轻量级封装统一管理设备调度、混合精度(AMP)、梯度裁剪、分布式训练(DDP)及钩子机制,既保留 nn.Module 的完全控制权,又提供类似 Keras 的声明式体验。该方案显著提升实验可维护性与跨团队协作效率,适用于医疗影像分割、工业质检等需快速验证模型变体的生产场景;尤其适合从 TensorFlow 转型的工程师、算法研究者及技术负责人构建标准化训练基座。

diche7031的博客 399

2024年ERP管理系统职业技能大赛软件测试赛项-测试报告

【说明本次测试的最终测试结果总结、测试过程中遇到的重要问题以及如何解决、被测系统的质量结论、个人的收获以及团队的得失等】【说明编写本测试报告的目的和实际读者】【说明本次测试实际人员安排及主要职责】【说明本次测试使用的测试用例设计方法】【说明本次测试使用的测试方法】【针对本次测试进行Bug汇总】【针对本次测试进行用例汇总】【说明本项目的背景情况】【说明本次测试的实际。

Code is fun. 790

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

PyTorch深度学习入门:从环境搭建到第一个神经网络实战

深度学习框架是构建和训练人工智能模型的核心工具,其通过提供自动微分、张量计算等基础能力,极大地简化了模型开发流程。PyTorch作为当前主流框架之一,以其动态计算图和直观的Pythonic设计著称,显著提升了模型研究、调试和部署的效率。其技术价值在于为学术研究和工业应用提供了统一的、灵活的编程范式。在计算机视觉、自然语言处理等应用场景中,PyTorch能高效支撑从原型验证到生产部署的全流程。本文以**环境搭建**和**MNIST手写数字分类**为例,详细解析了如何利用PyTorch的**动态计算图**机制,

a359798678的博客 442

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 使用pytorch-lightning漂亮地进行深度学习研究
下一篇: 30分钟学会shapely空间几何分析
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值