AI基石 | Python工具链(三):PyTorch入门 —— 炼丹炉已开,把 NumPy 扔进显卡里!

AI应用开发环境搭建指南:从Python虚拟环境到PyTorch与LangChain配置 在人工智能应用开发中,一个稳定、可复现的开发环境是项目成功的基石。其核心原理在于通过虚拟环境实现依赖隔离,确保不同项目间的库版本互不干扰。从技术价值看,这不仅能提升开发效率,还能避免因环境配置不当导致的兼容性问题,为后续模型训练、推理和部署提供可靠保障。在应用场景上,无论是自然语言处理、计算机视觉还是大模型应用开发,都需要配置包括编程语言环境、深度学习框架、模型推理库和硬件驱动在内的完整工具链。本文聚焦于AI应用开发环境搭建,详细介绍了如何通过Conda管理虚拟环境,正确安装PyTorch并配置CUDA支持 阅读详情

AI基石 | Python工具链(三):PyTorch入门 —— 炼丹炉已开,把 NumPy 扔进显卡里!

前言

在上一篇,我们手握 NumPy 和 Pandas,觉得自己已经能处理全世界的数据了。

但当你试图用 NumPy 手写一个神经网络时,你会撞上两堵墙:

  1. 算不动:矩阵一旦超过 10000 维,CPU 就开始发烫降频,NumPy 对此无能为力。
  2. 算不准:还记得微积分里的“链式法则”吗?如果神经网络有 100 层,手推导数公式会让你崩溃。只要写错一个符号,整个模型就废了。

今天,我们请出 AI 界的“屠龙刀” —— PyTorch。

它由 Meta (Facebook) 开源,它做对了最关键的两件事:

  1. 把张量搬到了 GPU 上(解决了“算不动”)。
  2. 实现了自动微分系统 Autograd(解决了“算不准”)。

系好安全带,我们要开始真正的“硬核”编程了。


一、 Tensor (张量):觉醒了“原力”的 NumPy

PyTorch 的 Tensor 在语法上几乎和 NumPy 的 ndarray 一模一样。这不是巧合,而是为了降低迁移成本。但 Tensor 多了两个核心属性:device(设备)和 grad(梯度)。

1. 设备感知:CPU vs GPU

NumPy 只能在 CPU 上跑,而 Tensor 可以随意切换领地。

import torch
import numpy as np

print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"CUDA版本: {torch.version.cuda}")
print(f"可用设备数: {torch.cuda.device_count()}")
print(f"当前设备: {torch.cuda.current_device()}")
print(f"设备名称: {torch.cuda.get_device_name(0) if torch.cuda.device_count() > 0 else '无GPU'}")

# 1. 创建 Tensor (和 NumPy 极其相似)
x_np = np.array([1, 2, 3])
x_pt = torch.tensor([1, 2, 3])  # 默认在 CPU

# 2. 桥接 NumPy
# 两者共享内存!修改一个,另一个也会变(如果在CPU上)
y_pt = torch.from_numpy(x_np)

# 3. --- 硬核时刻:搬运到 GPU ---
if torch.cuda.is_available():
    # 这行代码是深度学习加速 100 倍的关键
    device = torch.device("cuda")
    x_cuda = x_pt.to(device)

    print(f"数据在: {x_cuda.device}")
  
    # 注意:GPU 上的张量不能直接和 NumPy 交互,必须先 .cpu() 搬回来
    result = x_cuda.cpu().numpy()
    print(result)
else:
    print("没有显卡,只能用 CPU 跑代码,惨。")

# PyTorch版本: 2.9.1+cu126
# CUDA可用: True
# CUDA版本: 12.6
# 可用设备数: 1
# 当前设备: 0
# 设备名称: NVIDIA GeForce RTX 3060
# 数据在: cuda:0

干货 Tip:在写代码时,养成定义 device 的习惯,这是从脚本小子进阶到工程化的第一步。

2. 动态图机制 (Dynamic Computational Graph)

这是 PyTorch 战胜 TensorFlow 1.x 的杀手锏。

  • TensorFlow (旧版):先定义图(像画好电路板),再灌水(数据)。一旦出错,不知道是哪条线烧了。
  • PyTorch:边执行边建图。代码运行到哪,图就建到哪。你可以用 Python 的 if/else 随意控制网络结构。

