首页/新闻资讯/正文详情

使用 Apache MXNet Gluon 创建神经网络:从 Dense 层到自定义 Block 与 HybridBlock 实战指南

发布时间:2026/9/20 22:22:47 来源:云帆数科 栏目:资讯中心
使用 Apache MXNet Gluon 创建神经网络:从 Dense 层到自定义 Block 与 HybridBlock 实战指南
使用 Apache MXNet Gluon 创建神经网络从 Dense 层到自定义 Block 与 HybridBlock 实战指南【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mx/mxnet本教程是 MXNet 快速入门系列的第 2 步聚焦于使用 Gluon 高阶 API 创建神经网络。你将学会从单个Dense全连接层出发依次掌握nn.Sequential快速堆叠网络、基于nn.Block定制任意网络架构含经典 LeNet、用Parameter编写自定义层以及利用HybridBlock在命令式与符号式编程之间自由切换并获得性能提升最后掌握模型的保存、加载与可视化方法。读完本文你可以独立用 Gluon 搭建、训练、导出并部署一个神经网络模型。前置知识本文默认你已完成本系列 Step 1: Manipulate data with NP on MXNet熟悉mxnet.np的数组操作。准备工作导入必要的包在 MXNet 中np包mxnet.np提供与 NumPy 一致的数组接口而神经网络的层与容器则位于 Gluon 的两个模块中mxnet.gluon.nn由 MXNet 团队维护的正式神经网络层模块mxnet.gluon.contrib.nn由社区贡献的实验性模块。使用下面的命令导入本步所需的包并调用npx.set_np()将 MXNet 切换到 numpy 风格模式from mxnet import np, npx from mxnet.gluon import nn npx.set_np() # Change MXNet to the numpy-like mode.从源码结构看gluon.nn中按类别组织了大量内置层顺序容器Sequential、HybridSequential、基础层Dense、Activation、Dropout、Flatten、卷积层Conv1D/2D/3D、池化层MaxPool、AvgPool系列、归一化层BatchNorm、LayerNorm等、嵌入层与高级激活层LeakyReLU、ELU、GELU等完整清单可查阅 gluon.nn API 文档。创建神经网络的第一个层Dense最基础的神经网络层是Dense 层全连接层 / 稠密连接层输入层的每个节点都与下一层的每个节点相连。创建一个输出维度为 5 的 Dense 层layer nn.Dense(5) layer # output: Dense(-1 - 5, linear)输出中的-1表示输入层大小在初始化时尚未指定会被推迟到第一次前向传播时根据输入数据形状自动推断。如果你事先知道输入维度可以直接通过in_units参数指定layer nn.Dense(5, in_units3) layerDense 层实现的计算为$$output \sigma(W \cdot X b)$$其中 $W$ 为权重矩阵、$b$ 为偏置向量、$\sigma$ 为激活函数。可以通过activation参数为层附加激活函数layer nn.Dense(5, in_units3, activationrelu)从源码来看Dense类定义在 python/mxnet/gluon/nn/basic_layers.py其完整签名支持更多参数use_bias默认True是否使用偏置、flatten默认True是否将输入除第一维外的所有维度展平、dtype默认float32、weight_initializer与bias_initializer默认偏置初始化为zeros。其forward内部通过npx.fully_connected完成矩阵乘加运算后再套用激活函数。初始化权重与前向传播创建网络后需要先初始化权重。Gluon 默认的初始化方式是在 $[-0.7, 0.7]$ 区间内均匀随机取值layer.initialize()Note关于初始化的深入探讨会在本系列的后续教程中展开。初始化完成后即可向网络输入数据执行前向传播forward pass。下面的例子创建形状为(10, 3)的随机输入x送入层中计算输出x np.random.uniform(-1, 1, (10, 3)) layer(x)输入为(10, 3)Dense 层输出形状为(10, 5)。当你未指定in_units参数时系统会在首次前向传播时根据输入数据自动推断输入维度。这一点在源码中由Dense.infer_shape实现basic_layers.py若flattenTrue会将除 batch 维外所有维度尺寸相乘得到in_units若flattenFalse则取最后一维作为输入维度。可以通过layer.params查看该层全部参数layer.params权重和偏置可以通过.data()方法访问layer.weight.data()使用 nn.Sequential 将层链成网络Sequential提供了一种快速搭建网络的途径适用于层像煎饼一样堆叠的常见网络结构每一层的输出直接作为下一层的输入。使用net.add()依次添加层即可。下面用它把前面的 Dense 层组合成一个 3 层多层感知机MLPnet nn.Sequential() net.add(nn.Dense(5, in_units3, activationrelu), nn.Dense(25, activationrelu), nn.Dense(2)) net层按照添加顺序排列索引从 0 开始可以用[]下标访问指定层net[1]从实现上看Sequential继承自Blockbasic_layers.pyadd()内部将每个子块追加到_layers列表并调用register_child注册forward()则按序执行所有子块并把上一块的输出作为下一块的输入。源码还提供了一条性能提示当Sequential的所有子层都是HybridBlock时会给出警告并建议改用HybridSequential以获得最佳性能——这正是后文要介绍的混合式容器。灵活创建自定义网络架构nn.Blocknn.Sequential只能使用gluon.nn中现成的层且预定义了顺序执行的前向函数。当内置层无法满足需求例如要搭建 ResNet 这类由可复用复杂组件构成的网络时就需要自定义架构。在 Gluon 中每一个神经网络层都由基类nn.Block定义。Block的核心职责是定义一个forward方法接收输入x产生输出。它既可以简单到只施加一个激活函数也可以组合多个层乃至多个 Block构建 ResNet 级别的复杂网络。自定义 Block 只需实现两个方法__init__创建所需的层forward定义前向计算逻辑。先看一个最小骨架class Net(nn.Block): def __init__(self): super().__init__() def forward(self, x): return x再看一个完整的 MLPclass MLP(nn.Block): def __init__(self): super().__init__() self.dense1 nn.Dense(5, activationrelu) self.dense2 nn.Dense(25, activationrelu) self.dense3 nn.Dense(2) def forward(self, x): layer1 self.dense1(x) layer2 self.dense2(layer1) layer3 self.dense3(layer2) return layer3 net MLP() net每个层内部的参数保存在Parameter类中可通过params()方法访问net.dense1.params从 block.py 的源码可以看出Block的设计精巧之处它的__setattr__会被重载——当你把子Block或Parameter赋值为实例属性时会自动完成注册register_child/ 加入_reg_params因此collect_params()可以递归收集整棵网络树上的全部参数这也是后续save_parameters、export等功能的基础。使用 Parameter 创建自定义层Blocks APIMXNet 用Parameter类保存每一层的参数。内置层如 Dense内部正是通过Parameter创建权重和偏置的如果你想在现有层基础上增加额外计算可以基于Parameter自己实现。先实例化参数用shape参数指定形状例如形状(5, -1)其中 -1 表示维度待推断from mxnet.gluon import Parameter weight Parameter(custom_parameter_weight, shape(5, -1)) bias Parameter(custom_parameter_bias, shape(5, -1)) weight, biasParameter还包含grad_req参数用于指定该参数梯度的捕获方式。默认值为grad_reqwrite即每次梯度写入 grad 时都会更新。底层机制上这让 Gluon 知道需要对其底层数组调用.attach_grad()。基于此可以创建自己的全连接自定义层——用nn.Block的骨架实现一个不带激活函数的w*x b计算class custom_layer(nn.Block): def __init__(self, out_units, in_units0): super().__init__() self.weight Parameter(weight, shape(in_units, out_units), allow_deferred_initTrue) self.bias Parameter(bias, shape(out_units,), allow_deferred_initTrue) def forward(self, x): return np.dot(x, self.weight.data()) self.bias.data()注意allow_deferred_initTrueParameter允许在对应数据尚未实例化之前就被创建。例如实例化 Block 时各参数的形状还需要推断Parameter会等待形状确定后再分配内存。dense custom_layer(3, in_units5) dense.initialize() dense(np.random.uniform(size(4, 5)))类似地可以用nn.Block完整复现经典的LeNet网络——前两段使用内置Conv2DMaxPool2D后接 Dense 层并将最后一层换成上面自定义的custom_layerclass LeNet(nn.Block): def __init__(self): super().__init__() self.conv1 nn.Conv2D(channels6, kernel_size3, activationrelu) self.pool1 nn.MaxPool2D(pool_size2, strides2) self.conv2 nn.Conv2D(channels16, kernel_size3, activationrelu) self.pool2 nn.MaxPool2D(pool_size2, strides2) self.dense1 nn.Dense(120, activationrelu) self.dense2 nn.Dense(84, activationrelu) self.dense3 nn.Dense(10) def forward(self, x): x self.conv1(x) x self.pool1(x) x self.conv2(x) x self.pool2(x) x self.dense1(x) x self.dense2(x) x self.dense3(x) return x lenet LeNet()使用自定义层作为最后一层的 LeNet 变体class LeNet_custom(nn.Block): def __init__(self): super().__init__() self.conv1 nn.Conv2D(channels6, kernel_size3, activationrelu) self.pool1 nn.MaxPool2D(pool_size2, strides2) self.conv2 nn.Conv2D(channels16, kernel_size3, activationrelu) self.pool2 nn.MaxPool2D(pool_size2, strides2) self.dense1 nn.Dense(120, activationrelu) self.dense2 nn.Dense(84, activationrelu) self.dense3 custom_layer(10, 84) def forward(self, x): x self.conv1(x) x self.pool1(x) x self.conv2(x) x self.pool2(x) x self.dense1(x) x self.dense2(x) x self.dense3(x) return x lenet_custom LeNet_custom()用 28×28 的单通道随机图像同时跑通两个 LeNet验证自定义层与内置层行为一致image_data np.random.uniform(-1, 1, (1, 1, 28, 28)) lenet.initialize() lenet_custom.initialize() print(Lenet:) print(lenet(image_data)) print(Custom Lenet:) print(lenet_custom(image_data))同样可以用.data方法访问任意一层的权重与偏置例如访问第一层的权重和第六层的偏置形状lenet.conv1.weight.data().shape, lenet.dense1.bias.data().shape使用预定义预训练架构如果不想从零搭建模型而是希望在常见数据集上用经典模型快速复现或作为 baselineGluon 的Model Zoo直接提供了开箱即用的现成架构例如计算机视觉领域的 ResNet、自然语言处理领域的 BERT 等对应 Gluon CV / Gluon NLP 模型库。在仓库内可通过 gluon 模型库目录 查看已收录的视觉模型实现。使用示例——加载预训练的 ResNet50 v2 并做一次前向传播from mxnet.gluon import model_zoo net model_zoo.vision.resnet50_v2(pretrainedTrue) net.hybridize() dummy_input np.ones(shape(1, 3, 224, 224)) output net(dummy_input) output.shape为网络选择编程范式命令式还是符号式MXNet 的 Gluon API 采用**命令式编程Imperative范式对熟悉 Python 的用户而言原型开发快、易于调试、控制流自然。但在后端MXNet 也可以通过符号式 / 声明式编程Symbolic / Declarative**把网络转换为静态图从而对算子进行底层优化。静态图的缺点是灵活性受限任何逻辑都必须编码为图中特殊的算子如scan、while_loop、cond而且难以调试。如何兼顾符号式编程的性能与命令式编程的灵活、易调试答案是HybridBlock。HybridBlock既可以用真实输入、真实函数以完全命令式的方式运行也可以作用于占位符以符号方式运行。Gluon 将大部分细节隐藏在底层通常只有在自己编写层时才需要了解其工作原理。先创建混合式顺序容器net_hybrid_seq nn.HybridSequential() net_hybrid_seq.add(nn.Dense(5, in_units3, activationrelu), nn.Dense(25, activationrelu), nn.Dense(2)) net_hybrid_seq调用hybridize()即可编译并优化HybridSequentialnet_hybrid_seq.hybridize()从源码看HybridSequentialbasic_layers.py与Sequential结构一致但继承自HybridBlock而hybridize()定义在 block.py它会递归地把整棵网络树转化为符号化图。此外仓库内 MLP 等内置层全部继承自HybridBlock意味着任何完全由内置层构成的网络都可以通过一次.hybridize()调用获得编译加速。使用 Parameter 创建自定义层HybridBlocks API在实例化自定义层时如果通过in_units指定了输入维度权重会按该形状初始化如果输入维度未知则形状被推迟到第一次前向传播时确定。对于自定义HybridBlock层可以定义infer_shape()方法让形状在运行时被推断class CustomLayer(nn.HybridBlock): def __init__(self, out_units, in_units-1): super().__init__() self.weight Parameter(weight, shape(in_units, out_units), allow_deferred_initTrue) self.bias Parameter(bias, shape(out_units,), allow_deferred_initTrue) def forward(self, x): print(self.weight.shape, self.bias.shape) return np.dot(x, self.weight.data()) self.bias.data() def infer_shape(self, x): print(self.weight.shape, x.shape) self.weight.shape (x.shape[-1], self.weight.shape[1]) dense CustomLayer(3) dense.initialize() dense(np.random.uniform(size(4, 5)))性能对比hybridize 前后的速度差为了直观感受混合化带来的加速可以对比网络在 hybridize 前后各执行 1000 次前向传播的耗时from time import time def benchmark(net, x): y net(x) start time() for i in range(1, 1000): y net(x) return time() - start x_bench np.random.normal(size(1, 512)) net_hybrid_seq nn.HybridSequential() net_hybrid_seq.add(nn.Dense(256, activationrelu), nn.Dense(128, activationrelu), nn.Dense(2)) net_hybrid_seq.initialize() print(Before hybridizing: %.4f sec % (benchmark(net_hybrid_seq, x_bench))) net_hybrid_seq.hybridize() print(After hybridizing: %.4f sec % (benchmark(net_hybrid_seq, x_bench)))再进一步HybridBlock是BlockAPI 的混合版本。与BlocksAPI 类似只需为HybridBlock定义接收输入x的forward函数MXNet 会在后端负责模型的混合化无需改动代码即可切换到符号式范式from mxnet.gluon import HybridBlock class MLP_Hybrid(HybridBlock): def __init__(self): super().__init__() self.dense1 nn.Dense(256, activationrelu) self.dense2 nn.Dense(128, activationrelu) self.dense3 nn.Dense(2) def forward(self, x): layer1 self.dense1(x) layer2 self.dense2(layer1) layer3 self.dense3(layer2) return layer3 net_hybrid MLP_Hybrid() net_hybrid.initialize() print(Before hybridizing: %.4f sec % (benchmark(net_hybrid, x_bench))) net_hybrid.hybridize() print(After hybridizing: %.4f sec % (benchmark(net_hybrid, x_bench)))只要一个HybridBlock的前向计算完全由其他HybridBlock组成就可以通过调用该块的.hybridize()方法编译这整段网络。由于 MXNet 的全部预定义层都是HybridBlock完全由预定义层组成的网络调用.hybridize()后即可编译并以更快的速度运行。保存与加载模型BlocksAPI 支持在训练期间或训练结束后保存模型便于部署推理、避免重新训练也支持用 Python 等训练生态丰富的语言训练、再用其他语言做推理。MXNet 提供两种保存方式仅保存 / 加载模型权重参数同时保存 / 加载模型权重与网络架构。方式一仅保存 / 加载模型参数使用save_parameters与load_parameters方法保存、加载模型权重。以最简单的layer为例这里保存的是训练后的模型参数file_name layer.params layer.save_parameters(file_name)要加载参数需要先重建模型结构再载入参数def build_model(): layer nn.Dense(5, in_units3, activationrelu) return layer layer_new build_model()layer_new.load_parameters(layer.params)Notesave_parameters与load_parameters适用于基于Block而非HybridBlock构建的模型。这类模型可能有复杂架构且在运行期间可能发生变化——例如用 if-else 条件语句在两个不同架构之间选择。方式二同时保存 / 加载模型参数与架构对于基于HybridBlock的模型网络架构是静态的、运行期间不会改变因此模型参数和架构都可以通过export、imports方法一并保存、加载。对上面的MLP_Hybrid调用export导出模型。从 block.py 中export的实现 看export会把网络架构导出为.json文件、模型参数导出为.params文件命名规则为{path}-symbol.json与{path}-{epoch 四位数}.params并支持epoch参数指定保存的轮次编号net_hybrid.export(MLP_hybrid)运行后会生成MLP_hybrid-symbol.json与MLP_hybrid-0000.params两个文件。注意export要求先对该块调用过hybridize()并至少完成一次前向传播否则会抛出RuntimeError提示先 hybridize 再 forward因为导出的符号图正是混合化缓存的结果。加载时使用gluon.nn.SymbolBlock.imports指定符号文件、输入名列表与参数文件import warnings with warnings.catch_warnings(): warnings.simplefilter(ignore) net_loaded nn.SymbolBlock.imports(MLP_hybrid-symbol.json, [data], MLP_hybrid-0000.params, deviceNone)加载完成后即可直接对数据执行前向传播net_loaded(x_bench)可视化模型结构summary()Block.summary()方法可以查看块的形状参数与参数信息。当多个块组合成一个模型后对模型调用summary()可以查看每个块的摘要、参数总数以及块在模型中的顺序。实现上Block.summary()block.py需要执行一次数据前向传播以构建捕获形状与参数所需的图另外该方法应在hybridize()之前调用因为hybridize会把图转换为符号图可能改变算子以进行最优计算。看下面三个例子单层网络layer、未混合化的 LeNet、以及混合化的 MLP Hybrid 网络。layer.summary(x)lenet.summary(image_data)layer和lenet都未混合化可以轻松打印摘要而net_hybrid之前已 hybridize直接调用net_hybrid.summary(x_bench)会抛出AssertionError。要为混合化网络打印摘要需要新建一个同架构的实例先打印摘要再 hybridizenet_hybrid_summary MLP_Hybrid() net_hybrid_summary.initialize() net_hybrid_summary.summary(x_bench) net_hybrid_summary.hybridize()下一步至此你已经掌握了用 Gluon 创建、定制、混合化、保存与可视化神经网络的完整流程。接下来可以学习如何自动计算梯度进入 Step 3: Automatic differentiation with autograd。本系列后续教程Step 4: 训练组件、Step 6: 训练神经网络会在此基础上展开损失函数、优化器与完整训练循环的讲解。参考阅读gluon.nn 模块 API 文档内置层完整清单Dense 层源码实现含in_units推断逻辑与全部构造参数Sequential / HybridSequential 源码实现顺序容器的注册与执行机制Block / HybridBlock 源码实现基类设计、参数自动注册与collect_paramsParameter 类源码实现参数声明、grad_req与延迟初始化模型导出实现export生成.json与.params文件的细节【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mx/mxnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

AzureML Designer 集成推荐系统模块:将 Recommenders 算法封装为可视化画布组件
AzureML Designer 集成推荐系统模块:将 Recommenders 算法封装为可视化画布组件

人工智能机器学习深度学习 【免费下载链接】recommenders Best Practices on Recommendation Systems 项目地址: https://gitcode.com/gh_mirrors/re/recommenders 点击查看 免费下载 本篇指南以 contrib/azureml_designer_modules 目录下的 README 与配套实现为核… · 2026/9/20 22:21:47

Apollo Client ErrorLink 完全指南:基于 `@apollo/client/link/error` 的 GraphQL 错误处理实战
Apollo Client ErrorLink 完全指南:基于 `@apollo/client/link/error` 的 GraphQL 错误处理实战

Apollo Client ErrorLink 完全指南:基于 apollo/client/link/error 的 GraphQL 错误处理实战 【免费下载链接】apollo-client The industry-leading GraphQL client for TypeScript, JavaScript, React, Vue, Angular, and more. Apollo Client delivers powerful c… · 2026/9/20 22:21:47

ComfyUI 工作流模板全解析:20 类 50 个预配置工作流,3 步跑通第一次出图
ComfyUI 工作流模板全解析:20 类 50 个预配置工作流,3 步跑通第一次出图

