被“张量(Tensor)”吓退?用C语言的指针和内存,一眼看穿深度学习的底牌

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案 LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。 阅读详情

被"张量(Tensor)"吓退?用 C 语言的指针和内存,一眼看穿深度学习的底牌

1. 开场暴击 别被"张量"这个词唬住了

PyTorch 教程翻到第一页,torch.tensor(...)。往下两行,标量、向量、矩阵、张量,四个词排着队走过来。再点开一个视频,弹幕开始聊物理学里的应力张量。合上电脑,你只记得一件事,这玩意儿好像很高深。

刚学完 C 的同学卡在这一步的特别多。可他们早就把最难的那部分学完了,只是没人告诉他们这两件事是连着的。

在写 C 的人眼里,Tensor 就是一段连续的内存,外加一张写着"这块内存怎么切"的纸条。 纸条上记着形状(shape)和步长(stride)。内存负责存数,纸条负责告诉你第 1 行第 2 列在哪。

你写过的 int arr[2][3],其实已经是一个二维 Tensor 了。差别只是 PyTorch 给它套了一层自动求导的外壳。

先别急着翻公式。我们把这段内存的地址打印出来,看它到底长什么样。

2. C 语言视角 二维数组在内存里长什么样

#include <stdio.h>

int main(void)
{
    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};

    for (int i = 0; i < 2; i++)
        for (int j = 0; j < 3; j++)
            printf("arr[%d][%d] = %d  addr = %p\n",
                   i, j, arr[i][j], (void *)&arr[i][j]);

    printf("sizeof(arr) = %zu  sizeof(arr[0]) = %zu\n",
           sizeof(arr), sizeof(arr[0]));
    printf("arr + 1 - arr = %td bytes\n",
           (char *)(arr + 1) - (char *)arr);
    printf("*(*(arr + 1) + 2) = %d\n", *(*(arr + 1) + 2));
    return 0;
}

我在本机用 MSVC 14.51 编译跑了一遍。地址每次运行会变,差值不变。

arr[0][0] = 1  addr = 0000009D598FF9A0
arr[0][1] = 2  addr = 0000009D598FF9A4
arr[0][2] = 3  addr = 0000009D598FF9A8
arr[1][0] = 4  addr = 0000009D598FF9AC
arr[1][1] = 5  addr = 0000009D598FF9B0
arr[1][2] = 6  addr = 0000009D598FF9B4
sizeof(arr) = 24  sizeof(arr[0]) = 12
arr + 1 - arr = 12 bytes
*(*(arr + 1) + 2) = 6

六个元素,地址从 ...9A0 一路排到 ...9B4,每两个挨着的差 4 字节,正好一个 int。

把这段地址画成一条线,二维的"行"就消失了。

地址   ...9A0  ...9A4  ...9A8  ...9AC  ...9B0  ...9B4
数据      1       2       3       4       5       6
下标    [0][0]  [0][1]  [0][2]  [1][0]  [1][1]  [1][2]

CPU 拿到的就是这么一条直线。它不认识第几行第几列,编译器的方括号语法帮我们把二维下标换算成了偏移量。

换算规则只有一条,编译器每次遇到方括号下标,做的都是下面这个加法。

&arr[i][j] = 起始地址 + (i * 3 + j) * sizeof(int)

arr[1][2] 对应 起始 + (1*3+2)*4 = 起始 + 20,也就是 ...9B4,里面躺着 6。

再看那行让新手头大的指针写法。它和上面的公式是同一件事,只是把加法交给了指针运算。

*(*(arr + 1) + 2)

把它拆开,一共三步,每一步都在做地址加法。

  • arr 退化为指向一整行(3 个 int)的指针,arr + 1 跳 12 字节,落到第二行开头。
  • *(arr + 1) 拿到第二行这个数组,再退化成 int*,+ 2 跳 8 字节。
  • 最外层 * 取值,拿到 6。

所谓"第 1 行第 2 列",全部工作就是算一次偏移量,然后读那个地址。 这也是 sizeof(arr[0]) 等于 12 的原因,一行 3 个 int,按行跨一步就是 12 字节。

顺带把那个让很多人挂科的坑填掉。arr + 1 跳 12 字节,arr[0] + 1 只跳 4 字节,两个名字看着像,类型完全不同。我在同一个程序里打印过这两个差值。指针加 1 跳多远,由它指向的类型决定,跟数组名字叫什么没关系。 arr 指向一整行,arr[0] 指向一个 int,步长自然差三倍。这一点后面看 stride 时会原封不动地回来。