二、 Autograd:自动微分的“黑魔法”

这是本篇最核心的干货。PyTorch 是如何知道怎么求导的?

当你创建一个 Tensor 并设置 requires_grad=True 时,PyTorch 就不再只把它看作一个数据,而是一个计算图的节点。

1. 追踪历史 (Tracking History)

PyTorch 会在后台启动一个“书记员”,记录你对这个张量做的每一次运算。

# 创建一个需要求导的张量 w (比如权重)
w = torch.tensor(1.0, requires_grad=True)
x = torch.tensor(2.0)

# 定义运算
y = w * x       # 第一步:乘法
z = y ** 2      # 第二步:平方

# 此时,PyTorch 悄悄建立了一张图:
# w -> [Mul] -> y -> [Pow] -> z

2. 反向传播 (Backward)

当你调用 z.backward() 时,PyTorch 会沿着刚才那张图反向跑一遍,利用链式法则自动计算出 z 对 w 的导数,并存入 w.grad 中。

z.backward() 

# 手推验证:
# z = (wx)^2
# dz/dw = 2(wx) * x = 2 * (1*2) * 2 = 8
print(f"PyTorch 算的导数: {w.grad}") # 输出 8.0

干货 Tip:

  • Leaf Node (叶子节点):像 w 这种我们自己创建的变量,才有梯度。像 y 和 z 这种中间运算结果,梯度在反向传播后会被释放以节省内存。
  • grad_fn:你可以打印 z.grad_fn,会发现它叫 <PowBackward0>,这就是 PyTorch 记录的“运算历史”。

三、 实战:手写线性回归(从原理到框架)

为了让你彻底理解框架的封装艺术,我们用两种方式实现同一个线性回归任务:拟合 y=3x+0.8y = 3x + 0.8y=3x+0.8。

方式一:低阶实现(手动挡)

这种写法能让你看清 PyTorch 到底在干什么。

import torch

# 1. 准备数据
X = torch.rand(100, 1)
y = 3 * X + 0.8 + 0.05 * torch.randn(100, 1) # 加点噪音

# 2. 初始化参数 (随机猜)
w = torch.randn(1, 1, requires_grad=True)
b = torch.randn(1, 1, requires_grad=True)

learning_rate = 0.1

for epoch in range(1000):
    # --- Forward (前向传播) ---
    y_pred = X @ w + b  # 矩阵乘法
    
    # --- Loss (计算误差) ---
    loss = (y_pred - y).pow(2).mean() # MSE Loss
    
    # --- Backward (反向传播) ---
    # 这一步会自动把 dLoss/dw 和 dLoss/db 算出来,存进 w.grad 和 b.grad
    loss.backward()
    
    # --- Update (更新参数) ---
    # 核心干货:为什么要用 no_grad?
    # 因为更新参数 w = w - lr * grad 是一个计算操作。
    # 如果不关掉梯度追踪,PyTorch 会以为这步操作也要算进计算图里,导致无限套娃和内存爆炸。
    with torch.no_grad():
        w -= learning_rate * w.grad
        b -= learning_rate * b.grad
        
        # 核心干货:为什么要 zero_grad?
        # PyTorch 的梯度默认是“累加”的(为了支持 RNN 等复杂网络)。
        # 在下一轮迭代前,必须把上一轮的梯度清零!
        w.grad.zero_()
        b.grad.zero_()

    if epoch % 100 == 0:
        print(f"Epoch {epoch}: w={w.item():.2f}, b={b.item():.2f}")
      
# Epoch 0: w=1.51, b=-1.53
# Epoch 100: w=2.95, b=0.82
# Epoch 200: w=2.99, b=0.80
# Epoch 300: w=3.00, b=0.80
# Epoch 400: w=3.00, b=0.80
# Epoch 500: w=3.00, b=0.80
# Epoch 600: w=3.00, b=0.80
# Epoch 700: w=3.00, b=0.80
# Epoch 800: w=3.00, b=0.80
# Epoch 900: w=3.00, b=0.80

方式二:高阶实现(自动挡)

这才是 AI 工程师每天写的代码。 我们使用 torch.nn (Neural Network) 和 torch.optim (Optimizer)。

import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt

# ==================== 设置随机种子 ====================
torch.manual_seed(42)