ComfyUI 工作流模板全解析:20 类 50 个预配置工作流,3 步跑通第一次出图 【免费下载链接】ComfyUI-Workflows-ZHO 我的 ComfyUI 工作流合集 | My ComfyUI workflows collection 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-Workflows-Z… · 2026/9/20 22:21:47

文生图工具中文提示词横评:6款工具理解力实测与选型指南
文生图工具中文提示词横评:6款工具理解力实测与选型指南

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

Caffeine缓存最佳实践清单:10个常见坑位与调优技巧
Caffeine缓存最佳实践清单:10个常见坑位与调优技巧

Caffeine缓存最佳实践清单:10个常见坑位与调优技巧 【免费下载链接】caffeine A high performance caching library for Java 项目地址: https://gitcode.com/gh_mirrors/ca/caffeine Caffeine 是 Java 生态中公认的高性能本地缓存库,被 Spring C… · 2026/9/21 7:19:53

深入 TanStack Table 的 Column 对象:获取方式、结构属性与状态交互完全指南
深入 TanStack Table 的 Column 对象:获取方式、结构属性与状态交互完全指南

前端UI组件 【免费下载链接】table 🤖 Headless UI for building powerful tables & datagrids for TS/JS - React-Table, Vue-Table, Solid-Table, Svelte-Table 项目地址: https://gitcode.com/gh_mirrors/ta/table 点击查看 免费下载 本指南面向… · 2026/9/21 7:19:53

