训练正常,测试异常,什么鬼?(cudnn)
前天残差中加不进去bn层昨天残差中加不进去两个bn层昨夜残差中可以用两个bn层而且训练正常一测试就闪退什么鬼测试函数如下int last[10000];float test( LeNet net, cudaStream_t stream, cifar10DatasetTEST Dataset) {//使用10000float *d_inputs;unsigned *d_labels;for (int x 0; x10000; x){last[x] 0;}//输出的预测概率softmax后的结果损失预测概率的梯度作为LeNet反向传播的输入float *d_logits, *d_prob, *loss, *dlogits;int num_classes 10;cudaMalloc(d_inputs, 5 * 32 * 32 * sizeof(float));/*cudaMalloc(d_inputs, 3* 32*32 * sizeof(float));*/cudaMalloc(d_labels, 1*sizeof(unsigned));cudaMalloc(d_logits, 1*10*sizeof(float));cudaMalloc(d_prob, 1*10*sizeof(float));cudaMalloc(loss, 1*sizeof(float));cudaMalloc(dlogits, 1*10*sizeof(float));std::vectorfloat h_loss(1); std::vectorfloat h_prob(10);for (int epoch 0; epoch10000; epoch) {auto batch Dataset.next_batch(1);std::vectorunsigned h_labels(1);//取了一个图像一个标签也可以是train数据取10000for (int batch_idx 0; batch_idx1; batch_idx) {cudaMemcpy(d_inputs batch_idx * 32 * 32 * 5, batch[batch_idx].image.data(), 32 * 32 * 5 * sizeof(float), cudaMemcpyHostToDevice);/*cudaMemcpy(d_inputs batch_idx * 32 * 32 * 3, batch[batch_idx].image.data(), 32 * 32 * 3 * sizeof(float), cudaMemcpyHostToDevice);*/h_labels[batch_idx] batch[batch_idx].label;}cudaMemcpy(d_labels, h_labels.data(),1*sizeof(unsigned), cudaMemcpyHostToDevice);/* net.forward(d_inputs);*/net.forward2(d_inputs);cudaMemcpy(d_logits, net.get_output(), 1*10*sizeof(float), cudaMemcpyDeviceToDevice);softmax_forward_loss_batch 1, 1 (d_logits, d_labels, d_prob, loss, 1, num_classes);cudaStreamSynchronize(stream);// ---- 打印中间输出 ----cudaMemcpy(h_loss.data(), loss, 1*sizeof(float), cudaMemcpyDeviceToHost);cudaMemcpy(h_prob.data(), d_prob, 1 * 10 * sizeof(float), cudaMemcpyDeviceToHost);int ans 0;for (int i 1; i 10; i)if (h_prob[i] h_prob[ans]) ans i;//找到最大概率标号if (h_labels[0] ans)last[epoch] 1;//找出最大概率是不是与标签同同则ok//否则失败///* float avg_loss 0.f;// for (float l : h_loss) avg_loss l;// avg_loss / 1;*/// if (epoch % 1 0) { // 每个 epoch 打印一次// std::cout Count epoch//// 损失 h_loss[0]// max概率 h_prob[ans]// max响应标签 ans// (实际标签 h_labels[0] )// std::endl;// }}cudaFree(d_inputs);cudaFree(d_labels);cudaFree(d_logits);cudaFree(d_prob);cudaFree(loss);cudaFree(dlogits);float junzhi 0;int score 0;for (int i 0; i 10000; i){if (last[i] 1)score;}junzhi score / (float)100;std::cout test score junzhi std::endl;return junzhi;}因为是x64release实现很难debug最后改的一团糟而且上面程序一直正常运行当然刚开始我不敢想其他问题只能闷着头皮找自己的问题春天出去溜达一圈想了想可不可以像训练一样批处理出成绩这个注意好立马改void test2(int epochs, int batch_size, LeNet net, cudaStream_t stream, cifar10DatasetTEST Dataset) {float *d_inputs;unsigned *d_labels;//输出的预测概率softmax后的结果损失预测概率的梯度作为LeNet反向传播的输入float *d_logits, *d_prob, *loss, *dlogits;int num_classes 10;//cudaMalloc(d_inputs, batch_size * 32*32 *3 * sizeof(float));cudaMalloc(d_inputs, batch_size * 32 * 32 * 5 * sizeof(float));cudaMalloc(d_labels, batch_size*sizeof(unsigned));cudaMalloc(d_logits, batch_size*num_classes*sizeof(float));cudaMalloc(d_prob, batch_size*num_classes*sizeof(float));cudaMalloc(loss, batch_size*sizeof(float));cudaMalloc(dlogits, batch_size*num_classes*sizeof(float));std::vectorfloat h_loss(batch_size);int num_errorsTRain 0;auto t1 std::chrono::high_resolution_clock::now();for (int epoch 0; epochepochs; epoch) {auto batch Dataset.next_batch(batch_size);std::vectorunsigned h_labels(batch_size);for (int batch_idx 0; batch_idxbatch_size; batch_idx) {/*cudaMemcpy(d_inputs batch_idx * 32*32 * 3, batch[batch_idx].image.data(), 32 * 32 * 3 * sizeof(float), cudaMemcpyHostToDevice);*/cudaMemcpy(d_inputs batch_idx * 32 * 32 * 5, batch[batch_idx].image.data(), 32 * 32 * 5 * sizeof(float), cudaMemcpyHostToDevice);h_labels[batch_idx] batch[batch_idx].label;}cudaMemcpy(d_labels, h_labels.data(),batch_size*sizeof(unsigned), cudaMemcpyHostToDevice);net.forward2(d_inputs);cudaMemcpy(d_logits, net.get_output(), batch_size*num_classes*sizeof(float), cudaMemcpyDeviceToDevice);softmax_forward_loss_batch batch_size, 1 (d_logits, d_labels, d_prob, loss, batch_size, num_classes);cudaStreamSynchronize(stream);// ---- 打印中间输出 ----std::vectorfloat h_prob(10 * batch_size);cudaMemcpy(h_prob.data(), d_prob, batch_size * 10 * sizeof(float), cudaMemcpyDeviceToHost);for (int b 0; b batch_size; b){int ans 0;for (int i 1; i 10; i)if (h_prob[i b * 10] h_prob[ans b * 10]) ans i;//找到最大概率标号if (h_labels[0 b] ans)// last[epoch] 1;num_errorsTRain;}//// ---- 打印中间输出 ----//cudaMemcpy(h_loss.data(), loss, batch_size*sizeof(float), cudaMemcpyDeviceToHost);//float avg_loss 0.f;//for (float l : h_loss) avg_loss l;//avg_loss / batch_size;////if (epoch % 1 0) { // 每个 epoch 打印一次//// std::cout [Rank rank ] Epoch epoch//// Avg Loss avg_loss//// (first label h_labels[0] )//// std::endl;////}}auto t2 std::chrono::high_resolution_clock::now();printf(时间: %f ms\n, std::chrono::duration_caststd::chrono::microseconds(t2 - t1).count() / 1000.0f);printf(Test Classification result: %.2f%% ok (used %d images)\n, ((float)num_errorsTRain / (batch_size*epochs)) * 100.0f, (int)batch_size*epochs);//float *Junzhi get_u();//float *fangcha get_var();//运行输出值//for (int jf 0; jf 32; jf)// printf(均值: %f,方差:%f \n, Junzhi[jf], fangcha[jf]);cudaFree(d_inputs);cudaFree(d_labels);cudaFree(d_logits);cudaFree(d_prob);cudaFree(loss);cudaFree(dlogits);}调用如下test2(156, batch_size, LeNet_net, stream, DatasetsTest);//样本10000/64batch156轮竟然测试ok了这个是再mx550显卡上这是一种办法另外我把源程序在另一台电脑1060显卡上运行也是win10cuda9.0cudnn7.1.4老办法也成功了但1060显卡用不了batch64训练时改成batch32测试仍然用单样本说明什么问题方法总比问题多

相关新闻

如何禁止安装龙虾机器人、禁止电脑安装软件clawdbot程序?

如何禁止安装龙虾机器人、禁止电脑安装软件clawdbot程序?

给你一套可落地、抗绕过、兼顾安全与效率的方案,覆盖 Windows 系统主流场景,按成本与复杂度分级,按需选择。一、先讲核心结论(避免踩坑)Windows 原生组策略 / 注册表能拦截大部分安装,但无法 100% 阻止破解…

2026/7/16 19:31:56 阅读更多 →
天远入职背调报告API接入指南:Java微服务架构下的高并发履历筛查

天远入职背调报告API接入指南:Java微服务架构下的高并发履历筛查

突破履历造假防线:构建企业级数字背调中枢 在企业的高速扩张期、核心管理层更迭以及大规模劳务外包场景中,候选人背景的真实性直接关系到企业的核心资产安全与品牌声誉。传统的背景调查往往面临着数据维度单一、跨部门协同效率低下以及真伪难辨的困境。特…

2026/7/16 8:39:56 阅读更多 →
化繁为简:Access 与 SQL 创新指南(第二篇)

化繁为简:Access 与 SQL 创新指南(第二篇)

化繁为简:Access 与 SQL 创新指南(第二篇) 文章目录化繁为简:Access 与 SQL 创新指南(第二篇)第二篇:打破壁垒:Access 如何让普通人变身“开发者”2.1 相关概念2.2 如何安装 Microsoft Office Access 20192.3 熟悉 access 工作页面…

2026/7/15 11:02:46 阅读更多 →

最新新闻

界面组件DevExpress WPF v23.2新版亮点:富文本编辑器、电子表格组件升级

界面组件DevExpress WPF v23.2新版亮点:富文本编辑器、电子表格组件升级

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF控件日…

2026/7/16 20:45:01 阅读更多 →
mevi核心技术解析:深入理解ptrace与userfaultfd的完美结合

mevi核心技术解析:深入理解ptrace与userfaultfd的完美结合

mevi核心技术解析:深入理解ptrace与userfaultfd的完美结合 【免费下载链接】mevi A memory visualizer in Rust (ptrace userfaultfd) 项目地址: https://gitcode.com/gh_mirrors/me/mevi 在Linux系统编程领域,内存管理一直是一个复杂而关键的话…

2026/7/16 20:45:01 阅读更多 →
DeepSeek R1训练全流程揭秘:从基础模型到推理专家的进阶之路

DeepSeek R1训练全流程揭秘:从基础模型到推理专家的进阶之路

DeepSeek R1训练全流程揭秘:从基础模型到推理专家的进阶之路 【免费下载链接】train-deepseek-r1 Building DeepSeek R1 from Scratch 项目地址: https://gitcode.com/gh_mirrors/tr/train-deepseek-r1 DeepSeek R1是当前大语言模型领域的明星模型&#xff0…

2026/7/16 20:43:00 阅读更多 →
2026 新版小学 1-6 年级上册语文课内必背闯关资料 搞定默写丢分难题

2026 新版小学 1-6 年级上册语文课内必背闯关资料 搞定默写丢分难题

不少家长都有同款困扰:孩子语文课本背得挺流利,一到考试默写就频频丢分,不是写错别字就是漏句子,明明是送分的基础题,反倒成了失分重灾区。想帮孩子针对性练习,自己翻课本逐课划重点、整理必背篇目&#xf…

2026/7/16 20:40:59 阅读更多 →
CANN/asc-devkit Add函数文档

CANN/asc-devkit Add函数文档

# Add 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitc…

2026/7/16 20:38:59 阅读更多 →
如何安装Ursine主题?3种字体包选择指南与步骤详解

如何安装Ursine主题?3种字体包选择指南与步骤详解

如何安装Ursine主题?3种字体包选择指南与步骤详解 【免费下载链接】typora-theme-ursine A Typora theme, inspired by Bear 项目地址: https://gitcode.com/gh_mirrors/ty/typora-theme-ursine 想要为你的Typora编辑器换上优雅的Ursine主题吗?这…

2026/7/16 20:34:57 阅读更多 →

日新闻

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

本篇深入剖析 ImportantDays 项目的数据持久化方案——基于 HarmonyOS ArkData 模块的 Preferences 轻量级存储,以及 PreferenceUtil 工具类的单例封装。一、HarmonyOS 数据存储方案对比 HarmonyOS 提供了多种数据存储方案:方案适用场景特点Preferences轻…

2026/7/16 0:08:27 阅读更多 →
Python实现跨境电商商品图批量翻译教程

Python实现跨境电商商品图批量翻译教程

一、问题引入做跨境电商的卖家朋友,你是否遇到过这样的困扰?每次上架新品到亚马逊、Shopee或Lazada等平台,都需要处理大量商品图片的多语言版本。比如上架200款衣服,每款需要翻译成英语、日语、韩语等5种语言,这意味着…

2026/7/16 0:08:27 阅读更多 →
鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

从鸿蒙 7(HarmonyOS NEXT)开始,官方全面完成了从 ohos.* 零散模块到 kit.* 领域套件的体系重构。对开发者来说,第一道门槛不是 API 用法变化,而是统一的导入规范——旧体系默认导入、解构导入混用的混乱局面被彻底终结…

2026/7/16 0:10:29 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/15 17:52:08 阅读更多 →

月新闻