# ==================== 创建训练数据 y = 3x + 0.8 ====================
# 生成更多数据点
n_samples = 100
X = torch.randn(n_samples, 1) * 2  # 生成-2到2之间的随机数,增加数据范围
true_w = 3.0
true_b = 0.8
noise = torch.randn(n_samples, 1) * 0.2  # 添加少量噪声
y = true_w * X + true_b + noise

print("=" * 60)
print("数据生成信息:")
print("=" * 60)
print(f"样本数量: {n_samples}")
print(f"真实关系: y = {true_w:.1f}x + {true_b:.1f}")
print(f"X范围: [{X.min():.2f}, {X.max():.2f}]")
print(f"y范围: [{y.min():.2f}, {y.max():.2f}]")
print(f"添加噪声: 标准差 {noise.std():.3f}")

# ==================== 检查 GPU 可用性 ====================
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"\n使用设备: {device}")

# ==================== 可视化原始数据 ====================
plt.figure(figsize=(12, 4))

plt.subplot(1, 3, 1)
plt.scatter(X.cpu().numpy(), y.cpu().numpy(), alpha=0.5, label='数据点')
plt.plot(X.cpu().numpy(), (true_w * X + true_b).cpu().numpy(),
         'r-', linewidth=3, label=f'真实: y={true_w}x+{true_b}')
plt.xlabel('X')
plt.ylabel('y')
plt.title('原始数据 (y=3x+0.8)')
plt.legend()
plt.grid(True, alpha=0.3)


# ==================== 1. 定义模型 ====================
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)


# 创建模型并移到设备
model = LinearRegressionModel().to(device)
print(f"\n模型初始参数:")
print(f"初始权重: {model.linear.weight.item():.4f}")
print(f"初始偏置: {model.linear.bias.item():.4f}")

# ==================== 移动数据到设备 ====================
X_gpu = X.to(device)
y_gpu = y.to(device)

# ==================== 2. 定义损失函数和优化器 ====================
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 添加学习率调度器(可选,让训练更稳定)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=200, gamma=0.9)

# ==================== 3. 训练循环 ====================
print("\n" + "=" * 60)
print("开始训练...")
print("=" * 60)

losses = []  # 记录损失
weights = []  # 记录权重变化
biases = []  # 记录偏置变化

for epoch in range(2000):
    # 训练步骤
    optimizer.zero_grad()
    outputs = model(X_gpu)
    loss = criterion(outputs, y_gpu)
    loss.backward()
    optimizer.step()
    scheduler.step()  # 更新学习率

    # 记录
    losses.append(loss.item())
    weights.append(model.linear.weight.item())
    biases.append(model.linear.bias.item())

    # 打印进度
    if (epoch + 1) % 200 == 0:
        current_lr = scheduler.get_last_lr()[0]
        print(f'Epoch [{epoch + 1:4d}/2000], Loss: {loss.item():.6f}, '
              f'LR: {current_lr:.5f}, '
              f'w: {model.linear.weight.item():.4f}, '
              f'b: {model.linear.bias.item():.4f}')

# ==================== 4. 查看训练结果 ====================
print("\n" + "=" * 60)
print("训练完成!")
print("=" * 60)

final_w = model.linear.weight.item()
final_b = model.linear.bias.item()

print(f"\n真实关系: y = {true_w:.4f}x + {true_b:.4f}")
print(f"学习到的: y = {final_w:.4f}x + {final_b:.4f}")
print(f"权重误差: {abs(final_w - true_w):.4f}")
print(f"偏置误差: {abs(final_b - true_b):.4f}")

# ==================== 5. 可视化训练过程 ====================
plt.subplot(1, 3, 2)
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss (MSE)')
plt.title('训练损失曲线')
plt.grid(True, alpha=0.3)
plt.yscale('log')  # 对数坐标更清晰

plt.subplot(1, 3, 3)
plt.plot(weights, label='权重 w')
plt.plot(biases, label='偏置 b')
plt.axhline(y=true_w, color='r', linestyle='--', alpha=0.5, label='真实 w')
plt.axhline(y=true_b, color='g', linestyle='--', alpha=0.5, label='真实 b')
plt.xlabel('Epoch')
plt.ylabel('参数值')
plt.title('参数收敛过程')
plt.legend()
plt.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# ==================== 6. 最终拟合效果可视化 ====================
plt.figure(figsize=(10, 6))
plt.scatter(X.cpu().numpy(), y.cpu().numpy(), alpha=0.5, label='数据点')

