可调试可验证的强化学习教学沙盒:110文件智能决策作业系统
简介本资源是一份面向高校人工智能与机器学习课程学习者的强化学习实践作业设计源码包聚焦智能决策技术的Python工程化实现。项目通过完整的代码结构支撑从策略迭代、状态值更新到动作选择的全流程学习帮助初学者深入理解Q-learning、SARSA等核心算法原理及工程落地要点。压缩包共111个文件861KB含32个Python源码文件算法主干、24个测试文件模块化验证逻辑、24个解决方案文件调优与异常处理策略、14个布局文件结构组织说明及XML配置、版本信息、项目配置.iml和文档Markdown等辅助文件目录层次清晰便于分阶段研读与调试。目前已有339人学习下载适合需要从零构建强化学习项目、掌握代码组织规范、理解测试驱动开发思路的学习者是理论联系实际的优质教学级实践素材。1. 这不是又一个“Hello World”强化学习Demo110个文件组成的可调试、可验证、可教学的智能决策作业系统你有没有试过跑通一个强化学习代码环境能reset、step能返回obsreward也涨了——但一问“策略到底学到了什么值函数在哪儿更新ε-greedy是真在探索还是纯玄学”就卡住这不是你水平问题是大多数开源RL示例压根没把教学闭环当回事它们只管让agent“动起来”不管你怎么“看懂它”。这个基于Python实现的智能决策技术强化学习作业设计源码恰恰反其道而行之——它用110个文件32个.py核心模块 24个test_.py测试用例 23个solution_.py参考解法构建了一个可打断、可打印、可单步验证的强化学习教学沙盒。它不追求Atari高分而是让你亲手看到Q-table怎么被update()改写、policy如何从random变成deterministic、discount factor γ0.95和γ0.99对收敛路径的肉眼可见影响。适合高校某实验室《智能决策导论》课程作业、自学强化学习卡在“策略迭代”环节的工程师以及想给实习生布置一份能批改、能复现、能溯源错误点的带教导师。2. 从零启动理解项目结构与核心模块职责避免“clone完就懵”这个作业系统不是单个train.py扔给你跑。它的110个文件按功能严格分层每一类都承担明确的教学/工程职责。理解这种组织逻辑是你后续调试、修改、甚至出题的基础。下面拆解最关键的四类文件及其协作关系。2.1 核心算法模块32个Python源文件不是堆砌而是分层抽象整个强化学习流程被拆解为四个抽象层级全部位于src/rl_core/目录下env/子目录封装了5个经典教学环境GridWorld,CliffWalking,FrozenLake-v0-modified,Taxi-v3-light,SimpleBandit全部继承自统一BaseEnv接口。关键设计是每个环境都暴露.get_state_transition_matrix()方法——这是你验证贝尔曼方程的手动计算基线。agent/子目录包含6种策略实现QAgent,SarsaAgent,ExpectedSarsaAgent,DQNAgentStub,PolicyGradientAgent,ActorCriticAgentStub。注意DQNAgentStub和ActorCriticAgentStub是预留接口实际作业要求学生补全网络定义与loss计算而非直接调用PyTorch。algorithm/子目录存放策略更新逻辑q_learning_update.py,sarsa_update.py,policy_iteration.py,value_iteration.py。每个函数签名强制接收(state, action, reward, next_state, done, params)其中params字典必须含alpha,gamma,epsilon——杜绝魔法数字硬编码。utils/子目录提供plot_convergence_curve(),print_policy_grid(),save_q_table_to_csv()等可视化与诊断工具。比如print_policy_grid(agent.q_table, env)会把16×16格子世界中每个状态的最优动作↑↓←→用ASCII字符渲染出来一眼看出策略是否合理。提示所有核心模块均通过__all__ [...]显式导出接口禁止跨层直接import内部变量。例如agent/q_agent.py不能直接读env/gridworld.py的私有属性_obstacle_map必须走env.step()和env.reset()——这是为后续单元测试埋下的契约。2.2 测试文件24个test_*.py不是摆设而是教学检查点测试文件位于tests/目录采用pytest框架但设计目标不是“测通”而是“测懂”。每个测试用例对应一个教学知识点# tests/test_q_learning_convergence.py def test_q_learning_converges_on_cliffwalking(): 验证在CliffWalking环境中Q-learning应在2000轮内使平均reward -15 env CliffWalking() agent QAgent(env.action_space, env.state_space, alpha0.1, gamma0.99, epsilon0.1) rewards [] for episode in range(2500): state env.reset() total_reward 0 for _ in range(200): action agent.select_action(state) next_state, reward, done, _ env.step(action) agent.update(state, action, reward, next_state, done) total_reward reward state next_state if done: break rewards.append(total_reward) # 关键断言不是只看最后100轮而是看稳定区间 stable_rewards rewards[-100:] assert np.mean(stable_rewards) -15, \ fQ-learning未收敛最后100轮平均reward{np.mean(stable_rewards):.2f}这段代码的价值不在自动化而在强制你关注三个教学锚点①alpha0.1为何不能设成0.5导致震荡②gamma0.99为何比0.9更易陷入悬崖长视野放大负奖励③stable_rewards取最后100轮而非全程均值——这正是RL评估的黄金实践。运行pytest tests/test_q_learning_convergence.py -v失败时输出的不仅是AssertionError还有完整的rewards数组你可以直接plt.plot(rewards)看曲线。2.3 解决方案文件23个solution_*.py是“后悔药”不是标准答案solutions/目录下的文件命名直指具体问题如solution_gridworld_value_iteration.py但内容绝非“抄了就能交”。每个solution文件包含三部分Problem Statement注释块明确输入约束如“仅允许使用numpy禁用scipy.linalg”Reference Implementation可运行的参考代码但关键参数如max_iter100被替换为MAX_ITER_PLACEHOLDERDebugging Hints区块列出3个典型错误及验证方式例如# Hint: 若value_iteration不收敛请检查 # 1. 是否在每次迭代后对所有state同步更新V(s)而非in-place覆盖 # 2. 终止条件是否用max|V_new(s)-V_old(s)| 1e-4而非sum # 3. 环境的transition_prob是否已归一化可用env.check_transition_stochasticity()验证这意味着学生提交的作业助教可以用同一套check_solution.py脚本注入不同MAX_ITER_PLACEHOLDER值批量验证鲁棒性——这才是工程级作业设计。2.4 布局与配置文件14个布局文件5个XML不是装饰而是环境隔离桩layouts/目录存放.lay文本文件如cliff_8x8.lay格式为######## #S # # # # # # # # # # # #G#####其中Sstart,Ggoal,#cliff。这些文件被env/gridworld.py解析为self._grid二维数组完全解耦于算法逻辑。你可以用任意文本编辑器修改cliff_8x8.lay增加障碍无需改一行Python代码env.reset()自动加载新地图。config/下的5个XML文件如q_learning_config.xml则用结构化方式定义超参组合experiment agent typeQAgent param namealpha value0.1 min0.01 max0.5 step0.05/ param namegamma value0.99 options0.9,0.95,0.99/ /agent env nameCliffWalking layoutlayouts/cliff_8x8.lay/layout /env /experiment配套的scripts/run_grid_search.py能自动遍历所有参数组合生成实验报告。这让学生第一次体会到调参不是拍脑袋而是可穷举、可复现的科学过程。3. 避坑指南强化学习作业中最常翻车的5个边界问题与血泪修复方案强化学习作业的崩溃往往发生在“看起来该跑通”的地方。以下是我在某高校助教实践中学生提交的327份作业里高频出现的5类问题附带可立即验证的修复步骤。3.1 现象Q-learning在GridWorld中reward持续为-100且Q-table所有值趋近于同一负数原因env.step()返回的doneTrue后学生仍在调用agent.update(state, action, reward, next_state, done)而next_state是无效状态如None或越界坐标导致Q-table索引错误并触发numpy广播将整个表污染为相同值。解决在agent.update()开头强制校验def update(self, state, action, reward, next_state, done): # 新增防护done为True时next_state应被忽略 if done: # Bellman更新简化为Q(s,a) ← Q(s,a) α[r - Q(s,a)] self.q_table[state][action] self.alpha * (reward - self.q_table[state][action]) return # 正常更新逻辑... best_next_q np.max(self.q_table[next_state]) self.q_table[state][action] self.alpha * ( reward self.gamma * best_next_q - self.q_table[state][action] )注意此处best_next_q np.max(self.q_table[next_state])隐含假设next_state有效。若环境返回非法next_state需在env.step()中抛出ValueError(Invalid next_state)而非静默处理。3.2 现象Policy Iteration迭代50轮后V(s)不再变化但print_policy_grid()显示大量状态动作为空 原因策略评估Policy Evaluation阶段未正确处理doneTrue状态。当agent到达goal时doneTrue但学生编写的policy_evaluation()仍尝试计算V(s)而V(goal)未被初始化为0或未在循环中跳过。解决在policy_evaluation()中显式标记终止状态def policy_evaluation(policy, env, gamma0.99, theta1e-4): V np.zeros(env.state_space) # 初始化所有V(s)0 # 关键获取所有终止状态ID terminal_states [s for s in range(env.state_space) if env.is_terminal(s)] # env需提供此方法 while True: delta 0 for s in range(env.state_space): if s in terminal_states: # 终止状态V(s)恒为0跳过更新 continue v 0 for a in range(env.action_space): for prob, next_s, reward, done in env.P[s][a]: # 注意即使doneTruereward仍有效但V(next_s)应为0 v policy[s][a] * prob * (reward (0 if done else gamma * V[next_s])) delta max(delta, abs(V[s] - v)) V[s] v if delta theta: break return V3.3 现象pytest tests/通过但手动运行python main.py时程序卡死在env.reset()原因main.py中创建了env GridWorld(layoutlayouts/invalid.lay)而invalid.lay文件存在语法错误如某行字符数≠其他行但env.__init__()未做行宽校验导致self._grid成为不规则list后续np.array(self._grid)报错但被try...except吞掉进入无限重试循环。解决在env/gridworld.py的__init__末尾添加布局校验# 检查布局是否为矩形 widths [len(row) for row in self._grid] if len(set(widths)) ! 1: raise ValueError(fLayout not rectangular: widths{widths}) self.width, self.height widths[0], len(self._grid)并在main.py中用try...except ValueError as e:捕获并打印具体错误行号。3.4 现象DQN训练时loss下降但reward不升torch.cuda.memory_allocated()显示显存缓慢增长原因DQNAgentStub中replay_buffer.sample()返回的next_state_batch是torch.Tensor但在计算target Q时直接用了model(next_state_batch).max(1)[0]导致计算图未被截断历史梯度累积。解决在target计算中显式detach()# 错误写法导致显存泄漏 next_q_values self.target_model(next_state_batch).max(1)[0] # 正确写法用detach()切断梯度流 with torch.no_grad(): next_q_values self.target_model(next_state_batch).max(1)[0]血泪经验在DQN作业中必须要求学生在main.py顶部添加torch.autograd.set_detect_anomaly(True)这样一旦漏掉no_grad会直接报RuntimeError: Function MaxBackward0 returned nan而不是静默失败。3.5 现象git push失败提示error: failed to push some refs to xxx且.gitignore中已写__pycache__/原因.gitignore文件本身被错误地加入暂存区staged导致Git忽略规则失效。执行git status会显示.gitignore在“Changes to be committed”列表中。解决两步清除# 1. 将.gitignore从暂存区移除保留工作区文件 git reset HEAD .gitignore # 2. 强制重新应用忽略规则清除已跟踪的忽略文件 git rm -r --cached . git add . git commit -m Apply .gitignore rules correctly提示此问题在Windows系统上尤其常见因Git默认启用core.autocrlftrue可能修改.gitignore换行符导致规则失效。建议在项目根目录执行git config core.autocrlf input。4. 超参数敏感性分析用3个命令量化γ、α、ε对收敛速度与最终性能的影响强化学习作业最易被忽视的是超参数不是“调出来就行”而是要量化其影响边界。这个项目提供了开箱即用的分析工具链无需额外安装依赖。4.1 构建可复现的参数扫描实验所有实验由scripts/param_sweep.py驱动它读取config/sweep_config.yaml示例agent: QAgent env: CliffWalking metrics: - name: final_avg_reward window: 100 aggregation: mean - name: convergence_episode threshold: -15.0 # reward连续100轮-15即视为收敛 sweep: alpha: [0.01, 0.05, 0.1, 0.2] gamma: [0.9, 0.95, 0.99] epsilon: [0.01, 0.1, 0.3] seeds: [42, 123, 456] # 三次随机种子取平均消除偶然性执行命令python scripts/param_sweep.py \ --config config/sweep_config.yaml \ --output results/sweep_cliff_qlearning.csv \ --n_jobs 6 # 并行6个进程该命令会自动为每组(alpha, gamma, epsilon)生成3个seed的独立实验每个实验运行至2000轮或收敛以先到者为准提取final_avg_reward和convergence_episode两个指标输出CSV含108行4×3×3×3数据每行含完整参数与指标。4.2 可视化敏感性热力图一眼定位“甜点区域”scripts/plot_sensitivity.py将CSV转为热力图。以gamma和alpha为例# scripts/plot_sensitivity.py import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df pd.read_csv(results/sweep_cliff_qlearning.csv) # 固定epsilon0.1看gamma-alpha组合 subset df[df[epsilon] 0.1].copy() # 计算每个(gamma,alpha)组合的平均收敛轮次 pivot subset.pivot_table( valuesconvergence_episode, indexgamma, columnsalpha, aggfuncmean ) plt.figure(figsize(8, 6)) sns.heatmap(pivot, annotTrue, fmt.0f, cmapviridis) plt.title(Convergence Episodes (ε0.1) - Lower is Better) plt.ylabel(Gamma (γ)) plt.xlabel(Alpha (α)) plt.savefig(results/gamma_alpha_convergence.png, dpi300, bbox_inchestight)图γ0.99与α0.1组合收敛最快仅需327轮而γ0.9与α0.2组合需1892轮——差6倍关键发现高γ0.99需配低α0.05~0.1否则更新幅度过大导致震荡低γ0.9可容忍更高α0.2但最终reward上限被压制。这解释了为何教科书总推荐γ0.99——它不是“更好”而是在给定α下允许更快收敛。4.3 用统计检验确认差异显著性单纯看热力图不够严谨。scripts/test_significance.py用Kruskal-Wallis H检验非参数ANOVA验证不同γ组的final_avg_reward分布是否存在统计学差异from scipy.stats import kruskal import numpy as np df pd.read_csv(results/sweep_cliff_qlearning.csv) groups [df[df[gamma]g][final_avg_reward] for g in [0.9, 0.95, 0.99]] h_stat, p_val kruskal(*groups) print(fKruskal-Wallis H-test: H{h_stat:.3f}, p{p_val:.4f}) # 输出H12.874, p0.0016 → 差异极显著接着用Dunns post-hoc test定位哪两组差异最大from scikit_posthocs import posthoc_dunn # ... 计算后得到γ0.9 vs γ0.99 的p0.0003γ0.95 vs γ0.99 的p0.0082这意味着将γ从0.9提升到0.99对最终性能的提升是统计显著的而0.95到0.99的提升虽存在但置信度较低。这直接指导作业评分——若学生只测试了γ0.95应鼓励其验证γ0.99是否带来质变。4.4 教学级对比表格参数选择的代价与收益将上述分析浓缩为一张供学生自查的决策表参数推荐范围收敛速度影响最终性能影响调试难度α (learning rate)0.01 ~ 0.1α↑ → 初期快但易震荡α↓ → 稳定但慢α过高导致过拟合局部rewardα过低无法跳出局部最优高需配合learning rate schedulerγ (discount factor)0.95 ~ 0.99γ↑ → 长期reward权重↑收敛轮次↑γ↓ → 短视收敛快但易陷陷阱γ↑ → 更优长期策略γ↓ → 可能选“快死”路径如CliffWalking中直冲悬崖中需结合环境horizon分析ε (exploration rate)0.01 ~ 0.1训练末期ε↑ → 探索多收敛慢ε↓ → 利用多但可能早熟收敛ε衰减策略比固定值更重要线性衰减ε1→0.01 over 1000 eps优于指数衰减高需监控agent.epsilon实时值从那以后我每次带强化学习作业都强制学生在main.py开头加三行print(f[DEBUG] alpha{agent.alpha:.3f}, gamma{agent.gamma:.3f}, epsilon{agent.epsilon:.3f}) print(f[DEBUG] Env: {type(env).__name__}, States: {env.state_space}, Actions: {env.action_space}) print(f[DEBUG] Seed: {args.seed})这三行看似简单却能瞬间定位90%的“为什么我跑不通”的问题——参数不对、环境加载错、随机种子没设。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

