当前位置: 首页 > news >正文

训练正常,测试异常,什么鬼?(cudnn)

前天残差中加不进去bn层

昨天残差中加不进去两个bn层

昨夜,残差中可以用两个bn层,而且训练正常,一测试,就闪退,什么鬼?

测试函数如下:

int last[10000];
float test( LeNet &net, cudaStream_t stream, cifar10DatasetTEST &Dataset) {//使用10000
float *d_inputs;
unsigned *d_labels;

for (int x = 0; x<10000; 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::vector<float> h_loss(1); std::vector<float> h_prob(10);

for (int epoch = 0; epoch<10000; epoch++) {
auto batch = Dataset.next_batch(1);
std::vector<unsigned> h_labels(1);//取了一个图像一个标签,也可以是train数据取10000

for (int batch_idx = 0; batch_idx<1; 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;
}

因为是x64,release实现,很难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::vector<float> h_loss(batch_size);
int num_errorsTRain = 0;
auto t1 = std::chrono::high_resolution_clock::now();
for (int epoch = 0; epoch<epochs; epoch++) {
auto batch = Dataset.next_batch(batch_size);
std::vector<unsigned> h_labels(batch_size);
for (int batch_idx = 0; batch_idx<batch_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::vector<float> 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_cast<std::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/64batch=156轮

竟然测试ok了!这个是再mx550显卡上!

这是一种办法,另外我把源程序在另一台电脑1060显卡上运行!也是win10,cuda9.0,cudnn7.1.4,老办法,也成功了!但1060显卡用不了batch=64,训练时,改成batch=32,测试仍然用单样本!

说明什么问题?方法总比问题多

http://www.jsqmd.com/news/466316/

相关文章:

  • 智宅摸鱼GEO方案解析:认知层,让AI读懂品牌的第一步
  • Agent中篇 | 揭秘agent智能体如何思考、决策,并自主执行任务
  • 球笼优质定制厂家哪个品牌好用,快来了解 - myqiye
  • 2026年口碑好的气膜滑冰馆公司推荐:气膜运动馆厂家实力哪家强 - 行业平台推荐
  • OpenClaw的配置文件配置
  • Deepseek为人服务,使人进步
  • 闲置永辉购物卡回收技巧,轻松兑现! - 团团收购物卡回收
  • 并查集(非连通性问题)——# P2391 白雪皑皑
  • 购物卡变现攻略:永辉超市卡轻松回收! - 团团收购物卡回收
  • JavaFX 自动化测试工具现状与挑战:从技术栈到事件机制问题的系统总结
  • 平台要AI,但不允许AI批量生产内容
  • MySQL迁移中的兼容性与分布式稳态实践观察
  • AI智能体驱动金融网络安全升级:实战价值、风险治理与行业实践
  • 基于粒子群算法的含风光燃储微网优化调度:开启微网调度学习之旅
  • Windows服务再也不用熬夜盯盘了!这套自动化巡检+自愈脚本让我每天准点下班
  • 心智卡位:亚马逊广告从创意争夺到定位决胜的战略跃迁
  • OBC LLC Scan 模式软件详细设计报告
  • 2026年知名的水杉木桩品牌推荐:削尖杉木桩/杉木桩围栏/河道杉木桩可靠供应商推荐 - 行业平台推荐
  • 串联式、并联式、混联式混合动力系统simulink控制策略模型 有基于逻辑门限值、状态机的规则...
  • 访客一体机怎么用?它如何真正堵住安全漏洞,保障企业安全?
  • 国内申博背景提升攻略!申博有术 98 分,打造硬核学术实力拒绝形式化
  • PXE自动化安装:轻松部署Rocky9
  • NAD+ NMN十大品牌排名榜2026年NMN吸收率最高口碑好的抗衰优选榜首盼生派 - 速递信息
  • 输入网址,几分钟搞定专业宣传视频
  • HAL STM32 基础工程创建点灯
  • 龙虾社交上线40天被Facebook收购!俩文科创始人加入超级智能实验室
  • 2026年惠州韧达纳米售后服务怎么样,珠三角地区性价比高的派瑞林镀膜厂家有哪些 - 工业设备
  • 虚拟机安装(VM)(centos)使用linux
  • VueDevTools:快速定位源码路径
  • 被AI编程折磨的苦不堪言:一边喊真香,一边想砸键盘