# 真实直线
x_range = torch.linspace(X.min(), X.max(), 100).reshape(-1, 1)
y_true = true_w * x_range + true_b
plt.plot(x_range.numpy(), y_true.numpy(), 'r-', linewidth=3,
         label=f'真实: y={true_w:.2f}x+{true_b:.2f}')

# 预测直线
model.eval()
with torch.no_grad():
    x_range_gpu = x_range.to(device)
    y_pred = model(x_range_gpu).cpu()
plt.plot(x_range.numpy(), y_pred.numpy(), 'b--', linewidth=3,
         label=f'拟合: y={final_w:.2f}x+{final_b:.2f}')

plt.xlabel('X')
plt.ylabel('y')
plt.title(f'线性回归拟合结果 (y={true_w}x+{true_b})')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

# ==================== 7. 详细参数分析 ====================
print("\n" + "=" * 60)
print("详细参数分析")
print("=" * 60)

# 查看模型的所有参数和梯度
model.train()  # 切回训练模式以查看梯度
dummy_loss = criterion(model(X_gpu), y_gpu)
dummy_loss.backward()

for name, param in model.named_parameters():
    print(f"\n{name}:")
    print(f"  数值: {param.data.cpu().numpy().flatten()}")
    print(f"  梯度: {param.grad.cpu().numpy().flatten() if param.grad is not None else 'None'}")
    print(f"  是否需要梯度: {param.requires_grad}")

# ==================== 8. 测试预测 ====================
print("\n" + "=" * 60)
print("测试预测")
print("=" * 60)

test_X = torch.tensor([[0.5], [1.0], [1.5], [2.0], [2.5]]).to(device)
model.eval()

with torch.no_grad():
    predictions = model(test_X)

    print(f"{'输入 x':>10} | {'预测 y':>10} | {'真实 y':>10} | {'误差':>10}")
    print("-" * 50)
    for i, x in enumerate(test_X.cpu()):
        pred = predictions[i].cpu().item()
        truth = true_w * x.item() + true_b
        error = abs(pred - truth)
        print(f"{x.item():10.2f} | {pred:10.4f} | {truth:10.4f} | {error:10.4f}")

print("\n" + "=" * 60)
print("模型训练完成!")
print(f"最终损失: {losses[-1]:.6f}")
print("=" * 60)

============================================================
# 数据生成信息:
# ============================================================
# 样本数量: 100
# 真实关系: y = 3.0x + 0.8
# X范围: [-4.41, 4.44]
# y范围: [-12.35, 13.88]
# 
# 添加噪声: 标准差 0.178
# 
# 使用设备: cuda
# 
# 模型初始参数:
# 初始权重: 0.4801
# 初始偏置: 0.8415
# 
# ============================================================
# 开始训练...
# ============================================================
# Epoch [ 200/2000], Loss: 0.031221, LR: 0.00900, w: 3.0011, b: 0.8096
# Epoch [ 400/2000], Loss: 0.031214, LR: 0.00810, w: 3.0012, b: 0.8072
# Epoch [ 600/2000], Loss: 0.031214, LR: 0.00729, w: 3.0012, b: 0.8071
# Epoch [ 800/2000], Loss: 0.031214, LR: 0.00656, w: 3.0012, b: 0.8071
# Epoch [1000/2000], Loss: 0.031214, LR: 0.00590, w: 3.0012, b: 0.8071
# Epoch [1200/2000], Loss: 0.031214, LR: 0.00531, w: 3.0012, b: 0.8071
# Epoch [1400/2000], Loss: 0.031214, LR: 0.00478, w: 3.0012, b: 0.8071
# Epoch [1600/2000], Loss: 0.031214, LR: 0.00430, w: 3.0012, b: 0.8071
# Epoch [1800/2000], Loss: 0.031214, LR: 0.00387, w: 3.0012, b: 0.8071
# Epoch [2000/2000], Loss: 0.031214, LR: 0.00349, w: 3.0012, b: 0.8071
# 
# ============================================================
# 训练完成!
# ============================================================
# 
# 真实关系: y = 3.0000x + 0.8000
# 学习到的: y = 3.0012x + 0.8071
# 权重误差: 0.0012
# 偏置误差: 0.0071
# ============================================================
# 详细参数分析
# ============================================================
# 
# linear.weight:
#   数值: [3.0011792]
#   梯度: [-2.7798116e-05]
#   是否需要梯度: True
# 
# linear.bias:
#   数值: [0.8071371]
#   梯度: [8.128583e-06]
#   是否需要梯度: True
# 
# ============================================================
# 测试预测
# ============================================================
#       输入 x |       预测 y |       真实 y |         误差
# --------------------------------------------------
#       0.50 |     2.3077 |     2.3000 |     0.0077
#       1.00 |     3.8083 |     3.8000 |     0.0083
#       1.50 |     5.3089 |     5.3000 |     0.0089
#       2.00 |     6.8095 |     6.8000 |     0.0095
#       2.50 |     8.3101 |     8.3000 |     0.0101
# 
# ============================================================
# 模型训练完成!
# 最终损失: 0.031214
# ============================================================