拿刻度尺打个比方。内存像一把只刻了毫米的尺子,上面没有"行"这个单位。你说第 1 行第 2 列,等于说从零刻度往前数 5 格。

3. 深度学习的底牌 Tensor 只是换了皮的 C 数组

镜头切回 Python。

import torch

t = torch.tensor([[1, 2], [3, 4]])
print(t.shape)           # torch.Size([2, 2])
print(t.stride())        # (2, 1)
print(t.is_contiguous()) # True
print(t.flatten())       # tensor([1, 2, 3, 4])

torch.tensor 在 Python 层看着像变魔术。往下走,PyTorch 的 C++ 引擎申请了一块连续内存,把 1、2、3、4 依次放进去。做这件事的代码,和你写的 int arr[2][3] 在内存布局上没有区别。

它多带了两样东西,shape 和 stride。两边的术语可以一一对上。

C 语言里的说法PyTorch 里的说法
int arr[2][3]torch.zeros(2, 3, dtype=torch.int32)
一行 3 个 intshape 里的 3
跨一行要跳 3 个元素stride()[0] 等于 3
&arr[i][j] 的偏移算法i * stride[0] + j * stride[1]
数组首地址data_ptr()

拿快递柜打个比方。一排柜子从 0 号编到 5 号,物理上就是一条直线。快递员在纸上写"每行 3 个格子",于是 0、1、2 号叫第一行,3、4、5 号叫第二行。柜子一下都没挪,换的只是那张纸。

纸上那个数字就是步长。二维时,元素 (i, j) 的位置按这个式子算。

offset = i * stride[0] + j * stride[1]     单位是元素个数

stride[0] = 2 表示往下一行要跨过 2 个元素,stride[1] = 1 表示往右一列跨 1 个元素。t[1][1] 就是 1*2 + 1*1 = 3,读到第 4 个数,值是 4。

这个式子和上一节的 i * 3 + j 是同一条公式,只是把 3 和 1 换成了变量。Tensor 的"维"靠算出来,内存里并没有存"行"这个东西。

推广到三维也没有新东西。一批图片常写成 (B, H, W),步长相应是 (H*W, W, 1)。想取第 b 张图第 h 行第 w 列的像素,偏移就是 b*H*W + h*W + w*1。四维五维都只是在这个式子里多加几项。内存始终是一条直线,从来没长成立方体。

3.1 用 C 把 stride 亲手跑一遍

纯 C 就能验证,连框架都不用装。

#include <stdio.h>

int main(void)
{
    int data[6] = {1, 2, 3, 4, 5, 6};   // 底层只有这一条直线

    // 看法 A  2 行 3 列,步长 (3, 1)
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
            printf("%d ", data[i * 3 + j * 1]);
        printf("\n");
    }

    // 看法 B  转置,步长 (1, 3),data 一个字节都没动
    printf("\n");
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 2; j++)
            printf("%d ", data[i * 1 + j * 3]);
        printf("\n");
    }
    return 0;
}

本机跑出来的结果。

1 2 3
4 5 6

1 4
2 5
3 6

同一块 data,换一组 stride,一次读出原矩阵,一次读出转置矩阵。转置没有搬动任何数据,只换了数格子的规则。 view()、reshape()、permute() 在内存层面干的也是这件事。

3.2 PyTorch 里看 stride

u = t.t()                  # 转置
print(u.stride())          # (1, 2)
print(u.is_contiguous())   # False
print(u)                   # tensor([[1, 3], [2, 4]])

u 打印出来行列换了,底层内存还是 1、2、3、4。步长从 (2, 1) 变成 (1, 2),读的时候按新规则跳着取。

这里立着新手最常撞的一堵墙。

u.view(-1)        # 报错,view 要求底层连续
u.reshape(-1)     # 能跑,内部发现不连续,先复制一份再拉平

view 只肯改纸条,不肯动柜子。步长已经跳着走了,硬按一维顺序读会读出乱序数据,它直接拒绝。reshape 会重新申请一块连续内存,把数按新顺序搬进去,再给结果。一个不复制,一个可能悄悄复制。两行代码只差几个字母,性能和内存占用能差出一截。

还有个单位上的坑。NumPy 的 .strides 给字节数,PyTorch 的 .stride() 给元素个数。我在本机打印了一个 int32 的 2×3 数组。

