深度学习里程碑:ResNet(残差网络)从理论到实战全解析

深度学习里程碑:ResNet(残差网络)从理论到实战全解析

目录

### 文章目录

  • [深度学习里程碑:ResNet(残差网络)从理论到实战全解析](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [目录](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [@toc](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [1. 引言:为什么我们需要 ResNet?](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [1.1 常见误区与调试技巧](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [2. 核心原理:残差学习与恒等映射](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [2.1 为什么要相加?](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [2.2 拓展概念:为什么叫"残差"?](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [3. 代码实现:构建一个残差块](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [3.1 正面示例:标准 BasicBlock (PyTorch)](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [3.2 错误实例:相加位置不对](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [4. 项目实战:基于 ResNet18 的病理图像分类](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [4.1 实战步骤](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [4.2 训练建议](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [5. 高级使用技巧:性能压榨](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [5.1 ResNet-D 改进版](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [5.2 混合精度训练 (Mixed Precision)](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [6. 实际工作中的应用建议](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [6.1 什么时候不该用 ResNet?](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [6.2 迁移学习技巧](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)
  • [7. 总结](#文章目录 深度学习里程碑:ResNet(残差网络)从理论到实战全解析 目录 @[toc] 1. 引言:为什么我们需要 ResNet? 1.1 常见误区与调试技巧 2. 核心原理:残差学习与恒等映射 2.1 为什么要相加? 2.2 拓展概念:为什么叫“残差”? 3. 代码实现:构建一个残差块 3.1 正面示例:标准 BasicBlock (PyTorch) 3.2 错误实例:相加位置不对 4. 项目实战:基于 ResNet18 的病理图像分类 4.1 实战步骤 4.2 训练建议 5. 高级使用技巧:性能压榨 5.1 ResNet-D 改进版 5.2 混合精度训练 (Mixed Precision) 6. 实际工作中的应用建议 6.1 什么时候不该用 ResNet? 6.2 迁移学习技巧 7. 总结)

1. 引言:为什么我们需要 ResNet?

在 2015 年之前,深度学习界普遍认为"网络越深,效果越好"。然而,当研究人员尝试将网络堆叠到 20 层甚至 50 层时,发现准确率反而下降了。这并不是由于过拟合,而是退化问题(Degradation Problem)

1.1 常见误区与调试技巧

  • 错误实例 :认为增加层数后损失函数(Loss)升高是因为梯度消失。
    • 纠正:在现代网络中,由于有了 Batch Normalization,梯度消失已得到缓解。深层网络 Loss 高主要是因为网络太难优化,无法学到恒等映射。
  • 调试技巧:如果你发现训练集上的 Loss 竟然比浅层网络还要高,那么优先考虑引入残差连接,而不是盲目增加学习率。

2. 核心原理:残差学习与恒等映射

ResNet 的核心在于残差块(Residual Block)。其数学表达为:
y = F ( x , { W i } ) + x y = F(x, \{W_i\}) + x y=F(x,{Wi})+x

2.1 为什么要相加?

传统的网络试图学习映射 H ( x ) H(x) H(x),而 ResNet 试图学习 F ( x ) = H ( x ) − x F(x) = H(x) - x F(x)=H(x)−x。当 F ( x ) = 0 F(x) = 0 F(x)=0 时,网络实现了恒等映射,保证了深层网络的性能至少不会比浅层网络差。

2.2 拓展概念:为什么叫"残差"?

"残差"在统计学中指观测值与预测值之间的差。在 ResNet 中,它指代的是输入 x x x 与理想映射 H ( x ) H(x) H(x) 之间的差异。通过学习这个"差值",优化难度大幅降低。


3. 代码实现:构建一个残差块

3.1 正面示例:标准 BasicBlock (PyTorch)

python 复制代码
import torch
import torch.nn as nn

class BasicBlock(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1):
        super(BasicBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(out_channels)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(out_channels)
        
        # Shortcut 连接:如果输入输出维度不一致,需要用 1x1 卷积对齐
        self.shortcut = nn.Sequential()
        if stride != 1 or in_channels != out_channels:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(out_channels)
            )

    def forward(self, x):
        identity = self.shortcut(x)
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)
        out = self.conv2(out)
        out = self.bn2(out)
        out += identity  # 残差相加
        out = self.relu(out)
        return out

3.2 错误实例:相加位置不对

  • 现象 :将 out += identity 放在 self.relu(out) 之后。
  • 结果:这样做会导致相加后的结果永远是正数,破坏了残差学习的数学性质,模型收敛速度会变慢。

4. 项目实战:基于 ResNet18 的病理图像分类

假设我们要处理医疗影像数据集 PathMNIST,识别 9 类组织切片。

4.1 实战步骤

  1. 数据预处理:由于 ResNet 默认输入是 224x224,而 PathMNIST 是 28x28,我们需要调整 Resize 或修改第一层卷积。
  2. 模型初始化:建议加载预训练权重,但修改分类头。
python 复制代码
from torchvision import models

model = models.resnet18(pretrained=True)
# 修改全连接层以适配 9 分类任务
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 9)

# 调试技巧:查看参数量
print(f"Total parameters: {sum(p.numel() for p in model.parameters())}")

4.2 训练建议

  • Loss 选择 :医疗图像常有类别不平衡,建议使用 Weighted CrossEntropy
  • 优化器 :对于 ResNet,SGD + Momentum 往往比 Adam 能获得更高的最终准确率,尽管 Adam 收敛更快。

5. 高级使用技巧:性能压榨

5.1 ResNet-D 改进版

在实际工业界,我们常使用 ResNet-D 结构。它在 Shortcut 通道使用 AvgPool 替代 Stride=2Conv,能够减少信息丢失。

5.2 混合精度训练 (Mixed Precision)

ResNet 结构非常适合使用 FP16 训练。

python 复制代码
from torch.cuda.amp import autocast, GradScaler

scaler = GradScaler()
with autocast():
    output = model(input)
    loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
  • 效果:在不损失精度的情况下,显存占用降低 40%,速度提升 2x。

6. 实际工作中的应用建议

6.1 什么时候不该用 ResNet?

  • 端侧设备 :如果你的模型要部署在低算力手机或嵌入式芯片,请优先选择 MobileNetV3ShuffleNet。ResNet 的计算量对于移动端依然偏重。
  • 超轻量级任务:如果特征非常简单,残差连接可能导致过度拟合。

6.2 迁移学习技巧

在工业级项目(如质检、安防)中,千万不要从零开始训练

  1. 先冻结 ResNet 的前两层(提取通用特征)。
  2. 用大容量数据集(如 ImageNet)的权重进行 Warm-up。
  3. 最后以极低的学习率全量微调。

7. 总结

ResNet 不仅仅是一个网络结构,它更是一种设计思想:通过 Shortcut 连接,让梯度在深层网络中"穿梭"自如。时至今日,无论是 Transformer 中的 Residual Connection,还是检测算法中的 Backbone,ResNet 的影子无处不在。


相关推荐
空中湖8 分钟前
Spring AI Agent 编排:ReAct 模式 + 多 Agent 协作实战
人工智能·spring·react.js
only-qi8 分钟前
RAG 工作机制详解:构建高质量知识库的技术全流程
网络·人工智能·rag
John_ToDebug14 分钟前
Git Stash 完全指南:临时保存工作区的艺术
人工智能·git·agent
feibaoqq14 分钟前
Atlas边端板卡AI识别:部署方法、技术实现、优劣及应用场景
人工智能·低空经济·低空安防
小保CPP21 分钟前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
吃饱了得干活22 分钟前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
Xzaveir24 分钟前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
ikun_文25 分钟前
Python进阶—函数编程
python·pycharm
FII工业富联科技服务26 分钟前
从灯塔工厂到AI Factory新模式:AI正在重构制造业的四大核心能力
大数据·运维·人工智能·重构·ar·制造
前端开发江鸟26 分钟前
从一个最小 Runtime Demo 看懂:陌生的 599 为什么不能重试
人工智能