可视化训练过程
线性回归拟合结果


四、 核心总结:PyTorch 的“五步心法”

不管你将来写的是简单的线性回归,还是最新的 ChatGPT (Transformer) 架构,其训练核心代码永远只有这五步。请把这段代码刻在 DNA 里:

# 1. 梯度清零:打扫战场,准备下一轮
optimizer.zero_grad()

# 2. 前向传播:模型根据输入做出预测
output = model(input)

# 3. 计算损失:看看预测错得有多离谱
loss = loss_fn(output, target)

# 4. 反向传播:把责任(梯度)分摊给每个参数
loss.backward()

# 5. 优化更新:参数根据梯度修正自己
optimizer.step()

五、 避坑与进阶建议

  1. Shape Mismatch (维度地狱):
    • 90% 的 PyTorch 报错都是因为矩阵维度对不上。
    • 干货技巧:在 forward 函数里,多插几句 print(x.shape),调试时极其有用。不要瞎猜,要看形状。
  2. Dataset 与 DataLoader:
    • 实际项目中,数据不是一次性塞进内存的(显存会爆)。
    • 你需要学习 torch.utils.data.DataLoader,它能帮你把数据切成小块(Batch),并在 GPU 训练的同时,利用 CPU 多进程预读取下一批数据。这是工业级训练的标配。
  3. Debug 技巧:
    • 如果你发现 Loss 不下降,或者变成 NaN,先检查学习率是不是太大了,再检查数据里有没有无穷大值,最后检查是不是忘了 optimizer.zero_grad()。

六、 结语:这才是 AI 的起点

恭喜你!学完这一篇,你才算真正拿到了进入 AI 殿堂的钥匙。

NumPy 让你理解了矩阵,Autograd 让你理解了学习,PyTorch 让你拥有了算力。

现在的你,已经具备了复现经典算法的能力。

下一阶段预告

我们将带着 PyTorch 这把屠龙刀,进入 【机器学习基础】。

我们不再手写 y=wx+by=wx+by=wx+b,而是要去挑战经典的分类问题:逻辑回归、决策树、SVM。我们将看看 AI 是如何把花哨的数据分类得井井有条的。

作业:

尝试修改上面的“高阶实现”代码,把 nn.Linear(1, 1) 改成一个包含隐藏层的神经网络(比如 nn.Sequential(nn.Linear(1, 10), nn.ReLU(), nn.Linear(10, 1))),去拟合一个非线性函数(比如 y=x2y=x^2y=x2)。体会一下深度学习的威力。

AI认证实操指南:如何用真实项目能力替代概念考试 AI认证不是知识测验,而是工程能力的具象化验证。从机器学习基础原理出发,核心在于能否驾驭真实数据清洗、模型训练调优与端到端部署落地——这直接决定你能否将算法转化为产线可用的服务。当前行业高度关注‘AI工程化’与‘MLOps实战’能力,尤其强调TensorRT模型优化、ONNX跨框架部署、Kubernetes服务编排等硬技能。真正被企业认可的证书,必须嵌入工业级数据集、完整CI/CD流程和业务指标对齐环节。本文聚焦AI认证的实操价值解构,帮你避开纯理论刷题陷阱,直击模型压缩、边缘部署、故障排查等高频工程痛点。 阅读详情

