向darknet无限逼近和倔强的自己对抗(向yolo致敬,cudnn微积分,二)

📅 2026/7/13 8:53:50
向darknet无限逼近和倔强的自己对抗(向yolo致敬,cudnn微积分,二)
先看笔记记录13:57 2026/7/11rtx2060显卡已经把add放在leaky之后learn rate1e-05时间: 20047.972656 ms13:58 2026/7/11先做一个稳扎稳打的版本train Classification result: 74.76% ok (used 49984 images)训练了25轮方差正常Test Classification result: 71.34% ok (used 9984 images)14:04 2026/7/11与add放在leaky之前得分对比mx550显卡win10cuda10.2cudnn7.6vs2015 cx64release的配置测试70.84分40轮learn rate1e-04自己那个最好的6bn2res版本14:07 2026/7/11rtx2060显卡win10cuda11.8cudnn8.6vs2019 cx64release的配置测试74.75分60轮train98.12learn rate1e-04自己那个最好的6bn2res版本14:10 2026/7/11看样子确实放leaky后效果好14:11 2026/7/11接下来测试两个残差第一个保持不变升维降维在第二残差中20轮方差才调整好25轮结束训练上了70分测试才22分为什么lr从0.01开始可以从0.1开始失败0.001开始失败第一改变第二不变0.001失败这些个尝试做记录即可最甲成绩产生lr从0.01开始两个残差第一个保持不变升维降维在第二残差中20轮方差才调整好30轮结束训练上了81分测试才75.46分为什么最后停止的lr0.00001保存一个版本下面看一下一个奇葩的网络架构象darknet但保留了倔强的自己layers.emplace_back(std::make_sharedConv2D(cudnn, batch, 5, 64, 32, 32, 3, 1, 1));layers.emplace_back(std::make_sharedBN(cudnn, batch, 64, 32, 32));layers.emplace_back(std::make_sharedLeakyRL(cudnn, batch, 64, 32, 32));layers.emplace_back(std::make_sharedresidualExt2(cudnn, batch, 64, 32, 32));layers.emplace_back(std::make_sharedMaxPool2D(cudnn, batch, 64, 64, 32, 2, 2, 0, 2));layers.emplace_back(std::make_sharedConv2D(cudnn, batch, 64, 128, 16, 16, 3, 1, 1));layers.emplace_back(std::make_sharedBN(cudnn, batch, 128, 16, 16));layers.emplace_back(std::make_sharedLeakyRL(cudnn, batch, 128, 16, 16));layers.emplace_back(std::make_sharedresidualExt3(cudnn, batch, 128, 16, 16));layers.emplace_back(std::make_sharedMaxPool2D(cudnn, batch, 128, 16, 16, 2, 2, 0, 2));layers.emplace_back(std::make_sharedLinear(cublas, batch, 128 * 64, 500));// layers.emplace_back(std::make_sharedConv2D(cudnn, batch, 64, 500, 7, 7, 7, 1));layers.emplace_back(std::make_sharedLeakyRL(cudnn, batch, 500, 1, 1));layers.emplace_back(std::make_sharedLinear(cublas, batch, 500, 10));//84-10这个其实就是自己自学cudnn一步一趋走上来的最好架构6bn2res不过不同的是把leakyrelu放在了add前头以及residualext3这个残差块使用了降维和升维抄到了darknet的精髓so我就看到了最奇葩的自己residualext2以前看再正常不过现在看上去很奇葩你看class residualExt2 :public Layer {//改进成先降维再升维202607101844public:residualExt2(cudnnHandle_t cudnn_, int batch_, int c, int h, int w) : cudnn(cudnn_), batch(batch_), _c(c), _h(h), _w(w) {layers.emplace_back(std::make_sharedConv2D(cudnn, batch, _c, _c , _h, _w, 1, 1));layers.emplace_back(std::make_sharedBN(cudnn, batch, _c , _h, _w));layers.emplace_back(std::make_sharedLeakyRL(cudnn, batch, _c , _h, _w)); //c3,6*12*12-16*8*8layers.emplace_back(std::make_sharedConv2D(cudnn, batch, _c , _c, _h, _w, 3, 1, 1));layers.emplace_back(std::make_sharedBN(cudnn, batch, _c, _h, _w));layers.emplace_back(std::make_sharedLeakyRL(cudnn, batch, _c, _h, _w));//20260710收到darknet的启发1506cudaMalloc(output, batch * _c * _h * _w * sizeof(float));//输出32*32*32-----------------------显然输入也是32*32*32cudaMalloc(input2, batch * _c * _h * _w * sizeof(float));cudaMalloc(d_residual, batch * _c * _h * _w * sizeof(float));// cudaMalloc(output, batch * 10 * sizeof(float));//这里的10代表10个类所以不能用cudaMalloc(grad_input, batch * _c * _h * _w * sizeof(float));//反向和梯度计算不管}void forward(float* input_)override {input input_;input2 input_;for (const auto l : layers) {l-forward(input);input l-get_output();}int NN batch * _c * _h * _w;residual_forward_kernel (NN 255) / 256, 256 (output, input, input2, NN);error_handling(cudaGetLastError());//cudaMemcpy(input2, inputTemp, sizeof(float)*batch * 10, cudaMemcpyDeviceToDevice);}void forward2(float* input_)override {input input_;input2 input_; //batch 1;for (const auto l : layers) {l-forward2(input);input l-get_output();}int NN batch * _c * _h * _w;//int NN batch * 32 * 32 * 32;residual_forward_kernel (NN 255) / 256, 256 (output, input, input2, NN);// error_handling(cudaGetLastError());// cudaMemcpy(input2, inputTemp, sizeof(float)*batch * 10, cudaMemcpyDeviceToDevice);/*const float alpha 1.0f, beta 0.0f;forward(input);*/}/*void forward2(float* inputtest)override {input inputtest;const float alpha 1.0f, beta 0.0f;forward(input);}*/void backward(float* grad_output)override {//梯度来自残差块后的relu当前只有一个残差块float* grad grad_output;//要记住这个梯度即备份一个float* grad备用 grad_output;for (int i layers.size() - 1; i 0; i--) {layers[i]-backward(grad);grad layers[i]-get_grad_input();}//float* d_residual grad备用*X输入数据;//input2 input_;// float* d_residual grad备用*input2;//input2 input_;int NN batch * _c * _h * _w;/*for (int i 0; i NN; i){d_residual[i] grad备用[i]*input2[i];}*/int threads 256;int blocks (NN threads - 1) / threads;//mulext blocks, threads (NN, batch, _c, _h, _w, input2, _c, grad备用);//// mul blocks, threads (grad备用, input2, d_residual, NN);//c为输出d_residual//error_handling(cudaGetLastError());//residual_backprop_kernel blocks, threads (grad, grad_input, grad备用, NN);//error_handling(cudaGetLastError());//// cudaMemcpy(grad_input, grad, sizeof(float)*batch * 32 * 32 * 32, cudaMemcpyDeviceToDevice);//使用yolo 的残差试一试看两个bn有什么情况mul blocks, threads (grad备用, input2, d_residual, NN);//c为输出d_residualerror_handling(cudaGetLastError());shortcut_gpu(batch, _w, _h, _c, d_residual, _w, _h, _c, grad);//虚线l.out_c12,l.c16,在这里是实线l.out_c16,l.c16cudaMemcpy(grad_input, grad, sizeof(float) * NN, cudaMemcpyDeviceToDevice);error_handling(cudaGetLastError());//仍然是第二个bn层方差均值为零}int getname() override { return 3; }float* get_output() override { return output; }float* get_grad_input() override { return grad_input; }void update(float lr) {for (const auto l : layers) {l-update(lr);}}~residualExt2() {cudaFree(output);cudaFree(grad_input);}private:// cublasHandle_t cublas;int _c, _h, _w;cudnnHandle_t cudnn;int batch;float* input, * output, * grad_input;float* input2;float* d_residual;public:std::vectorstd::shared_ptrLayer layers;};这个标红的卷积最奇葩1*1的卷积通道数没改变长宽没改变相当于什么也没做他有什么用很迷惑我也很迷惑搞不清楚而且导致bn层调整达到20轮但是训练30轮他出了最好成绩test75.46分怎么办训练20秒一轮太慢比我们模仿的最好的darknettest74分高了1分训练一轮10秒这个要训练45轮所以回过头再看自己的6bn2res老版本这里头竟然使用了两次不改变无用的1*1卷积奇葩吧自己的6bn2res老版本训练60轮竟然也有74分的好成绩真不知是怎么调出来的真是太执着了缺点就是一旦增加bn层和残差层就崩溃10:14 2026/7/12保持30轮结束训练上了81分测试才75.46分为什么最后停止的lr0.00001训练40轮没长进rb均值: -0.0352130234,rb方差:14.262719154358rb均值: 0.5891134143,rb方差:3.204290628433rb均值: -1.9282523394,rb方差:8.068262100220rb均值: -0.8606312275,rb方差:6.981663227081rb均值: -2.4030439854,rb方差:2.754190444946rb均值: 0.6570685506,rb方差:9.724234580994rb均值: -0.8150371313,rb方差:16.746698379517rb均值: -0.0482428670,rb方差:3.029548645020rb均值: 0.8375898600,rb方差:0.933473646641rb均值: 0.9689819813,rb方差:1.836101293564rb均值: -0.6997777224,rb方差:1.324596047401rb均值: 0.2050344050,rb方差:0.614533126354rb均值: 0.2318822742,rb方差:0.435542941093rb均值: -0.0076158936,rb方差:0.394294798374rb均值: 0.0153729897,rb方差:0.341374099255rb均值: 0.6515869498,rb方差:1.559036493301rb均值: 0.1390019357,rb方差:0.334698855877rb均值: 0.1457644105,rb方差:0.970378220081rb均值: -0.8289402127,rb方差:0.380797654390rb均值: -2.0809884071,rb方差:2.022989749908rb均值: 0.6170504689,rb方差:0.770508885384rb均值: 1.4031846523,rb方差:1.246126174927rb均值: -0.1109440923,rb方差:0.845608353615rb均值: 0.1443672031,rb方差:0.348062723875rb均值: 1.0667506456,rb方差:0.801210224628rb均值: 0.3589663208,rb方差:0.453858137131rb均值: -0.0381050818,rb方差:0.499120354652rb均值: 1.4912693501,rb方差:1.440005064011rb均值: -0.4970279336,rb方差:0.521952271461rb均值: 0.5457373261,rb方差:0.572612464428rb均值: 0.3146187663,rb方差:0.444224238396rb均值: -0.6239964962,rb方差:0.402716428041rb均值: 0.6355765462,rb方差:1.099589228630rb均值: 0.4786215723,rb方差:0.349409490824rb均值: -0.5599699020,rb方差:0.436410307884rb均值: 0.0414183438,rb方差:0.634363889694rb均值: -0.3988341391,rb方差:0.477618366480rb均值: -0.0810288638,rb方差:0.423269689083rb均值: -1.0101382732,rb方差:0.520019650459rb均值: -0.2167062461,rb方差:0.497478604317时间: 19157.595703 mstrain Classification result: 82.33% ok (used 49984 images)learn rate1e-05轮次39时间: 1790.764038 msTest Classification result: 75.34% ok (used 9984 images)