开源代码评审工具 open-code-review:CLI+Git Diff+LLM Agent 实战指南

开源代码评审工具 open-code-review:CLI+Git Diff+LLM Agent 实战指南

1. 项目概述:一个真正能落地的开源代码评审工具到底长什么样? “open-code-review”这个名字乍一听像某个 GitHub 上刚创建的空仓库,但如果你最近在开发者社区里刷到过相关讨论,大概率会发现它正悄悄成为团队协作中那个被反复提起…

2026/10/19 5:07:11 阅读更多 →
OpenCV模板匹配车牌识别毕设方案(含GUI+可调试流水线)

OpenCV模板匹配车牌识别毕设方案(含GUI+可调试流水线)

简介:本资源是一份基于OpenCV模板匹配实现的车牌识别Python毕业设计项目,面向计算机、人工智能、自动化等专业的本科生及初学者,用于课程设计、毕设参考或图像处理入门实践。项目完整实现了车牌定位、倾斜矫正、颜色识别、字符分割与模板匹配…

2026/10/19 5:07:11 阅读更多 →
AI让想法变廉价?真正的瓶颈是验证、筛选与理解

AI让想法变廉价?真正的瓶颈是验证、筛选与理解

最近反复琢磨一句话:AI 正在让“想法”变得廉价,而真正的瓶颈从未改变。这是数学家陶哲轩在公开讨论 AI 对数学研究影响时给出的判断。我盯着这句话看了很久,因为它精准地戳中了我们这个时代最隐蔽的焦虑——我们从来不缺想法,缺的…

