越来越喜欢自己,开始看到pytorch的尾灯了!继续努力!

pytorch下,用自己能看懂的架构,训练cifar100,最好test=72分!

pytorch下,用自己那种最简单的架构,训练cifar100,最好test=54分

使用自己最好版本的2残差+6bn架构:上了40分

近期学习darknet,改进了自己的架构,很叛逆,似乎好于darknet的CBL架构:

很像,但不是!

 layers.emplace_back(std::make_shared<Conv2D>(cudnn, batch, 5, 64, 32, 32, 3, 1, 1));      
        layers.emplace_back(std::make_shared<residualExt22>(cudnn, batch, 64, 32, 32));
        layers.emplace_back(std::make_shared<Conv2D>(cudnn, batch, 64, 128, 32, 32, 3, 2, 1));
        layers.emplace_back(std::make_shared<residualExt3>(cudnn, batch, 128, 16, 16));
     
        layers.emplace_back(std::make_shared<averPool2D>(cudnn, batch, 128, 16, 16, 2, 2, 0, 2));//改变202607120652

        layers.emplace_back(std::make_shared<Linear>(cublas, batch, 128 * 64, 1000));
        layers.emplace_back(std::make_shared<LeakyRL>(cudnn, batch,1000, 1, 1));
        layers.emplace_back(std::make_shared<Linear>(cublas, batch, 1000, 100));

这个架构不错,更加接近初级的pytorch!有时能上47分,方差控制的也不错!30之内!看结果:

轮次:13
时间: 16791.228516 ms
train Classification result: 88.40% ok (used 49984 images)
rb均值: -2.3626189232,rb方差:17.546411514282
rb均值: -4.4263968468,rb方差:25.942405700684
rb均值: 1.9190766811,rb方差:5.937534809113
rb均值: 1.0265297890,rb方差:8.215635299683
rb均值: 1.7391078472,rb方差:24.477457046509
rb均值: 0.7897966504,rb方差:16.227176666260
rb均值: -0.4600621462,rb方差:6.939261913300
rb均值: -1.5925167799,rb方差:8.627335548401
rb均值: -0.2993111014,rb方差:10.026226043701
rb均值: 1.7539672852,rb方差:5.124563694000
rb均值: -0.1951200664,rb方差:18.068149566650
rb均值: -0.4504320920,rb方差:7.096541881561
rb均值: 1.4864635468,rb方差:27.453226089478
时间: 1287.696045 ms
Test Classification result: 45.69% ok (used 9984 images)
learn rate:0.0004
轮次:14
时间: 16783.296875 ms
train Classification result: 90.58% ok (used 49984 images)
rb均值: -2.3871669769,rb方差:17.772373199463
rb均值: -4.4799971581,rb方差:26.251613616943
rb均值: 1.9335203171,rb方差:6.021386623383
rb均值: 1.0510221720,rb方差:8.204014778137
rb均值: 1.7944550514,rb方差:24.771923065186
rb均值: 0.7741320133,rb方差:16.012819290161
rb均值: -0.4786445200,rb方差:6.718751430511
rb均值: -1.6222428083,rb方差:8.506367683411
rb均值: -0.3031601906,rb方差:9.963004112244
rb均值: 1.7552136183,rb方差:5.217677116394
rb均值: -0.2204939574,rb方差:17.987514495850
rb均值: -0.4627231658,rb方差:7.085675716400
rb均值: 1.4655561447,rb方差:27.481969833374
时间: 1283.954956 ms
Test Classification result: 46.47% ok (used 9984 images)
learn rate:0.0001
轮次:15
时间: 16801.826172 ms
train Classification result: 91.49% ok (used 49984 images)
rb均值: -2.3918678761,rb方差:17.901515960693
rb均值: -4.5010066032,rb方差:26.418352127075
rb均值: 1.9338504076,rb方差:6.050546646118
rb均值: 1.0406002998,rb方差:8.218937873840
rb均值: 1.8278776407,rb方差:24.952688217163
rb均值: 0.7804941535,rb方差:15.855553627014
rb均值: -0.4930694103,rb方差:6.702136039734
rb均值: -1.6002954245,rb方差:8.490879058838
rb均值: -0.3022493124,rb方差:9.931306838989
rb均值: 1.7628046274,rb方差:5.229385375977
rb均值: -0.2352960408,rb方差:17.925018310547
rb均值: -0.4750482142,rb方差:7.034730434418
rb均值: 1.4459412098,rb方差:27.562496185303
时间: 1295.284058 ms
Test Classification result: 46.51% ok (used 9984 images)
learn rate:0.0001

关于没介绍的residualExt22如下:其他前面cudnn微积分都介绍过了!

class residualExt22 :public Layer {
public:
    residualExt22(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_shared<Conv2D>(cudnn, batch, _c, _c, _h, _w, 1, 1));
        layers.emplace_back(std::make_shared<BN>(cudnn, batch, _c, _h, _w));
        layers.emplace_back(std::make_shared<LeakyRL>(cudnn, batch, _c, _h, _w));         
        layers.emplace_back(std::make_shared<Conv2D>(cudnn, batch, _c, _c, _h, _w, 3, 1, 1));
      
        layers.emplace_back(std::make_shared<BN>(cudnn, batch, _c, _h, _w));

        layers.emplace_back(std::make_shared<LeakyRL>(cudnn, batch, _c, _h, _w));//20260710收到darknet的启发1506