a.shape      (2, 3)
a.strides    (12, 4)   字节,12 = 3 * 4
a.T.strides  (4, 12)   转置后不再连续
c.strides    (8, 4)    ascontiguousarray 复制后重新变连续

把 12 除以 4,就得到 PyTorch 会告诉你的 3。单位不同,规则相同。

切蛋糕的说法放在这里正合适。蛋糕还是那块蛋糕,view 换的是刀法,contiguous() 是重新烤一块再切。以后看到 transpose() 后面紧跟一句 contiguous(),你就知道那里花了一次拷贝的钱。

4. 灵魂拷问 为什么矩阵乘法能加速

神经网络里绝大部分算力花在矩阵乘法上。先看最原始的做法,三层 for。

#define N 3

void matmul(int a[N][N], int b[N][N], int c[N][N])
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        {
            int sum = 0;
            for (int k = 0; k < N; k++)
                sum += a[i][k] * b[k][j];
            c[i][j] = sum;
        }
}

拿 {{1,2,3},{4,5,6},{7,8,9}} 乘 {{9,8,7},{6,5,4},{3,2,1}},本机跑出的结果。

  30  24  18
  84  69  54
 138 114  90

算法一行公式都不用,就是固定次数的一乘一加。可这三层循环里,内存访问的脾气完全不一样。

  • a[i][k] 沿着行走,地址一次加 4 字节。
  • b[k][j] 沿着列走,k 每加 1 要跨过一整行。
  • c[i][j] 按行写,同样连续。

CPU 读内存不会一个字节一个字节地拿。它一次搬一整条缓存行,常见是 64 字节,够装 16 个 int。你顺着读,一次搬进来的后面 15 个数马上要用。你跳着读,搬进来的大半被丢掉,下一次又得重新搬。

我在本机做了一组对照。3000×3000 的 int 数组,重复遍历 10 遍求和,编译器关掉优化(MSVC 14.51,/Od)。

// 顺着行读
for (int i = 0; i < M; i++)
    for (int j = 0; j < M; j++)
        s1 += big[i][j];

// 跳着列读
for (int j = 0; j < M; j++)
    for (int i = 0; i < M; i++)
        s2 += big[i][j];
row-major 0.162 s   col-major 0.316 s   sums = 90000000 / 90000000

两次求的是同一批数,结果也一样,时间差了将近一倍。差的这一倍,全花在等内存上。 换成更大的矩阵、更慢的显存访问,这个差距还会放大。

GPU 把这件事推到极致。CUDA 里一批线程同时开工,相邻线程访问相邻地址时,硬件能把几十次零散请求合并成一次宽的显存事务,这叫合并访存。数据要是散在各处,同一批线程就得排好几次队,几千个核心一起干等。显卡算力再强,也得先让数据排好队。

AI 框架底层那堆 BLAS、cuBLAS、oneDNN,把分块、循环展开、向量化指令和寄存器复用都做进了 C 与 Fortran 代码里,目标只有一个,让连续内存被读得又快又满。你在 Python 里写一行 torch.matmul(a, b),底下干活的是它们。

有人会问,既然三层循环里 b[k][j] 跳着读会慢,底层库干吗不先把 b 转置一份?它们确实会做类似的事,只是手法更细。把大矩阵切成能塞进高速缓存的小块,让每个小块内部尽量连续,再配合向量化指令一次算多个数。分块切多大,是这些库几十年攒下来的手艺。

回头看第 3 节那个 contiguous(),动机就清楚了。框架宁愿多花一次拷贝,也要把数据重新摆成连续的一条线,好让后面的矩阵乘法吃到顺序读取的红利。

5. 总结与避坑

学 AI 要补数学,这点不用怀疑。可模型能不能跑起来、跑多快、显存会不会爆,答案经常藏在你大一就学过的内存里。

shape 说明怎么切,stride 说明怎么走,那块连续内存才是数据本身。

把下面几条记进笔记,能省下不少对着维度报错发呆的晚上。

  1. shape 变了,数据未必搬了。 transpose、permute 和多数切片只改 stride 与起始偏移。
  2. view 要求连续,reshape 可能复制。 想确认有没有多花一次内存,看 is_contiguous()。
  3. dtype 决定一步跨多少字节。 float32 一个元素 4 字节,float64 是 8 字节。NumPy 的 strides 直接给字节,PyTorch 给元素个数,别把两个数混着算。
  4. CPU 上的 Tensor 送到 GPU,搬的是整块连续内存。 t.to("cuda") 这一步的耗时和显存占用,都按这块内存的大小算。
  5. 别用 Python 循环手写矩阵乘法。 交给 torch.matmul,让底层库去管缓存和并行。
  6. 遇到维度变换,先问两个问题。 步长变成多少了,有没有发生复制。这两件事想明白,view、reshape、flatten、permute 就只是一组换规则的写法。