Relay `useEntryPointLoader` Hook 深度解析:在 React 中安全加载 EntryPoint 与 render-as-you-fetch 实践
Relay `useEntryPointLoader` Hook 深度解析:在 React 中安全加载 EntryPoint 与 render-as-you-fetch 实践

Relay useEntryPointLoader Hook 深度解析:在 React 中安全加载 EntryPoint 与 render-as-you-fetch 实践 【免费下载链接】relay Relay is a JavaScript framework for building data-driven React applications. 项目地址: https://gitcode.com/gh_mirrors/rela… · 2026/9/21 7:19:53

open-design 设计系统实战:用 Slack 风格(aubergine 侧栏 + 浅色内容区)让 Agent 生成温暖专业的产品 UI
open-design 设计系统实战:用 Slack 风格(aubergine 侧栏 + 浅色内容区)让 Agent 生成温暖专业的产品 UI

open-design 设计系统实战:用 Slack 风格(aubergine 侧栏 浅色内容区)让 Agent 生成温暖专业的产品 UI 【免费下载链接】open-design 🎨 Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. &… · 2026/9/21 7:19:53

AI芯片选型:看懂TOPS、内存带宽与能效比,别再唯主频论
AI芯片选型:看懂TOPS、内存带宽与能效比,别再唯主频论

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

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化
Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡… · 2026/9/21 0:02:39

Word表格编号全攻略:从列表编号到题注交叉引用
Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技… · 2026/9/21 0:02:39

从第一个站到第二个站:独立开发者的静态网站选型与落地实践
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&… · 2026/9/20 0:00:41

Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行
Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行

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

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程
agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and … · 2026/9/21 0:00:18

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,… · 2026/9/21 0:00:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码