news 2026/4/17 23:31:39

对比多线程与batch(在极简单cnn上操作)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
对比多线程与batch(在极简单cnn上操作)

batch,从学习dos时,就认识了这个单词,它叫做批处理!

现在我发现他与并行或多线程是有差别的!

我们前头所有程序凡是用到batch,均是如下操作,比如batch=3:

输入一张图片,forward一次,backward一次

再输入一张图片,forward一次,backward一次,梯度累加第一次

再输入一张图片,forward一次,backward一次,梯度累加第二次

好batch=3了,我们更新一次每层的权值:

在我们极简cnn上体现如下:

for(batch=0;batch<3;batch++)

{

wcnn的偏差[1][0] += E偏导zII * aI[0];//梯度累加3次
wcnn的偏差[1][1] += E偏导zII * aI[1];
wcnn的偏差[1][2] += E偏导zII * aI[2];
wcnn的偏差[1][3]+=E偏导zII * aI[3];

}
————————————————

for(batch=0;batch<3;batch++)

{//梯度累加3次

wcnn的偏差[0][0] += delta11*a0[0] + delta12*a0[1] + delta21*a0[3] + delta22*a0[4];//0,1,3,4
wcnn的偏差[0][1] += delta11*a0[1] + delta12*a0[2] + delta21*a0[4] + delta22*a0[5];//1,2,4,5
wcnn的偏差[0][2] += delta11*a0[3] + delta12*a0[4] + delta21*a0[6] + delta22*a0[7];//3,4,6,7
wcnn的偏差[0][3]+=delta11*a0[4] + delta12*a0[5] + delta21*a0[7] + delta22*a0[8];//4,5,7,8

}

————————————————

//0,上面batch执行了三次,但更新只执行一次

//w1,第二层的一个卷积核
for (int i = 0; i < 4; i++)//卷积核执行更新一次
{
wcnn[1][i] = wcnn[1][i] - 常数a * wcnn的偏差[1][i]/3;
}

//w0,第一层的一个卷积核
for (int i = 0; i < 4; i++)//卷积核执行更新一次
{
wcnn[0][i] = wcnn[0][i] - 常数a * wcnn的偏差[0][i]/3;
}

以上就是我们的批梯度下降法,而多线程怎么做呢?

假定我们也开启三个线程,每个线程处理一幅图片,关键是这个线程动作是并发的!

如果说上面batch处理是一个人,轮流做了3次

而线程是3个人,每个人做一次!这就是多线程并发的好处,人多力量大,速度还快!

每个线程只做一次:

wcnn的偏差[1][0] += E偏导zII * aI[0];//梯度累加3次
wcnn的偏差[1][1] += E偏导zII * aI[1];
wcnn的偏差[1][2] += E偏导zII * aI[2];
wcnn的偏差[1][3]+=E偏导zII * aI[3];

以及:

wcnn的偏差[0][0] += delta11*a0[0] + delta12*a0[1] + delta21*a0[3] + delta22*a0[4];//0,1,3,4
wcnn的偏差[0][1] += delta11*a0[1] + delta12*a0[2] + delta21*a0[4] + delta22*a0[5];//1,2,4,5
wcnn的偏差[0][2] += delta11*a0[3] + delta12*a0[4] + delta21*a0[6] + delta22*a0[7];//3,4,6,7
wcnn的偏差[0][3]+=delta11*a0[4] + delta12*a0[5] + delta21*a0[7] + delta22*a0[8];//4,5,7,8

最后我们要判断线程结束了

比如说:if(线程1执行完成&&线程2执行完成&&线程3执行完成==1),再执行:

for (int i = 0; i < 4; i++)//卷积核执行更新一次
{
wcnn[1][i] = wcnn[1][i] - 常数a * wcnn的偏差[1][i]/3;
}

//w0,第一层的一个卷积核
for (int i = 0; i < 4; i++)//卷积核执行更新一次
{
wcnn[0][i] = wcnn[0][i] - 常数a * wcnn的偏差[0][i]/3;
}

这样看来,多线程会比批处理batch快很多!比如开启10个线程时,差别会更大!

以后,我的程序会超这个方向改进!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 9:18:56

无代码自动化测试工具评测

测试范式变革的时代机遇 随着数字化转型进入深水区&#xff0c;软件迭代速度呈现指数级增长&#xff0c;传统编码测试模式面临严峻挑战。无代码自动化测试工具通过可视化编程与AI辅助技术&#xff0c;正在重塑测试行业的工作范式。本文基于工具稳定性、学习成本、集成能力三大…

作者头像 李华
网站建设 2026/4/18 10:31:04

RJ45直通头藏着“组网救急密码”!7个高频场景+避坑技巧全拆解

作为电子工程师或运维人员&#xff0c;组网时难免遇到“网线不够长”“设备接口不够用”的突发状况&#xff0c;而体积小巧、成本低廉的RJ45直通头&#xff0c;往往能成为“救命神器”。但多数人只知它能接网线&#xff0c;却不懂不同场景下的选型和用法&#xff0c;今天就拆解…

作者头像 李华
网站建设 2026/4/18 10:56:22

【AI邪修·破壁行动】理解领域驱动设计DDD

关于【AI邪修破壁行动】 使用AI打破各种知识壁垒&#xff0c;让技术回归通俗。人生有限&#xff0c;别搞弯弯绕&#xff0c;享受简洁之美&#xff01; 今天我们干翻领域驱动设计。 原文&#xff1a;领域驱动设计&#xff08;DDD&#xff09; 1. AI翻译打破语言壁垒 以下是您…

作者头像 李华
网站建设 2026/4/17 16:01:48

基于Windows核心编程--句柄是什么?

基于Windows核心编程–句柄是什么&#xff1f; 什么是句柄&#xff1f; 句柄也就是在系统中指向某个控件或对象的唯一指针&#xff0c;系统可以通过这个句柄与所对应的空间或对象交互&#xff08;控制它&#xff09;。控件或对象与句柄的关系就好比电视机和遥控器&#xff0c;通…

作者头像 李华
网站建设 2026/4/14 5:07:06

LobeChat能否安排日程?个人时间管理AI管家

LobeChat能否安排日程&#xff1f;个人时间管理AI管家 在如今信息爆炸的时代&#xff0c;我们每天被会议、待办事项和突发任务包围。打开手机&#xff0c;日历App、待办清单、邮件、即时通讯工具各自为政——想改个会议时间&#xff0c;得先翻聊天记录确认内容&#xff0c;再进…

作者头像 李华
网站建设 2026/4/16 16:00:02

从零开始学AI:ToB领域大模型实践指南与工具推荐

文章分享了作者在toB领域学习AI的实践经验&#xff0c;强调动手实践的重要性。系统推荐了AI学习路径和工具&#xff0c;包括构建知识框架、理解智能体构建、学习Agent应用、掌握AI编程、探索大模型融合与数据分析等&#xff0c;并提供企业落地AI的分析框架&#xff0c;帮助读者…

作者头像 李华