回到开头那句话。你学过 &arr[i][j],学过指针偏移,学过数组在内存里连成一条线。这些知识没有因为换成 Python 就作废,它们只是被 PyTorch 藏进了一层封装里。

下次看见 x = x.view(B, -1, H, W),别急着翻公式。在心里画一条连续的格子,想想这把刀往哪儿切。

Tensor 没打算吓退谁。它一直是你认识的那块内存,换了个名字而已。

被“张量(Tensor)”吓退?用C语言的指针和内存,一眼看穿深度学习的底牌

深度学习之Encoder-Only原理与实战 【代码】深度学习之Encoder-Only原理与实战。 阅读详情

相关推荐

深度学习之Seq2Seq原理与实战

【代码】深度学习之Seq2Seq原理与实战。

yumiwangzi30的博客 136

static 的三种用法:C 语言里一个关键字的三张面孔

本文系统讲解 C 语言中 static 关键字的三种用法:修饰局部变量延长生命周期、修饰全局变量与函数限制作用域到本文件。通过一个包含三个文件的完整工程示例对照演示,并从存储期、作用域与链接性三个属性解释其统一原理,最后补充单元测试框架偏爱 static 函数的工程实践。

大模型全栈工程师 · Thanks_ks 325

深度学习之TF-IDF原理与实战

【代码】深度学习之TF_IDF原理与实战。

yumiwangzi30的博客 194

深度学习0:数学知识:正态分布1

步骤内容结果1引入e−x2e^{-x^2}e−x2钟形曲线2算它的面积I∫−∞∞e−x2dxI∫−∞∞​e−x2dx3平方变成二重积分I2I^2I24换极坐标简化计算5算出I2πI^2 = \piI2πIπIπ​6代入σ\sigmaσ和μ\muμ做变量替换得到σ2πσ2π​7除以它归一化得到正态分布公式2π2π​不是随便写的,它来自高斯积分∫−∞∞e−x2。

tellmewhoisi的博客 202

深度学习之LoRA(低秩适配)原理与实战

【代码】深度学习之LoRA(低秩适配)原理与实战。

yumiwangzi30的博客 262

深度学习之词袋(Bag-of-Words, BoW)原理与实战

【代码】深度学习之词袋(Bag-of-Words, BoW)原理与实战。

yumiwangzi30的博客 226

【原创深度学习项目】基于深度学习的建筑工地防护装备检测系统|安全帽与反光衣检测系统(RT-DETR-L 模型)

本文设计并实现了一套基于RT-DETR-L的建筑工地防护装备检测系统,采用Django+Vue前后端架构,实现对安全帽、反光背心等7类装备及“无PPE”“未戴安全帽”等缺失状态的精准识别。系统支持图片、视频、摄像头实时检测,具备参数可调、数据可视化与统计分析功能,有效解决小目标漏检、误检及管理难问题,助力智慧工地安全管理落地。文末可获取源码。

qq_1445749146的博客 223

深度学习之LSTM原理与实战

【代码】深度学习之LSTM原理与实战。

yumiwangzi30的博客 131

图解循环神经网络(RNN)

RNN(循环神经网络)就是“带记忆的网络”:让网络拥有一块“记忆”,在处理当前数据时,能同时参考之前看过的内容;它不一次性看完全部输入,而是像人读书一样,一个字一个字地读,每读一个字就更新一次脑子里的记忆,然后用这份记忆去理解当前这个字。但便签一直在被改写,新信息不断挤占旧信息,传到第 40 步时,“巴黎”的痕迹已经淡得几乎没了。读到“贵”的时候,网络并没有重新去查“好看”这个词——但“好看”的影响已经融在了便签里(那个 1.5)。这三个困难的共同点:答案不在当前这一个字里,而在“前面那串东西”里。

技术管理两手抓,两手都要硬. 375

AI对战五子棋——深度学习策略网络

在本篇博文中,我们完成了:✔ 构建一个 CNN 五子棋策略网络✔ 让神经网络输出落子概率✔ 使用 Policy Gradient 强化学习训练 AI✔ 让 AI 实现人与 AI、AI 自对弈博弈。

