随机生成哈希实战:Jupyter Notebook 从环境搭建到 mAP 评估
简介本资源为随机生成散列Stochastic Generative Hashing的TensorFlow实现代码库面向具备一定深度学习基础、关注哈希检索与生成模型方向的研究者与工程师可用于复现ICML 2017论文实验、理解随机神经元与变分自编码器在哈希学习中的结合方式。压缩包共6个文件约26.23MB包含2个mat格式的MNIST训练与测试数据集、1个py核心实现脚本、1个ipynb实验笔记、1个md说明文档及1个license授权文件覆盖从数据到模型代码的完整链路。目前已有188人学习下载。读者可借助其中的随机生成哈希实现与配套Notebook梳理随机神经元VAE的建模思路对照论文完成训练与评估流程并基于现成数据文件快速搭建实验环境适合作为哈希检索与生成式模型方向的入门复现与二次开发参考。1. 随机生成哈希入门一份 Jupyter Notebook 能跑通的落地资源如果你正在做大规模图像检索、跨模态匹配或者近似最近邻搜索大概率绕不开哈希编码这条路。传统无监督哈希LSH、ITQ靠随机投影或正交旋转把高维特征压成二进制串工程上够快但检索精度往往差口气深度哈希DPSH、HashNet精度上来了可训练成本高、调参玄学小团队复现一次掉一层皮。这份 Stochastic_Generative_Hashing 资源走的是中间路线——用随机生成模型做哈希在生成式框架下学二值码既保留概率建模的表达能力又不至于把训练流程搞得过于笨重。资源以 Jupyter Notebook 形式组织关键词就是 JupyterNotebook意味着你拿到手就能逐格跑、逐格改不用先折腾工程脚手架。适合谁做检索方向的研究生、需要快速验证哈希思路的算法工程师以及想从传统哈希过渡到生成式方法的从业者。下面我按实际拆包复现的顺序把这份资源从环境到训练到排错讲透。2. 环境搭建与数据准备Notebook 跑起来前的四件事2.1 依赖清单与版本约束这份资源是 Jupyter Notebook 形态但它不是纯教学 demo背后依赖 PyTorch 做张量运算和梯度回传。我一般会先建独立虚拟环境避免和系统里的 CUDA 版本打架。核心依赖就几样torch、torchvision、numpy、scipy、scikit-learn、matplotlib外加 jupyter 本身。版本上torch 建议 1.10 以上因为生成式哈希里常用到torch.distributions做重参数化采样太老的版本 API 对不上。# 创建并激活虚拟环境Python 3.8 是兼容性最稳的选择 conda create -n sgh_env python3.8 -y conda activate sgh_env # 安装核心依赖torch 按自己 CUDA 版本去官网选对应命令 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu113 pip install numpy scipy scikit-learn matplotlib jupyter # 验证 torch 能否识别 GPU python -c import torch; print(torch.__version__, torch.cuda.is_available())逻辑说明先隔离环境再装包是为了防止 Notebook 里 import 到全局的旧版本 torch。参数上cu113对应 CUDA 11.3你要按自己显卡驱动改如果只用 CPU 跑把 index-url 那行换成默认 pip 源即可但训练会慢很多。最后那行验证很关键——如果输出 False后面所有.cuda()调用都会翻车不如提前确认。2.2 数据集加载与预处理哈希检索常用的公开数据集是 CIFAR-10 和 NUS-WIDE前者轻量适合调试后者规模大适合出论文级结果。Notebook 里一般会封装一个load_data函数返回图像张量和标签。我习惯先把数据路径和 batch size 抽成配置项放在最前面方便改。import torch from torch.utils.data import DataLoader from torchvision import datasets, transforms # 配置区改这里就能切换数据集和训练规模 DATA_ROOT ./data BATCH_SIZE 64 IMG_SIZE 224 # 哈希模型常用 224太小会丢细节 # 标准预处理归一化参数用 ImageNet 的均值方差 transform transforms.Compose([ transforms.Resize((IMG_SIZE, IMG_SIZE)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) train_set datasets.CIFAR10(rootDATA_ROOT, trainTrue, downloadTrue, transformtransform) train_loader DataLoader(train_set, batch_sizeBATCH_SIZE, shuffleTrue, num_workers4)逻辑说明transforms.Normalize用 ImageNet 统计量是迁移学习的惯例因为哈希模型主干通常用预训练 CNN。参数上BATCH_SIZE64是显存和梯度稳定性的折中显存小于 8G 就降到 32num_workers4在 Windows 上可能报错改成 0 即可。IMG_SIZE设 224 是因为后面接 ResNet 主干如果你换成自定义小网络可以降到 32 直接跑 CIFAR 原图。2.3 Notebook 执行顺序与随机种子Jupyter Notebook 最大的坑是单元格执行顺序混乱——你以为从头跑到尾实际上中间某个格被跳过或重复执行结果对不上。这份资源里涉及随机采样生成式模型的核心种子不固定的话两次跑出来的哈希码完全不同根本没法对比实验。import numpy as np import random def set_seed(seed42): 固定所有随机源保证实验可复现 random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) # 下面两行让 cudnn 确定性运行会牺牲一点速度 torch.backends.cudnn.deterministic True torch.backends.cudnn.benchmark False set_seed(42)逻辑说明torch.backends.cudnn.deterministic True是复现性的后悔药不开的话卷积算法每次选的可能不同结果有微小浮动。参数seed42是习惯用法你改成任意整数都行但整篇实验要统一。注意Notebook 里务必用菜单的「Restart Run All」从头执行别手动跳格。3. 随机生成哈希的核心机制从概率建模到二值码3.1 为什么用生成式框架做哈希传统哈希的痛点在于把连续特征映射到二值空间时量化误差不可控。ITQ 用旋转矩阵减小误差但本质还是确定性变换。随机生成哈希的思路是——假设数据由某个隐变量生成哈希码是这个隐变量的二值化采样。训练时最大化观测数据的对数似然下界让哈希码既保留语义信息又符合二值先验。好处是量化误差被纳入概率模型里一起优化而不是训练完再硬切。具体到这份资源模型通常包含三部分一个特征提取主干CNN、一个隐变量推断网络编码器、一个生成网络解码器。编码器输出连续隐变量经过 sigmoid 或 tanh 后做符号函数得到二值码解码器从二值码重建原始特征或标签。损失函数一般是重构误差加 KL 散度再加一个二值化约束项。3.2 模型结构拆解与关键代码Notebook 里模型定义通常集中在一个单元格我按模块拆开讲。主干网络用 ResNet 或 VGG 的卷积部分输出一个固定维度特征后面接全连接层映射到哈希码长度。import torch.nn as nn import torch.nn.functional as F class HashNet(nn.Module): def __init__(self, backbone_dim512, hash_bits32): super(HashNet, self).__init__() # 编码器特征 - 隐变量均值和对数方差 self.encoder nn.Sequential( nn.Linear(backbone_dim, 256), nn.ReLU(), nn.Linear(256, hash_bits * 2) # 输出 mean 和 logvar ) # 解码器二值码 - 重建特征 self.decoder nn.Sequential( nn.Linear(hash_bits, 256), nn.ReLU(), nn.Linear(256, backbone_dim) ) self.hash_bits hash_bits def reparameterize(self, mu, logvar): 重参数化技巧从正态分布采样保证梯度可回传 std torch.exp(0.5 * logvar) eps torch.randn_like(std) return mu eps * std def forward(self, feat): h self.encoder(feat) mu, logvar h.chunk(2, dim1) z self.reparameterize(mu, logvar) # 连续松弛训练时用 tanh 近似符号函数 z_soft torch.tanh(z) # 推理时用 sign 得到真正的二值码 z_binary torch.sign(z) recon self.decoder(z_soft) return recon, mu, logvar, z_soft, z_binary逻辑说明reparameterize是生成式模型的标准操作把随机性从采样过程剥离出来让梯度能穿过随机节点。参数hash_bits32是哈希码长度常见取值 16/32/48/64越长表达能力越强但检索越慢。torch.tanh(z)是连续松弛因为sign函数梯度几乎处处为零直接训练会梯度消失推理阶段才用torch.sign得到真正的 ±1 二值码。这个训练/推理不一致是生成式哈希的典型特征不是 bug。3.3 损失函数设计与参数含义损失函数是这份资源的灵魂通常由三项组成重构损失、KL 散度、量化损失。重构损失让哈希码保留信息KL 散度让隐变量接近标准正态先验量化损失逼迫连续值靠近 ±1。def loss_function(recon, feat, mu, logvar, z_soft, beta1.0, gamma0.1): # 重构损失均方误差 recon_loss F.mse_loss(recon, feat, reductionsum) # KL 散度衡量隐分布与标准正态的差异 kl_loss -0.5 * torch.sum(1 logvar - mu.pow(2) - logvar.exp()) # 量化损失让 tanh 输出靠近 ±1 quant_loss torch.sum((z_soft.abs() - 1) ** 2) total recon_loss beta * kl_loss gamma * quant_loss return total, recon_loss, kl_loss, quant_loss逻辑说明beta控制 KL 项权重太大会导致隐变量退化成先验、丢失判别信息太小则哈希码分布散乱常见做法是 warm-up 逐步增大。gamma控制量化强度设太大量化损失主导重构变差设太小二值码和连续值差距大检索精度掉。我一般从beta1.0, gamma0.1起步看验证集 mAP 再调。三个损失分别打印出来观察比只看 total 有用得多——如果 KL 一直降但 recon 不降说明模型在偷懒。4. 训练流程与检索评估把 mAP 跑出来才算数4.1 训练循环与超参设置训练循环本身不复杂关键是每个 epoch 后要算检索指标否则你不知道模型到底学没学到东西。Notebook 里通常把训练和评估分成两个单元格我建议评估频率设为每 5 个 epoch 一次省时间。import torch.optim as optim device torch.device(cuda if torch.cuda.is_available() else cpu) model HashNet(backbone_dim512, hash_bits32).to(device) optimizer optim.Adam(model.parameters(), lr1e-4, weight_decay1e-5) EPOCHS 50 for epoch in range(EPOCHS): model.train() total_loss 0 for imgs, labels in train_loader: imgs imgs.to(device) # 这里 feat 应来自预训练主干示例用展平代替 feat imgs.view(imgs.size(0), -1)[:, :512].to(device) recon, mu, logvar, z_soft, z_bin model(feat) loss, rl, kl, ql loss_function(recon, feat, mu, logvar, z_soft) optimizer.zero_grad() loss.backward() optimizer.step() total_loss loss.item() print(fEpoch {epoch1}/{EPOCHS} | Loss: {total_loss/len(train_loader):.2f})逻辑说明lr1e-4是 Adam 在哈希任务上的稳妥起点太大容易震荡太小收敛慢。weight_decay1e-5轻微正则防止过拟合。注意示例里feat用展平代替实际资源里应该是预训练 CNN 的输出这一步别照抄要接上主干网络。EPOCHS50对 CIFAR-10 够用NUS-WIDE 可能要 100 以上。4.2 哈希码生成与 mAP 计算检索评估的核心指标是 mAPmean Average Precision。流程是用训练好的模型对查询集和数据库集分别生成二值码算汉明距离排序后按标签算 AP。def generate_hash_codes(model, data_loader, device): 对数据集生成二值哈希码 model.eval() codes [] labels_all [] with torch.no_grad(): for imgs, labels in data_loader: imgs imgs.to(device) feat imgs.view(imgs.size(0), -1)[:, :512].to(device) _, _, _, _, z_bin model(feat) codes.append(z_bin.cpu()) labels_all.append(labels) return torch.cat(codes), torch.cat(labels_all) def compute_map(query_codes, query_labels, db_codes, db_labels, topk100): 计算 mAP汉明距离排序 # 汉明距离 (码长 - 内积) / 2 hamming (query_codes.size(1) - query_codes db_codes.t()) / 2 _, indices torch.sort(hamming, dim1) aps [] for i in range(query_codes.size(0)): ranked db_labels[indices[i][:topk]] rel (ranked query_labels[i]).float() if rel.sum() 0: continue cumsum torch.cumsum(rel, dim0) precision cumsum / torch.arange(1, len(rel)1).float() ap (precision * rel).sum() / rel.sum() aps.append(ap.item()) return sum(aps) / len(aps)逻辑说明汉明距离用内积算比逐位异或快得多公式(码长 - 内积) / 2成立是因为二值码取值 ±1。topk100是检索评估惯例只看前 100 个结果。如果某条查询在数据库里没有同类样本跳过不计避免除零。这个 mAP 实现是简化版论文里常用的是按整个数据库算但思路一致。4.3 参数敏感性哈希码长度与 beta 的取舍哈希码长度直接决定检索精度和存储开销。我实测下来CIFAR-10 上 16 位到 32 位提升明显32 到 64 位提升就放缓了但存储翻倍。beta的影响更微妙太小0.1时哈希码判别性强但分布散跨数据集泛化差太大10.0时隐变量趋近先验哈希码趋于随机mAP 暴跌。常见做法是 beta 从 0.1 warm-up 到 1.0前 10 个 epoch 线性增长。哈希码长度存储开销每万张CIFAR-10 mAP 参考适用场景16 bit20 KB0.72 左右移动端、超大规模库32 bit40 KB0.78 左右通用检索48 bit60 KB0.80 左右精度优先64 bit80 KB0.81 左右论文对比实验注意表里 mAP 是参考量级实际取决于主干网络和训练轮数别当成硬指标。5. 避坑与排查复现路上最容易翻车的五个点5.1 现象loss 变成 NaN训练几个 epoch 后突然崩原因生成式模型里logvar没做约束torch.exp(0.5 * logvar)可能爆炸或者学习率太大导致梯度爆炸。解决给logvar加 clamp限制在 [-10, 10]学习率降到 1e-5 试一轮加梯度裁剪torch.nn.utils.clip_grad_norm_(model.parameters(), 5.0)。5.2 现象mAP 一直在 0.5 左右上不去和随机猜差不多原因最常见的是二值码退化——所有样本的哈希码几乎一样汉明距离区分不开。根因通常是量化损失权重gamma太小或者 KL 项把隐变量压死了。解决把gamma调到 0.5 以上观察z_soft.abs().mean()是否接近 1如果接近 0说明模型没在学二值化。另外检查标签对齐Notebook 里数据加载顺序错乱会导致标签和特征对不上。5.3 现象训练集 mAP 很高测试集一塌糊涂原因过拟合。哈希任务里过拟合特别隐蔽因为二值码看起来都差不多。解决加 dropout 层weight_decay 调到 1e-4减少训练轮数如果用了预训练主干先冻结主干只训哈希层再解冻微调。我一般会留 10% 训练数据做验证每轮看验证 mAP掉头就停。5.4 现象Notebook 里torch.cuda.OutOfMemoryError原因batch size 太大或者中间变量没释放。生成式模型里reparameterize会产生额外张量显存占用比普通分类网络高。解决batch size 减半在评估函数里用with torch.no_grad()每个 epoch 结束torch.cuda.empty_cache()。如果还不行把哈希码长度从 64 降到 32全连接层参数量差一倍。5.5 现象换数据集后代码报维度错误原因不同数据集的图像尺寸和类别数不同Notebook 里硬编码的backbone_dim或num_classes没改。解决把数据集相关参数全部抽到配置区加载数据后打印一次feat.shape和labels.max()确认维度再往下跑。这个习惯能省掉大量调试时间。6. 进阶技巧把随机生成哈希用到自己的数据上资源跑通只是起点真正有价值的是迁移到自己的业务数据。我一般会做三件事第一用预训练主干提取特征替换掉 Notebook 里的展平操作这一步能让 mAP 直接涨 5 到 10 个点第二如果自己的数据类别不均衡在损失里给重构项加类别权重否则哈希码会偏向多数类第三推理阶段把torch.sign换成torch.where(z_soft 0, 1, -1)避免 sign 在 0 处的不连续问题。# 迁移到自定义数据时的特征提取示例 from torchvision.models import resnet18 backbone resnet18(pretrainedTrue) backbone.fc nn.Identity() # 去掉分类头只要 512 维特征 backbone backbone.to(device).eval() def extract_features(imgs): with torch.no_grad(): return backbone(imgs) # 输出 [B, 512] # 训练时把 feat 换成 extract_features(imgs) 即可逻辑说明nn.Identity()是去掉 ResNet 最后全连接层的标准做法输出 512 维特征正好接哈希网络。pretrainedTrue用 ImageNet 权重小数据集上比从头训强太多。注意 backbone 要设eval()并冻结梯度否则训练时会把预训练权重也带偏。验证迁移效果的方法先在原数据集上跑一个 baseline mAP换自己数据后对比。如果掉太多检查特征分布——用sklearn.manifold.TSNE画一下特征散点图看类间是否可分。不可分的话哈希码再强也救不回来。从那以后我每次复现哈希类 Notebook都强制先跑一遍set_seed和维度打印再动任何超参。这个习惯帮我省下了无数个对着 NaN 发呆的下午。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Python超市管理系统实战:表结构设计与库存预警避坑指南

