南宁网站建设开发淘客免费交易网站建设
2026/6/11 4:33:26 网站建设 项目流程
南宁网站建设开发,淘客免费交易网站建设,莱芜新闻视频回放,图片转换成网址链接相关项目下载链接 训练框架 在开始实现相应模块功能之前#xff0c;首先熟悉训练框架train.py。 1. 导入与模型字典构建 import inspect import math from datetime import datetime from pathlib import Pathimport torch import ae, autoregressive, bsq # 自定义模型模…相关项目下载链接训练框架在开始实现相应模块功能之前首先熟悉训练框架·train.py。1. 导入与模型字典构建importinspectimportmathfromdatetimeimportdatetimefrompathlibimportPathimporttorchimportae,autoregressive,bsq# 自定义模型模块AE/BSQ/自回归# 收集ae/bsq模块中所有继承nn.Module的块级模型类patch_models{n:mforMin[ae,bsq]forn,mininspect.getmembers(M)ifinspect.isclass(m)andissubclass(m,torch.nn.Module)}# 收集autoregressive模块中所有继承nn.Module的自回归模型类ar_models{n:mforMin[autoregressive]forn,mininspect.getmembers(M)ifinspect.isclass(m)andissubclass(m,torch.nn.Module)}2. 核心训练函数 train()共包含三个部分块级模型训练器 PatchTrainer、自回归模型训练器 AutoregressiveTrainer、模型保存回调 CheckPointer。其中块级模型训练器 PatchTrainer专用于 AE/BSQ 模型。值得注意的是数据预处理过程图像归一化的方式是/255.0 - 0.5将像素值映射到[-0.5, 0.5]而不是[0,1]损失函数采用MSE均方误差适配图像重构任务优化器为AdamW学习率1e-3基于ImageDataset加载原始图像数据集。自回归模型训练器 AutoregressiveTrainer专用于 AR 模型。使用交叉熵损失适配令牌序列的分类预测任务基于TokenDataset加载令牌化后的图像序列优化器为AdamW学习率1e-3。模型保存回调 CheckPointer。模型保存的触发时机是在每个训练 epoch 结束后有两种保存方式一种是带时间戳的模型保存方式为checkpoints/{时间戳}_{模型名}.pth另一种是最新的模型保存路径为当前目录下的{模型名}.pth。此外还实现了模型加载 / 创建的逻辑。deftrain(model_name_or_path:str,epochs:int5,batch_size:int64):importlightningasLfromlightning.pytorch.loggersimportTensorBoardLoggerfromdataimportImageDataset,TokenDatasetclassPatchTrainer(L.LightningModule):def__init__(self,model):super().__init__()self.modelmodeldeftraining_step(self,x,batch_idx):xx.float()/255.0-0.5x_hat,additional_lossesself.model(x)losstorch.nn.functional.mse_loss(x_hat,x)self.log(train/loss,loss,prog_barTrue)fork,vinadditional_losses.items():self.log(ftrain/{k},v)returnlosssum(additional_losses.values())defvalidation_step(self,x,batch_idx):xx.float()/255.0-0.5withtorch.no_grad():x_hat,additional_lossesself.model(x)losstorch.nn.functional.mse_loss(x_hat,x)self.log(validation/loss,loss,prog_barTrue)fork,vinadditional_losses.items():self.log(fvalidation/{k},v)ifbatch_idx0:self.logger.experiment.add_images(input,(x[:64]0.5).clamp(min0,max1).permute(0,3,1,2),self.global_step)self.logger.experiment.add_images(prediction,(x_hat[:64]0.5).clamp(min0,max1).permute(0,3,1,2),self.global_step)returnlossdefconfigure_optimizers(self):returntorch.optim.AdamW(self.parameters(),lr1e-3)deftrain_dataloader(self):datasetImageDataset(train)returntorch.utils.data.DataLoader(dataset,batch_sizebatch_size,num_workers4,shuffleTrue)defval_dataloader(self):datasetImageDataset(valid)returntorch.utils.data.DataLoader(dataset,batch_size4096,num_workers4,shuffleTrue)classAutoregressiveTrainer(L.LightningModule):def__init__(self,model):super().__init__()self.modelmodeldeftraining_step(self,x,batch_idx):x_hat,additional_lossesself.model(x)loss(torch.nn.functional.cross_entropy(x_hat.view(-1,x_hat.shape[-1]),x.view(-1),reductionsum)/math.log(2)/x.shape[0])self.log(train/loss,loss,prog_barTrue)fork,vinadditional_losses.items():self.log(ftrain/{k},v)returnlosssum(additional_losses.values())defvalidation_step(self,x,batch_idx):withtorch.no_grad():x_hat,additional_lossesself.model(x)loss(torch.nn.functional.cross_entropy(x_hat.view(-1,x_hat.shape[-1]),x.view(-1),reductionsum)/math.log(2)/x.shape[0])self.log(validation/loss,loss,prog_barTrue)fork,vinadditional_losses.items():self.log(fvalidation/{k},v)returnlossdefconfigure_optimizers(self):returntorch.optim.AdamW(self.parameters(),lr1e-3)deftrain_dataloader(self):datasetTokenDataset(train)returntorch.utils.data.DataLoader(dataset,batch_sizebatch_size,num_workers4,shuffleTrue)defval_dataloader(self):datasetTokenDataset(valid)returntorch.utils.data.DataLoader(dataset,batch_sizebatch_size,num_workers4,shuffleTrue)classCheckPointer(L.Callback):defon_train_epoch_end(self,trainer,pl_module):fnPath(fcheckpoints/{timestamp}_{model_name}.pth)fn.parent.mkdir(exist_okTrue,parentsTrue)torch.save(model,fn)torch.save(model,Path(__file__).parent/f{model_name}.pth)# Load or create the modelifPath(model_name_or_path).exists():modeltorch.load(model_name_or_path,weights_onlyFalse)model_namemodel.__class__.__name__else:model_namemodel_name_or_pathifmodel_nameinpatch_models:modelpatch_models[model_name]()elifmodel_nameinar_models:modelar_models[model_name]()else:raiseValueError(fUnknown model:{model_name})# Create the lightning modelifisinstance(model,(autoregressive.Autoregressive)):l_modelAutoregressiveTrainer(model)else:l_modelPatchTrainer(model)timestampdatetime.now().strftime(%Y-%m-%d_%H-%M-%S)loggerTensorBoardLogger(logs,namef{timestamp}_{model_name})trainerL.Trainer(max_epochsepochs,loggerlogger,callbacks[CheckPointer()])trainer.fit(modell_model,)3. 命令行启动本项目借助fire库实现命令行参数解析无需手动解析--epochs/--batch_size等参数直接通过python train.py {模型名} --epochs 10启动训练。if__name____main__:fromfireimportFire Fire(train)train.py核心使用方法如下# 训练块级自编码器python train.py PatchAutoEncoder--epochs5--batch_size64# 训练自回归模型python train.py AutoregressiveModel--epochs10--batch_size32# 加载已有模型续训python train.py checkpoints/2025-10-20_PatchAutoEncoder.pth--epochs10加载数据接下来熟悉这个项目是如何进行数据加载的data.py模块定义两类 PyTorch 兼容的数据集类。其中ImageDataset加载原始 JPG 图像提供缓存机制提升读取效率TokenDataset加载令牌化后的图像张量由tokenize.py生成供自回归模型训练使用。。1. 导入依赖库frompathlibimportPathimporttorchfromPILimportImage# 自动定位数据集根目录当前文件的父父目录下的data文件夹DATASET_PATHPath(__file__).parent.parent/data2. ImageDataset原始图像数据集classImageDataset:def__init__(self,split:str,cache_images:boolTrue):# 收集splittrain/valid目录下所有.jpg文件路径self.image_pathslist((DATASET_PATH/split).rglob(*.jpg))# 初始化图像缓存列表避免重复读取磁盘self._image_cache[None]*len(self.image_paths)self._cache_imagescache_images# 是否开启缓存def__len__(self)-int:returnlen(self.image_paths)# 数据集总长度def__getitem__(self,idx:int)-torch.Tensor:# 优先读取缓存无缓存则加载图像ifself._image_cache[idx]isnotNone:returnself._image_cache[idx]# 图像加载PIL打开→转numpy数组→转torch.uint8张量保持原始像素值imgtorch.tensor(np.array(Image.open(self.image_paths[idx])),dtypetorch.uint8)# 开启缓存则存入后续复用ifself._cache_images:self._image_cache[idx]imgreturnimg3. TokenDataset令牌化数据集classTokenDataset(torch.utils.data.TensorDataset):def__init__(self,split:str):# 加载令牌化后的张量文件由tokenize.py生成tensor_pathDATASET_PATH/ftokenized_{split}.pthifnottensor_path.exists():# 文件不存在时给出明确提示符合作业流程指引raiseFileNotFoundError(fTokenized dataset not found at{tensor_path}...)self.datatorch.load(tensor_path,weights_onlyFalse)def__getitem__(self,idx:int)-torch.Tensor:# 返回长整型张量适配自回归模型的离散令牌输入returntorch.tensor(self.data[idx],dtypetorch.long)def__len__(self)-int:returnlen(self.data)这两个数据集加载对象的使用方法如下所示# 加载训练集原始图像用于AE/BSQ训练fromdataimportImageDataset,TokenDataset train_img_dsImageDataset(train,cache_imagesTrue)img_tensortrain_img_ds[0]# 取第0张图像shape: (H, W, 3)# 加载训练集令牌数据用于自回归模型训练train_token_dsTokenDataset(train)token_tensortrain_token_ds[0]# 取第0个令牌序列shape: (序列长度,)# 配合DataLoader使用fromtorch.utils.dataimportDataLoader train_loaderDataLoader(train_token_ds,batch_size64,shuffleTrue)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询