X2829352498的博客 31

汇川伺服驱动器参数优化实战指南

本文详细介绍了汇川伺服驱动器参数优化的实战技巧,涵盖控制模式选择、电子齿轮比调整、刚性匹配与振动抑制等关键内容。通过实际案例和实用技巧,帮助工程师快速掌握伺服驱动器参数调校方法,提升设备运行精度和稳定性。特别针对高精度定位和高速响应场景提供了专业指导。

weixin_29070721的博客 735

神经网络入门指南:从 CNN、RNN 到 Attention

神经网络的学习,本质是“预测—比较—纠错”的循环;CNN 通过局部连接与权重共享理解图像;RNN 通过隐藏状态传递上下文;LSTM 和 GRU 用门控机制管理记忆;Encoder–Decoder 把理解与生成拆成两个阶段;Attention 则让模型在每一步都能主动寻找最相关的信息。到这里,我们已经走完了从普通神经网络到 Attention 的完整路线。下一篇将正式进入 Transformer,看看它如何摆脱 RNN 的顺序计算,又如何让每个 Token 直接找到与自己相关的信息。

爱敲代码的小黄 362

【论文翻译】VIT:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

VIT摘要介绍相关工作模型VISION TRANSFORMER (VIT)微调和高分辨率实验结论 摘要 虽然Transformer架构在自然语言处理任务中已经成为事实标准,但是它在计算机视觉领域的应用仍然受限。在视觉领域,注意力要么和卷积网络结合使用,要么替换卷积网络中的某些部分,同时保持整体结构不变。本文表明对CNNs的依赖不是必要的,纯转换器(pure transformer)直接应用于图像块(image patches)序列在图像分类任务中能发挥很好的作用。当对大量数据进行预训练并把它转移到多个中型或

栗子菜菜 1846

基于深度学习的垃圾分类系统的设计与实现

本系统是一个基于 Flask Web 框架与 PyTorch 深度学习模型的垃圾分类智能识别平台。系统面向垃圾图像分类场景,能够对上传图片中的玻璃、纸张、纸板、塑料、金属、其他垃圾等六类垃圾进行自动识别与置信度评估,并提供识别历史、数据统计、模型在线训练与记录导出等完整功能。系统使用 TrashNet 公开垃圾分类数据集进行模型训练,管理员可手动发起模型训练,训练完成后自动加载新权重。启动服务不会自动训练。

aiyuanma_vip的博客 386

【STM32项目】老人健康跌倒检测系统实现(附教程PCB资料)

功能概述 跌倒检测 倾倒告警,人体角度倾斜至阈值触发蜂鸣报警 异常运动,加速度超过正常行动阈值时触发报警 心率监测 实时检测心率数据 血氧监测 实时检测采集血氧 血压测量 血压在线测量 红外体温 非接触体温采集方案 接触式体温采集方案 实时定位 中科微GPSGT-U12双频GPS北斗 GLONASS IRNSS定位系统 NEMA数据解析 可扩展高精度定位方案厘米级 屏幕显示 数据采集显示 告警阈值设置 语音提示 1欢迎使用老人智慧监测系统

洋洋的博客 1万+

灰度发布、蓝绿部署、双活架构与数据同步/备份/迁移

本文系统介绍了现代互联网系统的核心部署策略与数据管理技术体系。主要内容包括:1)三种服务发布策略(灰度发布、蓝绿发布、滚动发布)的原理、实现方式和适用场景对比;2)高可用架构设计(同城双活、异地双活、异地多活)的技术方案;3)数据同步机制、备份策略与迁移方案的设计要点。文章通过架构图、流程图和配置示例详细展示了各类技术的实施方法,并分析了不同方案的优劣及风险控制措施,为构建高可用、高可靠的分布式系统提供了完整的技术指南。

zane的博客 515

CNN 卷积神经网络深度解析:卷积、池化与特征提取的底层原理

卷积核(Kernel),也叫滤波器(Filter),本质上是一个可以训练的权重矩阵。1 0 -11 0 -11 0 -1这个卷积核可以对图像中的局部像素进行加权计算。不同的卷积核能够提取不同类型的特征:水平边缘特征垂直边缘特征纹理特征角点特征局部形状特征在传统图像处理中,滤波器通常由人工设计。而在 CNN 中,卷积核的权重通过训练数据和反向传播自动学习得到。这也是 CNN 能够自动提取图像特征的关键。# 第一层卷积padding=1# 第二层卷积padding=1。