        cudaMalloc(&output, batch * _c * _h * _w * sizeof(float));
        cudaMalloc(&input2, batch * _c * _h * _w * sizeof(float));
        cudaMalloc(&d_residual, batch * _c * _h * _w * sizeof(float));     
        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 {
        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_residual
        error_handling(cudaGetLastError());
        shortcut_gpu(batch, _w, _h, _c, d_residual, _w, _h, _c, grad);//虚线l.out_c=12,l.c=16,在这里是实线,l.out_c=16,l.c=16

        cudaMemcpy(grad_input, grad, sizeof(float) * NN, cudaMemcpyDeviceToDevice);
        error_handling(cudaGetLastError());//仍然是第二个bn层方差均值为零
    }
    int    getname() override { return 22; }
    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);

        }
    }


    ~residualExt22() {
        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::vector<std::shared_ptr<Layer>> layers;

};

pytorch使用的架构:

       #初始化模块

        self.conv1 = torch.nn.Conv2d( 3, 32, kernel_size=(3,3) , padding=1)      
        self.conv2 = torch.nn.Conv2d( 32, 64,kernel_size=(3,3) , padding=1 )
          
        self.bn1 =   torch.nn.BatchNorm2d(32)
        self.bn2 =   torch.nn.BatchNorm2d(64)
                                         
        self.relu=torch.nn.LeakyReLU()
        self.resblk1 = ResidualBlock(32)
        self.resblk2 = ResidualBlock(64)
        self.pool = torch.nn.MaxPool2d(2)
       
        self.out = torch.nn.Linear(4096*2*2,1000)       
        self.out1 = torch.nn.Linear(1000,100)


    def forward(self, x):         
        x =  self.relu( self.bn1(self.conv1(x) ) )
        x = self.resblk1(x)       
        x = self.pool( self.relu( self.bn2(self.conv2(x) ) ))
        x = self.resblk2(x)


        x=x.view(x.size(0),-1)      
        x=self.out(x)
        x=self.relu(x)
        x=self.out1(x)
        return x

训练结果如下:

[35-th] loss: 10.172
15.126414 s
Accuracy on train set: 70 %
[36-th] loss: 9.994
15.435654 s
Accuracy on train set: 70 %
[37-th] loss: 9.695
14.949185 s
Accuracy on train set: 71 %
[38-th] loss: 9.589
14.907401 s
Accuracy on train set: 71 %
[39-th] loss: 9.406
15.223840 s
Accuracy on test set: 50 %

对比一下:用时16.8s VS 14.9s,每轮

15轮 VS 40轮

还是pytorch成绩高出3-4分的样子!

可喜可贺!做个记录!

这个也是训练cifar10的架构,上了77.5分!

lr作了微调:cifar100又上了1分左右!

Test Classification result: 47.90% ok (used 9984 images)
learn rate:0.0001
轮次:23
时间: 17306.033203 ms
train Classification result: 86.83% ok (used 49984 images)
rb均值: 0.1517384648,rb方差:7.145071029663
rb均值: -0.7928796411,rb方差:54.196102142334
rb均值: -7.2352128029,rb方差:9.882222175598
rb均值: 3.6922743320,rb方差:14.312387466431
rb均值: -4.4385538101,rb方差:92.845237731934
rb均值: -9.1712675095,rb方差:7.834176063538
rb均值: -2.1865437031,rb方差:9.922868728638
rb均值: 2.1385152340,rb方差:19.142313003540
rb均值: 1.3636763096,rb方差:9.555987358093
rb均值: -2.8998665810,rb方差:133.740341186523
rb均值: 1.4886729717,rb方差:5.179646015167
rb均值: 3.2578239441,rb方差:5.542299270630
rb均值: 3.1834146976,rb方差:8.949233055115
rb均值: 0.5485203862,rb方差:24.696609497070
rb均值: 4.1326804161,rb方差:8.033966064453
rb均值: 2.5892138481,rb方差:47.529697418213
rb均值: -4.6033477783,rb方差:8.596368789673
rb均值: -9.0220489502,rb方差:22.847492218018
rb均值: 2.1131539345,rb方差:5.322664737701
rb均值: 7.6807641983,rb方差:162.071578979492
rb均值: -0.7417786717,rb方差:8.422823905945
rb均值: 2.2195162773,rb方差:42.954456329346
rb均值: 1.4271587133,rb方差:63.294921875000
rb均值: 2.3296024799,rb方差:104.854408264160
rb均值: -0.8444272876,rb方差:37.650886535645
rb均值: 1.2419486046,rb方差:116.584953308105
rb均值: 6.6672439575,rb方差:40.468837738037
rb均值: -0.8666584492,rb方差:10.331329345703
rb均值: -0.9187979102,rb方差:6.796678543091
rb均值: 1.1741467714,rb方差:50.078022003174
rb均值: -1.4155795574,rb方差:61.656581878662
rb均值: 0.2892781496,rb方差:5.072614669800
rb均值: 2.9337754250,rb方差:41.035938262939
rb均值: 0.1243455783,rb方差:22.595808029175
rb均值: 3.1320185661,rb方差:51.599960327148
rb均值: -1.1175563335,rb方差:47.272460937500
rb均值: 1.6777335405,rb方差:18.871242523193
rb均值: 0.2861412168,rb方差:14.345898628235
rb均值: 1.7070188522,rb方差:8.997339248657
rb均值: 0.3190327287,rb方差:223.227188110352
rb均值: 0.1411989182,rb方差:6.916157245636
rb均值: -0.9586595893,rb方差:6.885944366455
rb均值: -0.5325126052,rb方差:8.997122764587
rb均值: -1.8189456463,rb方差:53.917606353760
rb均值: -1.7508386374,rb方差:46.721263885498
rb均值: 0.6216368675,rb方差:150.787658691406
时间: 1312.692017 ms
Test Classification result: 47.90% ok (used 9984 images)
learn rate:0.0001
轮次:24
时间: 17399.837891 ms
train Classification result: 87.56% ok (used 49984 images)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