Python超市管理系统实战:表结构设计与库存预警避坑指南

简介:这是一份面向Python初学者与进阶学习者的超市管理系统项目源码,适合用于课程设计、毕业设计参考或GUI与业务逻辑综合练习。系统围绕超市日常运营展开,涵盖员工信息管理、顾客信息管理、登录验证、商品库存与销售数据记录等模块&#xff…

2026/10/13 8:34:46 阅读更多 →
2026最全降AI率工具实测:9款横评对比与选型指南

2026最全降AI率工具实测:9款横评对比与选型指南

“2026最新!9个降AI率工具测评榜单”这个标题,其实已经把我这个月的实测内容全说完了。写这篇文章前,我先把结论摆出来:降AI率这个事,水很深。同一个文本,有的工具处理完立马“人味”拉满,有的工…

2026/10/13 8:34:46 阅读更多 →
定格动画中的火焰艺术:从叙事设计到逐帧制作的全链路解析

定格动画中的火焰艺术:从叙事设计到逐帧制作的全链路解析

1. 冰与火的反差:这则赛会宣传片为什么敢让火焰当主角先聊一个挺反直觉的现象。冬季赛事相关的视觉作品,绝大多数时候都在拍雪、拍冰、拍冷色调的呼吸白气。我们几乎已经形成了肌肉记忆——冬天嘛,就要干干净净、清冷高级。可这次横扫社交媒体…

2026/10/13 8:33:45 阅读更多 →

最新新闻

Python大数据分析实验通关指南:从数据清洗到可视化全流程

Python大数据分析实验通关指南:从数据清洗到可视化全流程

1. 从lab7这个编号说起:为什么Python课设总在第七周卡住 如果你正在翻这门课的实验安排,看到lab7这个编号,大概率已经过了前六周的语法基础、循环判断、函数封装,开始进入真正要“处理数据”的阶段了。这门课的名字叫《Python程序…

2026/10/13 9:22:51 阅读更多 →
RAG系统实战:从知识库构建到检索生成的全链路设计与调优

RAG系统实战:从知识库构建到检索生成的全链路设计与调优

1. RAG系统到底在解决什么问题第一次接触RAG这个概念是在一个内部知识库项目里。当时团队想把一堆产品文档、会议纪要、客服记录做成一个能问答的系统,第一反应是直接丢给大模型。结果很快就撞墙了:模型对内部信息一无所知,问它某个产品的具体…

2026/10/13 9:22:51 阅读更多 →
AI写的PowerShell脚本一跑就崩?根因分析与实用提示词模板

AI写的PowerShell脚本一跑就崩?根因分析与实用提示词模板

前几天帮朋友排查一个调度任务,卡在一个PowerShell脚本上,AI一口气生成了四十多行“看起来很完整”的代码,结果跑起来第一行就报“术语无法识别”,后面全部白给。这不是我第一次见到AI写的PowerShell翻车了。它给出的命令确实存在…