相关推荐

AI工程师选笔记本的实战决策框架:避开参数陷阱,聚焦真实训练瓶颈

深度学习笔记本并非单纯比拼GPU算力或CPU频率,其本质是构建一条高效、稳定、可持续的数据—计算—反馈链路。核心在于理解数据加载(DataLoader)、内存带宽、PCIe传输、混合精度支持与热管理等底层协同机制。例如,RTX 3060因CUDA生态成熟、TensorRT兼容性好,在PyTorch训练中常比纸面更强的RTX 4070更稳;而DDR5-4800内存相较DDR4可提升预处理速度40%,直击DataLoader瓶颈。这类影响模型收敛效率与调试体验的关键变量,远超电商页面的参数罗列。本文从工业级实操

caodaoxi的专栏 339

准备篇:搭建你的AI“炼丹炉“

本文将手把手指导你搭建一个完整的开发环境,从Python环境配置到GPU驱动安装,从预训练模型下载到数据集准备。我们将确保每一个步骤都清晰可执行,让你能够顺利地为"CSwiftVLM"的诞生准备好一切必要条件。

jiaquan3011的博客 974

PaddleOCR在医疗票据识别中的实战:从部署到业务字段提取

本文详细介绍了PaddleOCR在医疗票据识别中的实战应用,重点阐述了其离线部署方案与PP-OCRv3模型选型优势。针对医疗票据敏感数据不出本地的合规要求,文章提供了从环境搭建、模型配置到核心字段提取策略的完整流程,并分享了性能优化与系统集成的实践经验,有效解决了医疗票据自动化录入的难题。

weixin_29271053的博客 236

PyTorch 1.8来了!正式支持AMD GPU,炼丹不必NVIDIA

梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI1.8版本中,官方终于加入了对AMD ROCm的支持,可以方便的在原生环境下运行,不用去配置Docker了。△AMD ROCm只支...

量子位 3482

UM982模组在无人机精准农业中的实战应用:如何配置双天线RTK实现厘米级定位

本文深入解析了UM982双天线RTK模组在农业无人机中的实战应用。通过详细阐述其硬件集成、软件配置及抗干扰调试全流程,重点说明了如何利用双天线设计直接获取高精度航向,并结合BDS等多系统GNSS信号,实现农田复杂环境下的厘米级稳定定位,从而提升变量施肥、自动巡田等精准农业作业的效率与质量。

weixin_29304021的博客 504

nrf52840的uart0与uart1双串口使用

nrf52840的uart0与uart1双串口使用 项目原使用nrf52832,后面由于项目需要用到双串口,改用nrf52840,官方的例程没看到使用uart1的,找遍全网都没找到uart1的使用资料,有些不负责任的网文居然说40也只有一个uart,吓得俺赶紧又查看了一次datesheet,O得K、木鸭梨 SDK代码uart驱动中,搜索到uart1的驱动部分,说明官方驱动有uart1支持的 自己动手,丰衣足食吧,下面以nRF5_SDK_17.0.0_9d13099版本,在examples\ble_per

chhen168的博客 5625

PyTorch 1.8来了!正式支持AMD GPU,炼丹炉不止NVIDIA...

点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达梦晨 发自 凹非寺 来源:量子位(QbitAI)1.8版本中,官方终于加入了对AMD ROCm的支持,可以方便的在原生环...

阿木寺的博客 1122

STM32HAL库学习笔记九——LCD显示

本文不会对驱动编写做特别详细的描述,以记录CubeMX的部署流程为主。

weixin_44762233的博客 6918

深度学习项目训练环境:5分钟搭建PyTorch开发环境,开箱即用

本文介绍了如何在星图GPU平台上自动化部署“深度学习项目训练环境”镜像,快速搭建开箱即用的PyTorch开发环境。该环境预装了PyTorch、CUDA及常用数据科学库,用户可立即上传代码与数据集,快速启动图像分类、目标检测等模型的训练与验证任务,将精力聚焦于算法本身。

weixin_42502040的博客 325

【WSL】window11 安装WSL2配置conda环境及mlatom环境搭建