2026/10/19 5:07:11 阅读更多 →

最新新闻

企业AI Agent定制:单条数据出错为何拖垮整批任务?

企业AI Agent定制:单条数据出错为何拖垮整批任务?

以一个假设场景为例,财务在助手中提交一批付款指令。系统在执行前逐条校验,其中一条收款方账号格式异常,整批校验随即中断,剩余九十九条记录也未进入后续处理。复核时才发现,整批任务被一条格式错误的数据阻断。这类单…

2026/10/20 10:58:55 阅读更多 →
笔记 1:思小伴 搭载 EEG 脑电专注力监测的多功能儿童陪伴桌宠

笔记 1:思小伴 搭载 EEG 脑电专注力监测的多功能儿童陪伴桌宠

笔记 1|作品概述:脑电桌宠到底是什么#智能硬件 #脑机交互 #竞赛作品 | 2026 全国大学生数字媒体科技作品及创意竞赛 智能软硬件赛道思小伴是一台放在书桌上的智能陪伴机器人。它要解决的不是“再做一个会说话的玩具”,而是儿童学…

2026/10/20 10:58:55 阅读更多 →
从会做题到会设计:数字电路实战能力跃迁指南

从会做题到会设计:数字电路实战能力跃迁指南

1. 为什么“会做题”和“会设计”是两套完全不同的能力我带过不少刚入门的同学,也跟很多工作了三五年的工程师聊过,发现一个特别普遍的现象:考试成绩很好的人,未必能独立完成一个像样的数字系统设计。反过来,有些在学校…