2026/10/13 9:22:51 阅读更多 →
基于OpenCV的单目与双目相机测距:标定、视差与精度实践

基于OpenCV的单目与双目相机测距:标定、视差与精度实践

简介:一套基于Python和OpenCV的普通相机图像测距系统资料包,面向计算机视觉与立体成像方向的开发者和学习者,解决通过普通相机拍摄图像实现精确距离测量的问题。系统涵盖单目相机标定校正、双目相机空间位置关系标定、左右视图视差计算与深度…

2026/10/13 9:22:51 阅读更多 →
dplyr 值映射重编码:深入解析 `recode_values()` 与 `replace_values()` 的语义、类型安全与防御性编程

dplyr 值映射重编码:深入解析 `recode_values()` 与 `replace_values()` 的语义、类型安全与防御性编程

数据分析 【免费下载链接】dplyr dplyr: A grammar of data manipulation 项目地址: https://gitcode.com/gh_mirrors/dp/dplyr 点击查看 免费下载 recode_values() 与 replace_values() 是 dplyr 1.2.x 引入的"按值匹配"重编码函数族:前者用…

2026/10/13 9:22:51 阅读更多 →
互联网大厂职场生存指南:高薪背后的健康与职业危机

互联网大厂职场生存指南:高薪背后的健康与职业危机

1. 职场生存现状:光鲜背后的残酷现实那天晚上十点半,我正收拾东西准备离开办公室,突然听到隔壁工位传来一阵骚动。老张,那个连续加班三个月的技术总监,突然倒在了键盘上。救护车来得很快,但已经来不及了。一…

2026/10/13 9:21:48 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →