ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

pyprobml 实战:用更少的标注样本训练图像模型(第 19 章:数据增强、预训练与微调全解析)

pyprobml 实战:用更少的标注样本训练图像模型(第 19 章:数据增强、预训练与微调全解析) 机器学习深度学习【免费下载链接】pyprobmlPython code for Probabilistic Machine learning book by Kevin Murphy项目地址https://gitcode.com/gh_mirrors/py/pyprobml点击查看免费下载本篇技术指南以 pyprobml 仓库 notebooks/book1/19/README.md 为骨架完整解析《Probabilistic Machine Learning》第 19 章 Learning with fewer labeled examples用更少的标注样本学习对应的全部可复现实战 Notebook。你将掌握三条最实用的少样本学习路线图像数据增强PyTorchtorchvision.transforms与 JAXaugmax双实现、直接使用 ImageNet 预训练 CNN 做迁移推理ResNet-101、以及对预训练 ResNet-18 进行微调实现一个 热狗 vs 非热狗 二分类器并理解分层贝叶斯 MAML 概率图模型的绘图脚本。读完即可在本仓库目录下直接打开 Notebook 逐段运行。一、章节背景为什么更少的标注样本值得专门一章深度模型通常依赖大规模标注数据但在医疗影像、长尾分类、冷启动推荐等真实场景中标注样本往往稀缺且昂贵。第 19 章的主题就是用各种手段把少量标注的效率放大。本仓库notebooks/book1/19/目录给出了该章图 19.1–19.16 的可复现映射以及三份补充材料全部围绕以下技术路线展开| 路线 | 核心思想 | 仓库对应 Notebook | | -- | -- | -- | | 数据增强 | 用随机变换扩大训练分布、抑制过拟合 | image_augmentation_torch.ipynb、image_augmentation_jax.ipynb | | 迁移推理 | 直接复用 ImageNet 预训练模型提取特征 | pre_trained_image_classifier_torch.ipynb | | 微调 | 冻结/分层微调预训练骨干适配新任务 | finetune_cnn_torch.ipynb、finetune_cnn_jax.ipynb | | 概率图建模 | 分层贝叶斯视角下的 MAML 元学习 | hbayes_maml.ipynb |二、章节图表与 Notebook 的完整映射原 README 核心内容原 README 的图表映射表是本章的导航地图下文原样保留并补充了仓库内可用的 Notebook 链接| Figure No. | Notebook | 说明 | | -- | -- | -- | | 19.1 | image_augmentation_jax.ipynb | 图像增强 JAX 演示翻转 / 裁剪 / 颜色抖动 | | 19.2 – 19.13 | - | 图 19.2 至 19.13 在书中以静态图形式给出仓库未提供对应 Notebook | | 19.14 | hbayes_maml.ipynb | 分层贝叶斯 MAML 的概率图plate diagram | | 19.15 – 19.16 | - | 书中静态图无对应 Notebook |补充材料Supplementary material部分原 README 给出了三份 Colab 链接指向的 Notebook它们在仓库中均有本地副本可直接运行| 主题 | 软件栈 | 仓库路径 | | -- | -- | -- | | Image augmentation图像增强 | PyTorch | image_augmentation_torch.ipynb | | 使用 ImageNet 预训练 CNN 分类 | PyTorch | pre_trained_image_classifier_torch.ipynb | | 微调预训练 CNN 做热狗检测对应 D2L 13.2 | PyTorch | finetune_cnn_torch.ipynb |需要说明的是这些 Notebook 均基于 D2L动手学深度学习 第 13 章内容改编而来并在最后加入了 CIFAR-10 数据加载器等实操环节。图 19.2–19.13 及 19.15–19.16 对应的是书中的数学推导与静态示意图因此没有独立 Notebook这是章节编排的既定设计并非缺失。三、路线一图像数据增强——PyTorch 版torchvision.transforms3.1 准备工作与可视化辅助函数PyTorch 版 Notebook 在启动时会创建figures目录、下载示例图片cat_dog.jpg并拉取 D2L 的工具模块d2l.py用于绘图。核心可视化逻辑是show_images与apply两个函数因为数据增强是随机的所以对同一张图反复施加变换多次把结果并排展示就能直观看到同一图像被随机扰动成什么样def show_images(imgs, num_rows, num_cols, titlesNone, scale1.5): Plot a list of images. figsize (num_cols * scale, num_rows * scale) fig, axes d2l.plt.subplots(num_rows, num_cols, figsizefigsize) axes axes.flatten() for i, (ax, img) in enumerate(zip(axes, imgs)): if torch.is_tensor(img): ax.imshow(img.numpy()) # Tensor Image else: ax.imshow(img) # PIL Image ax.axes.get_xaxis().set_visible(False) ax.axes.get_yaxis().set_visible(False) if titles: ax.set_title(titles[i]) plt.tight_layout() return fig, axes def apply(img, aug, num_rows1, num_cols4, scale2): Y [aug(img) for _ in range(num_rows * num_cols)] fig, axes show_images(Y, num_rows, num_cols, scalescale) return fig, axesapply的核心是aug(img)反复调用torchvision.transforms中的每个增强对象既是可调用算子又是带随机性的变换器每次调用都会独立采样随机参数。3.2 翻转Flippingapply(img, torchvision.transforms.RandomHorizontalFlip()) apply(img, torchvision.transforms.RandomVerticalFlip())RandomHorizontalFlip/RandomVerticalFlip分别以 50% 概率对图像做水平/垂直镜像。对自然图像而言水平翻转通常不改变语义猫、狗、车都还是猫、狗、车因此是最常用、代价最低的增强手段。3.3 随机裁剪与缩放Crop and resizeshape_aug torchvision.transforms.RandomResizedCrop((200, 200), scale(0.1, 1), ratio(0.5, 2)) apply(img, shape_aug) shape_aug torchvision.transforms.RandomResizedCrop((200, 200), scale(0.5, 1), ratio(1, 1)) fig, axes apply(img, shape_aug) fig.savefig(dog_cat_augment.png)RandomResizedCrop的两个关键参数scale(0.1, 1)随机裁剪区域的面积占原图面积的 10%–100%让模型适应物体被部分遮挡或大小不一的情况ratio(0.5, 2)裁剪区域的宽高比在 0.5 到 2 之间随机选取模拟不同拍摄构图裁剪后统一Resize到(200, 200)输出。第二组参数scale(0.5, 1), ratio(1, 1)是更温和的配置面积 50%–100%、宽高比固定 1适合物体本身已占据画面大部分的场景。fig.savefig(dog_cat_augment.png)会把增强效果图落盘这正是书中图 19.1 的生成来源。3.4 颜色抖动Changing colorColorJitter可以独立控制亮度、对比度、饱和度、色相四个维度参数含义为相对于原值的扰动幅度即亮度从1-0.50.5倍到10.51.5倍之间随机变化# 只调亮度 apply(img, torchvision.transforms.ColorJitter(brightness0.5, contrast0, saturation0, hue0)) # 只调色相 apply(img, torchvision.transforms.ColorJitter(brightness0, contrast0, saturation0, hue0.5)) # 只调饱和度 apply(img, torchvision.transforms.ColorJitter(brightness0, contrast0, saturation0.5, hue0)) # 只调对比度 apply(img, torchvision.transforms.ColorJitter(brightness0, contrast0.5, saturation0, hue0)) # 四者全部随机抖动 color_aug torchvision.transforms.ColorJitter(brightness0.5, contrast0.5, saturation0.5, hue0.5) apply(img, color_aug)颜色增强的价值在于提升模型对光照、白平衡、显示器色偏的鲁棒性——这在自然场景数据中几乎是必选项。3.5 组合增强管线Compose多个变换通过Compose串联成一条确定性顺序的随机管线augs torchvision.transforms.Compose([torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug]) apply(img, augs)典型配置是先做几何变换翻转 随机裁剪缩放再做颜色变换最后存图fig.savefig(dog_cat_augment2.png)。3.6 把增强管线接入 DataLoaderCIFAR-10 实战Notebook 的最后一部分把增强用在了真实数据集上——这是整章最有工程价值的一段训练集用增强、测试集不用测试集只做ToTensor从而既扩大训练分布又保持评估口径一致train_augs torchvision.transforms.Compose( [torchvision.transforms.RandomHorizontalFlip(), torchvision.transforms.ToTensor()] ) test_augs torchvision.transforms.Compose([torchvision.transforms.ToTensor()]) def load_cifar10(is_train, augs, batch_size): dataset torchvision.datasets.CIFAR10(root../data, trainis_train, transformaugs, downloadTrue) dataloader torch.utils.data.DataLoader( dataset, batch_sizebatch_size, shuffleis_train, num_workersd2l.get_dataloader_workers() ) return dataloader train_iter load_cifar10(True, train_augs, 32) for i, (features, labels) in enumerate(train_iter): print(i) print(features.shape) # 期望输出形如 torch.Size([32, 3, 32, 32]) if i 1: break注意shuffleis_train训练集打乱、测试集不打乱配合num_workers并行读取增强在 DataLoader 内逐样本即时生效无需预先生成增强后的数据集。四、路线一JAX 版用 Augmax 做图像增强JAX 版 image_augmentation_jax.ipynb 与 PyTorch 版演示的是同一套增强概念但底层是 JAX 生态的图像增强框架AugmaxKonrad Heidler 开发以githttps://github.com/khdlr/augmax.git安装。Notebook 作者 Susnato Dhar 在开篇注明仅使用 TensorFlow 负责数据下载与 DataLoader其余全部使用 JAX。4.1 关键差异随机数显式传递JAX 强调函数式纯变换随机性必须通过显式的PRNGKey传入并不断分裂jax.random.split这是与 PyTorch隐式全局随机状态最大的不同seed 42 rng jax.random.PRNGKey(seed) def apply(img, aug, rng, num_rows2, num_cols2, scale3): Y [] for i in range(num_rows * num_cols): transformed_img aug(rng, img) Y.append(transformed_img) rng, subkey jrand.split(rng) # 每次调用分裂出新子密钥 show_images(Y, num_rows, num_cols, scalescale)4.2 Augmax 的增强算子与管线| Augmax 算子 | 对应 PyTorch 算子 | 说明 | | -- | -- | -- | |augmax.HorizontalFlip()|RandomHorizontalFlip| 水平翻转 | |augmax.VerticalFlip()|RandomVerticalFlip| 垂直翻转 | |augmax.RandomSizedCrop(h, w)augmax.Resize(200, 200)|RandomResizedCrop((200,200), ...)| 随机尺寸裁剪后统一缩放 | |augmax.ByteToFloat()augmax.ColorJitter(brightness..., hue...)|ColorJitter(...)| 先把 uint8 转 float再做颜色抖动 | |augmax.Chain(...)|transforms.Compose(...)| 组合多个增强 |一个值得注意的实现细节JAX 版做颜色抖动前必须先经过ByteToFloat()把uint8像素值转成浮点再Chain进ColorJitter因为颜色算子基于浮点数学运算。例如亮度抖动byte2float_transform augmax.ByteToFloat() brightness_transform augmax.ColorJitter(brightness0.5, contrast0, saturation0, hue0) byte2float_brightness_transform augmax.Chain(byte2float_transform, brightness_transform) apply(imgimg, augbyte2float_brightness_transform, rngrng)管线组合示例几何 翻转 颜色与 PyTorch 版Compose一一对应augs1 augmax.Chain(crop_and_resize_transform, h_flip_transform, byte2float_brightness_transform) augs2 augmax.Chain(h_flip_transform, v_flip_transform, byte2float_hue_transform)4.3 JAX 版 CIFAR-10tfds 加载 按 batch 增强JAX 版用tensorflow_datasets下载 CIFAR-10用tf.keras.utils.Sequence风格的 batch 划分再把每个 batch 转成jnp.array后逐样本施加增强train_augs augmax.Chain(augmax.HorizontalFlip()) test_augs augmax.Chain(augmax.HorizontalFlip()) def load_cifar10(batch_size): train_ds, test_ds tfds.load(cifar10, split[train, test], as_supervisedTrue) return train_ds.batch(batch_size), test_ds.batch(batch_size) train_ds, test_ds load_cifar10(64) for i, (features, labels) in enumerate(train_ds): features jnp.array([train_augs(rng, ef.numpy()) for ef in features]) print(features.shape) if i 1: break增强结果用skimage.util.montage拼成网格展示grid_shape(8, 8)的 64 张图拼板直观检验增强效果。五、路线二直接使用 ImageNet 预训练 CNN 做推理pre_trained_image_classifier_torch.ipynb 展示的是零训练的迁移推理加载在 ImageNet-1k1000 类上预训练好的 ResNet-101对任意图片输出 top-5 分类结果。5.1 加载模型与标准预处理管线from torchvision import models resnet models.resnet101(pretrainedTrue)紧接着定义 ImageNet 的标准预处理缩放 → 中心裁剪 → 转张量 → 用 ImageNet 的 RGB 均值/标准差做归一化。这三组均值/标准差是 ImageNet 训练时的统计量必须原样使用否则模型输出会严重退化from torchvision import transforms preprocess transforms.Compose( [ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ] )5.2 推理全流程img Image.open(img.jpg) # 下载的 cat_dog.jpg img_t preprocess(img) # PIL - Tensorshape 为 [3, 224, 224] batch_t torch.unsqueeze(img_t, 0) # 增加 batch 维 - [1, 3, 224, 224] resnet.eval() # 关键切到 eval 模式关闭 dropout/batchnorm 训练行为 out resnet(batch_t) # [1, 1000] 的 logits之后从仓库的data/imagenet_classes.txt读取 1000 个类别名用torch.sort(out, descendingTrue)取 top-5 索引映射回标签即可打印出猫 / 狗等最可能的类别及对应置信度。整个流程的要点是eval()模式不可省略它保证 BatchNorm 使用全局统计量而非 batch 统计量这是预训练模型推理最容易踩的坑。六、路线三微调 ResNet-18 做热狗 vs 非热狗检测finetune_cnn_torch.ipynb 是本章最完整的实战目标数据集只有 2 类hotdog / not-hotdog每类 1400 张训练图灵感来自美剧《硅谷》S4E4 的热狗检测器梗。它演示了少样本场景下的标准微调配方。6.1 数据集与训练/测试增强数据集通过 D2L 的DATA_HUB注册并下载解压d2l.DATA_HUB[hotdog] (d2l.DATA_URL hotdog.zip, fba480ffa8aa7e0febbb511d181409f899b9baa5) data_dir d2l.download_extract(hotdog) train_imgs torchvision.datasets.ImageFolder(os.path.join(data_dir, train)) test_imgs torchvision.datasets.ImageFolder(os.path.join(data_dir, test))训练/测试使用不同的增强管线——训练时随机裁剪随机翻转归一化测试时仅中心裁剪归一化normalize torchvision.transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) train_augs torchvision.transforms.Compose([ torchvision.transforms.RandomResizedCrop(224), torchvision.transforms.RandomHorizontalFlip(), torchvision.transforms.ToTensor(), normalize, ]) test_augs torchvision.transforms.Compose([ torchvision.transforms.Resize(256), torchvision.transforms.CenterCrop(224), torchvision.transforms.ToTensor(), normalize, ])注意这里RandomResizedCrop(224)只传了输出尺寸scale/ratio使用 torchvision 默认值(0.08, 1.0)与(0.75, 1.333)比 3.3 节更激进——这是为了在微调时注入更强的正则化对抗小数据集过拟合。6.2 替换分类头关键的一步预训练 ResNet-18 的最后一层是fc全连接层输出 1000 类。微调就是把fc换成输出 2 类的新线性层并用 Xavier 初始化让新层有合理的初始尺度finetune_net torchvision.models.resnet18(pretrainedTrue) finetune_net.fc nn.Linear(finetune_net.fc.in_features, 2) nn.init.xavier_uniform_(finetune_net.fc.weight)finetune_net.fc.in_features自动读取原fc的输入维度ResNet-18 为 512这样写不依赖硬编码。只有fc层是随机初始化的其余层权重全部来自 ImageNet 预训练——这就是用更少的标注样本的核心机制模型已经学会了通用视觉特征边缘、纹理、形状新任务只需学会把特征组合成热狗判定。6.3 分层学习率骨干 1x、新分类头 10x微调的训练循环基于 D2L 的train_ch13改编去掉DataParallel以适配单 GPU。最关键的设计是train_fine_tuning中的参数分组新fc层用 10 倍学习率预训练骨干用基础学习率并统一加上weight_decay0.001def train_fine_tuning(net, learning_rate, batch_size128, num_epochs5, param_groupTrue): train_iter torch.utils.data.DataLoader( torchvision.datasets.ImageFolder(os.path.join(data_dir, train), transformtrain_augs), batch_sizebatch_size, shuffleTrue, ) test_iter torch.utils.data.DataLoader( torchvision.datasets.ImageFolder(os.path.join(data_dir, test), transformtest_augs), batch_sizebatch_size, ) devices d2l.try_all_gpus() loss nn.CrossEntropyLoss(reductionnone) if param_group: params_1x [param for name, param in net.named_parameters() if name not in [fc.weight, fc.bias]] trainer torch.optim.SGD( [{params: params_1x}, {params: net.fc.parameters(), lr: learning_rate * 10}], lrlearning_rate, weight_decay0.001, ) else: trainer torch.optim.SGD(net.parameters(), lrlearning_rate, weight_decay0.001) train(net, train_iter, test_iter, loss, trainer, num_epochs, devices) train_fine_tuning(finetune_net, 5e-5) # 骨干 lr5e-5fc 层 lr5e-4设计动机骨干层已有成熟特征只许小幅调整小学习率否则会灾难性遗忘预训练知识而新fc层从零学起需要更大步长才能快速收敛。param_groupFalse分支则提供全参数同学习率的对照。6.4 测试对两张测试图分别输出概率训练完成后把模型搬到 CPU 并切到 eval 模式对test/hotdog/1000.png与test/not-hotdog/1000.png分别用test_augs预处理后前向传播用F.softmax(out, dim1)得到二分类概率net finetune_net.to(cpu) net.eval() img_t test_augs(img) # 与训练相同的归一化统计量 batch_t torch.unsqueeze(img_t, 0) out net(batch_t) probs F.softmax(out, dim1) print(probs) # 例如 [[0.98, 0.02]] / [[0.01, 0.99]]6.5 JAX 微调版Flax jax-resnet Augmaxfinetune_cnn_jax.ipynb 是同一任务的 JAX 移植版作者同为 Susnato Dhar技术栈为Flax linen optax jax-resnetn2cholas 的预训练 ResNet 实现 augmax。核心结构如下自定义DataLoader(tf.keras.utils.Sequence)按 batch 交替读取 hotdog/not-hotdog 两个目录每张图经augmax.Chain(HorizontalFlip(), Resize(224,224), Normalize(...))增强后返回[2*batch_size, 224, 224, 3]的jnp.float16张量与uint8标签模型定义MyResnet(nn.Module)加载pretrained_resnet(18)用Sequential(model.layers[:-1])切掉原分类头再接Dense(256) - relu - Dense(2)作为新头训练状态继承train_state.TrainState并扩展batch_stats字段以携带 BatchNorm 统计量训练循环用jax.value_and_gradhas_auxTrue同时取回 loss 与新 batch 统计量配合state.apply_gradients(gradsgrad, batch_statsnew_model_state[batch_stats])更新优化器为optax.adam(learning_rate0.00001)默认训练 10 个 epoch并在每轮结束后对验证集做一次eval_step打印 Validation Loss / Accuracy测试阶段同样在推理时用jax.nn.softmaxargmax输出预测标签并把归一化张量反归一化回[0,255]以便可视化。JAX 版与 PyTorch 版互为对照适合希望在同一章节内横向对比两种框架微调习惯用法的读者。七、路线四分层贝叶斯 MAML 的概率图绘制脚本hbayes_maml.ipynb 用graphviz绘制书中图 19.14——分层贝叶斯视角下 MAMLModel-Agnostic Meta-Learning的概率图模型plate diagram从概率图角度说明元学习的层次结构全局参数Phi先验地生成每个任务train/valid 子图的参数Theta再经Theta生成各任务的隐变量与观测。Notebook 提供三个可复用的绘图辅助函数create_node(dot, character, subscript, superscript, ...)创建带 HTML 风格上下标的节点支持希腊字母如Theta;、Phi;create_subgraph(dot, hidden, observable, ...)把隐变量 观测变量 边封装成带圆角边框与标签的 clusterplot_cluster(...)为每个任务superscript 表示任务编号绘制一组 Train / Valid 子图并连接全局Theta到各组隐变量。主流程的关键配置对应概率图的拓扑结构superscripts [1, J] # 两个任务书中为 1 和 T train_subscript, test_subscript n, m subgraph_labels [Train, Valid] param, hidden, observable Theta, Y, X dot.node(phi, Phi;, colorwhite, fontcolorfontcolor) for i, subscript in enumerate(superscripts): create_node(dot, param, subscript, colorwhite, fontcolorfontcolor, is_greek_letterTrue) dot.edge(phi, f{param}{subscript}, coloredge_color) # Phi - Theta^1, Theta^J for i, superscript in enumerate(superscripts): plot_cluster(dot, subscripts, superscript, [fTrain {superscript}, fValid {superscript}], subgraph_colors) file_name hbayes-maml dot.render(file_name, viewTrue) # 渲染为 PDF即图 19.14从源码结构可以推断其对应关系全局Phi是所有任务共享的元参数先验Theta^j是第j个任务的个性化参数Y^n_j隐变量经边指向X^n_j观测完整呈现了分层贝叶斯 MAML 中共享先验 → 任务参数 → 观测的三层生成结构。这张图正是用更少的标注样本在元学习框架下的理论表达多个相关任务共享统计强度从而降低每个任务对标注量的需求。八、如何在本仓库运行这些 Notebook所有 Notebook 均位于 notebooks/book1/19/ 目录属于第 19 章Book 1内容。运行方式本地 Jupyter进入仓库后启动jupyter notebook打开任意 Notebook 顺序执行环境依赖PyTorch 版需要torch、torchvision、numpy、matplotlib并会通过!wget拉取d2l.py工具模块JAX 版额外需要jax、flax、optax、augmaxgithttps://github.com/khdlr/augmax.git、jax-resnetgithttps://github.com/n2cholas/jax-resnet.git、opencv-python、tensorflow/tensorflow_datasets与scikit-image网络说明示例图片cat_dog.jpg、hotdog 数据集d2l-data.s3-accelerate.amazonaws.com/hotdog.zip、CIFAR-10 均需运行时联网下载hotdog 数据集的 sha1 校验码为fba480ffa8aa7e0febbb511d181409f899b9baa5可校验下载完整性硬件说明微调 Notebook 默认使用单 GPU代码已注释掉DataParallel无 GPU 时可自行把devices改为 CPU但训练时长会明显增加。九、小结三条路线的选择建议综合第 19 章四个 Notebook 的代码实现可以总结出少样本学习的实用决策路径数据增强是性价比最高的第一步——几乎零成本PyTorch 用transforms.Compose翻转 随机裁剪 颜色抖动JAX 用augmax.Chain两者效果等价若任务类别落在 ImageNet 1000 类附近直接用预训练 ResNet-101 推理即可第五节无需任何训练若任务是新类别如热狗检测采用替换 fc 头 骨干 1x / 新头 10x 分层学习率 训练集增强 / 测试集仅归一化的标准微调配方第六节若要在多个小任务间共享统计强度则进入分层贝叶斯 / MAML 的元学习框架第七节的概率图即其理论骨架。这四条路线共同回答了第 19 章的核心命题标注样本不够时不一定要更多数据更聪明的统计共享与特征复用往往就够了。仓库内各 Notebook 的完整可运行代码是本章全部结论的直接证据与动手起点。赞分享机器学习深度学习【免费下载链接】pyprobmlPython code for Probabilistic Machine learning book by Kevin Murphy项目地址https://gitcode.com/gh_mirrors/py/pyprobml点击查看免费下载相关推荐Llama3v模型训练全解析600K图像预训练到1M数据微调Llama3v模型训练全解析600K图像预训练到1M数据微调 Llama3v是一款基于Llama3 8B构建的尖端视觉模型通过结合视觉与语言能力实现了强大Zircolite在企业环境中的应用构建自动化威胁检测工作流程Zircolite在企业环境中的应用构建自动化威胁检测工作流程 Zircolite是一款基于SIGMA规则的独立威胁检测工具专为EVTX、Auditd和Li7步掌握OmniGen LoRA微调用少量数据训练个性化AI图像生成模型7步掌握OmniGen LoRA微调用少量数据训练个性化AI图像生成模型 OmniGen是一款强大的统一图像生成模型支持多模态条件输入和多种生成任务。通过L上一篇在Windows Hyper-V上安装macOS虚拟机的完整指南下一篇Flashtool 完整指南5个技巧轻松刷写Xperia设备固件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表