写这篇文章之前自己安装过两次环境,可能每次都会产生碰到同样的问题,为了搭建适合自己的虚拟环境保证每一步的正确性,按顺序记录一下。

wangxiancao的博客 1629

S型速度曲线C程序实现

S型速度曲线C语言程序实现 前言 S型曲线相较于梯形速度曲线具有运行更加平稳的特点,S型曲线共有八种运行情况,感兴趣可以查阅相关文献 代码段 #include <stdio.h> #include <math.h> #define FP64 double int main(void) { /**************************** 定义相关变量(需要映射到PLC寄存器才能进行监控) ***********************/ FP6

LSX312441548的博客 8392

Python深度学习:从入门到实战

亲爱的读者,欢迎您翻开这本书。我们即将探索的,是深度学习的宇宙——一个由数据、算法与算力构筑的奇妙世界。它既是严谨的科学,也是创造的艺术,更是一条通往未来智慧的修行之路。本书将带您从最基础的数学原理出发,亲手搭建神经网络,驾驭Transformer等前沿模型,最终将智慧转化为现实世界的价值。请放下畏惧,保持好奇。这不仅是一次知识的学习,更是一场思维的远行。来,随我一起,开启这趟非凡的旅程吧。

weixin_45747731的博客 241

保姆级教程:用Seurat 5.0.1搞定单细胞测序数据从质控到细胞注释的全流程

本文提供了一份详细的Seurat 5.0.1单细胞测序数据分析教程,涵盖从数据质控到细胞注释的全流程。通过R代码示例和可视化分析,帮助用户掌握单细胞RNA测序数据处理的核心技术,包括数据标准化、降维聚类和细胞类型注释,适用于生物信息学研究和临床数据分析。

weixin_29067143的博客 197

6 款电商 AI 图片生成软件实测|国内 + 跨境卖家工具清单

电商 AI 作图工具已经从 "能不能用" 进入了 "好不好用" 的阶段。对于绝大多数卖家而言,现在的 AI 工具已经可以覆盖 60%-80% 的基础商品图需求,显著降低拍摄和设计成本。选择工具的核心逻辑不是 "哪款最强",而是 "哪款最适配你的品类、平台规模和团队能力"。垂直电商工具胜在工作流效率,通用生图工具强在创意上限,模板类工具赢在上手速度。建议根据自身业务阶段,搭配 1-2 款主力工具 + 1 款辅助工具,形成适合自己的视觉生产流程。

Mardi_Ladin的博客 397

Python爬虫实战:爬取国家企业信用信息公示系统(最新反反爬技术解析)

在当今大数据时代,企业信用数据对于市场分析、风险评估和商业决策具有重要价值。国家企业信用信息公示系统作为官方权威的企业信息平台,包含了全国各类企业的注册信息、行政处罚、经营异常等关键数据。复杂的反爬机制(动态Token、验证码、请求频率限制)数据渲染方式多样(部分内容由JavaScript动态加载)法律与合规风险(需遵守《网络安全法》和网站Robots协议)本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的企业信用信息爬虫,并重点解析应对各种反爬策略的解决方案。

2201_76125261的博客 2696

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 223

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

您您这可以把问小白的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭

第三层是格式编译层。这个决策背后的判断很清晰:一个批量导出工具的价值,不在于“试三次”,而在于你真正用它处理了几十份技术文档、访谈记录或课程讲义之后,它是否值得留在你的工作流里。问小白的会话列表通过分页接口加载,AI导出鸭 在页面运行时建立旁路监听,捕获每一次分页请求返回的完整对话清单,包括会话 ID、标题、时间戳和隐藏的元数据字段。让AI导出回归优雅——这句话说的是:导出不该是体力活,而应该是一次完整的、可预期的文件交付。注意:这里的“批量”指的是左侧列表里的多个独立会话,不是一条会话内的多轮对话。

laoyunsi的博客 246

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 199

河道漂浮物目标检测数据集

目标检测,yolo,河道漂浮物目标检测数据集

DL_data_set的博客 201
上一篇: AI基石 | Python工具链(二):NumPy与Pandas —— 拒绝循环,像数学家一样操作矩阵
下一篇: AI基石 | 机器学习基础(一):经典算法三巨头 —— 逻辑回归、决策树与 SVM 的“华山论剑”
ipython_harley
博客等级 码龄7年 8粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值