2503_90237586的博客 247

[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向破解

这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。上一篇文章分享了IDA Pro反汇编工具的基础用法,并简单讲解一个EXE逆向工程解密实战方法;本篇文章将讲解动态分析OllyDbg工具的基础用法,主要是结合两个Crakeme案例逆向破解。希望对初学者有帮助,大神请飘过,谢谢各位看官!

杨秀璋的专栏 1万+

图解常用深度学习优化器

来隐式构造 Hessian 逆的近似,从而直接估计出“谷底在哪”,而非仅仅判断“哪边最陡”。即SGD/Adam 主要看“当前坡度”,LBFGS 还会看“最近几步坡度怎么变”,像用局部地形图来规划路线。训练 Transformer 时,有些层梯度大,有些层梯度小。如果用 Adam + L2,梯度大的参数反而可能被“少衰减”,正则效果不稳定;:你要下山,但每次迈步前都要派侦察兵把整座山的每一个坡面都测量一遍,算出“绝对最陡”的方向才走一步。:还是下山,但这次你只问身边一个路人“哪边最陡”,然后就走。

技术管理两手抓,两手都要硬. 201

uniapp H5刷新页面后返回按钮失效问题完美解决方案

这个问题其实很隐蔽,尤其是uniapp H5 场景下刷新导致栈清理,很多开发者一开始都懵掉了。uniapp 内部对「页面栈只有一个」时的返回逻辑是reLaunch;所以只要在这个分支里替换为自己的逻辑(比如),就能顺利实现预期。目前我在项目里已经跑通了,暂时没发现问题。不得不说,知道源码里这个逻辑后,真的是醍醐灌顶,只能膜拜框架大佬了 🤯。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 524

华为OD机试真题2025双机位A卷 C语言 实现【采购订单】

在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。

MISAYAONE的博客 352

基于深度学习的猫图像目标检测方法研究:YOLOv8s模型海选、多种子对比训练与Django+ONNX部署实现详解

本课题基于深度学习研究猫图像目标检测问题。数据集含1000张猫图像、1188个标注框,按固定比例划分并冻结清单;训练前在多个候选族中短训海选,确定YOLOv8s为主模型,经学习率搜索与显存标定后完成150轮训练,验证集mAP50达到0.92,并以7个随机种子的对比实验验证稳定性。最优权重导出为ONNX接入Django系统,提供图片、视频、摄像头三种识别方式,配套识别记录管理与统计大屏,形成从训练到应用的完整闭环。

WEIXIN_JSJBSZDS的博客 191

X书关键词协议搜索

【代码】X书关键词协议搜索。

Codeooo 博客 6377

深度学习0:数学知识:正态分布2(积分,幂函数积分公式)

积分符号∫(\int∫= 把无数个极窄的小矩形面积(高度×dx(\times dx×dx))“拼接”起来。dx(dxdx= 无穷小的宽度。定积分的结果= 曲线下方的总面积(一个具体的数字)。不定积分= 寻找求导前的那个原函数。这就是“积分求面积”最朴素的意思!

tellmewhoisi的博客 210

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

无人机巡检道路路面异常检测数据集 深度学习 目标检测 无人机巡检 道路病害 路面异常 YOLO格式 数据集发布9028期

无人机巡检道路路面异常检测数据集 深度学习 目标检测 无人机巡检 道路病害 路面异常 YOLO格式 数据集发布9028期

qq_2529413168的博客 190

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Python毕设实战:YOLO11+Django实现基于深度学习的面部关键特征识别与检测系统(附核心代码)

针对人脸图像中五官特征自动定位的需求,本文设计并实现了基于深度学习的面部关键特征识别与检测系统。系统采用Python开发,使用约2793张标注图片完成YOLO11模型的训练与对比实验,支持导出PyTorch与ONNX格式;网站端基于Django与Vue构建,提供图片识别、视频识别、摄像头实时识别三种方式,识别结果写入历史记录,并通过统计大屏展示类别分布等数据。测试表明系统运行稳定,检测效果直观,具备一定实用价值。

WEIXIN_JSJBSZDS的博客 272

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 从“人工智障”到“智能”,没有激活函数的神经网络只是在叠直线
下一篇: 从迷路到下坡,一文看懂逻辑回归、损失函数与梯度下降的“铁三角“关系
爱聊灵光的维C
博客等级 码龄119天 34粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值