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

向darknet无限逼近和倔强的自己对抗(向yolo致敬,cudnn微积分,一)
通过学习向darknet靠近其实自己的6bn2res有了改进方案这是对比自己和darknet的结果另一个就是32*32的图像限制了网络的广度和深度无论自己和darknet在32*32上已经表现出来第三就是darknet反复重复残差的好处在哪里向最好的别人学习成就最优的自己昨天干了一天今天总结一下cudnn实现的最好的darknet版本训练cifar10测试成绩74分速度很快10秒一轮2060显卡layers.emplace_back(std::make_sharedConv2D(cudnn, batch, 5, 32, 32, 32, 3, 1, 1));layers.emplace_back(std::make_sharedBN(cudnn, batch, 32, 32, 32));layers.emplace_back(std::make_sharedLeakyRL(cudnn, batch, 32, 32, 32));layers.emplace_back(std::make_sharedConv2D(cudnn, batch, 32, 64, 32, 32, 3, 2, 1));//向darknet看齐202607111549layers.emplace_back(std::make_sharedresidualExt3(cudnn, batch, 64, 16, 16));layers.emplace_back(std::make_sharedConv2D(cudnn, batch, 64, 128, 16, 16, 3, 2, 1));layers.emplace_back(std::make_sharedresidualExt3(cudnn, batch, 128, 8, 8));layers.emplace_back(std::make_sharedresidualExt3(cudnn, batch, 128, 8, 8));//无限靠近darknet202607120630新增//尝试平均池化darknetlayers.emplace_back(std::make_sharedMaxPool2D(cudnn, batch, 128, 8, 8, 2, 2, 0, 2));//已经改为平均池化202607112128layers.emplace_back(std::make_sharedLinear(cublas, batch, 128 * 16, 500));layers.emplace_back(std::make_sharedLeakyRL(cudnn, batch, 500, 1, 1));layers.emplace_back(std::make_sharedLinear(cublas, batch, 500, 10));//84-10以上是架构不同以往的是classresidualExt3:public Layer {//改进成先降维再升维202607101844public:residualExt3(cudnnHandle_t cudnn_, int batch_, int c, int h, int w) : cudnn(cudnn_), batch(batch_), _c(c), _h(h), _w(w) {//尝试残差此处要记住输入Xlayers.emplace_back(std::make_sharedConv2D(cudnn, batch, _c,_c/2, _h, _w, 1, 1));//c3,6*12*12-16*8*8layers.emplace_back(std::make_sharedBN(cudnn, batch,_c/2, _h, _w));layers.emplace_back(std::make_sharedLeakyRL(cudnn, batch,_c /2, _h, _w)); //c3,6*12*12-16*8*8layers.emplace_back(std::make_sharedConv2D(cudnn, batch,_c/2, _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());}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;residual_forward_kernel (NN 255) / 256, 256 (output, input, input2, NN);}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();}int NN batch * _c * _h * _w;int threads 256;int blocks (NN threads - 1) / threads;//使用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);}}~residualExt3() {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;};昨天和今天对比时间: 9828.586914 mstrain Classification result: 73.47% ok (used 49984 images)learn rate1e-05轮次43时间: 9460.221680 mstrain Classification result: 73.67% ok (used 49984 images)learn rate1e-05轮次44时间: 921.172974 msTest Classification result: 70.04% ok (used 9984 images)可以保存一个模仿darknet的最好版本训练一轮9.5秒很快了23:03 2026/7/11从今天所有来看最好是那个75.46分基本什么都没管训练次数还少可以做对比6:39 2026/7/12又增加了一次残差训练的分拔高了测试也提升了4分更加逼近darknet只是lr搞得太牵强第八次bn稳定下来有人做自然有他的道理保存一个版本时间: 10338.591797 mstrain Classification result: 86.54% ok (used 49984 images)learn rate1e-05轮次41时间: 10352.596680 mstrain Classification result: 86.60% ok (used 49984 images)learn rate1e-05轮次42时间: 10368.804688 mstrain Classification result: 86.71% ok (used 49984 images)learn rate1e-05轮次43时间: 10334.481445 mstrain Classification result: 86.72% ok (used 49984 images)learn rate1e-05轮次44时间: 983.880981 msTest Classification result: 74.09% ok (used 9984 images)下一节展示奇葩的自己那个75分的高成绩