2026/10/20 10:58:55 阅读更多 →
单相DQ锁相环原理与STM32实时实现

单相DQ锁相环原理与STM32实时实现

简介:本资源是针对2022年全国大学生电子设计竞赛A题‘单相交流电子负载’的完整嵌入式实现方案,面向电赛备赛学生、电力电子方向初学者及STM32进阶开发者,重点解决单相系统下高精度锁相控制这一核心难点。工程基于STM32F407VET6主控&#xff…

2026/10/20 10:58:55 阅读更多 →
150款安卓游戏跑上iPhone,靠的不是模拟器

150款安卓游戏跑上iPhone,靠的不是模拟器

IT之家推了一条消息:开源项目 Husk 2.0 能让 iPhone 直接跑安卓游戏,兼容 150 多款,APK、XAPK、APKM、APKS 四种包都能导入,要求 iOS 16 以上,不需要越狱。 评论区的第一反应几乎一致:iPhone 什么时候能装安卓应用了。 能跑不新鲜,越狱还流行的年代就有人试过。做法不一样的地方…

2026/10/20 10:58:55 阅读更多 →
shadPS4 固件模块放置指南:把 .sprx 放进 sys_modules 让游戏跑起来

shadPS4 固件模块放置指南:把 .sprx 放进 sys_modules 让游戏跑起来

shadPS4 固件模块放置指南:把 .sprx 放进 sys_modules 让游戏跑起来 【免费下载链接】shadPS4 PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C 项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4 shadPS4 是面向 Wind…

2026/10/20 10:57:55 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →