实现pytorch resnet18功能(二,c++ cudnn)
这一节围绕实现虚线残差块类并改造架构训练cifar10跑出成绩!
先看:
class ConBN :public Layer {//为虚线残差服务
public:
ConBN(cudnnHandle_t& cudnn_, int batch_, int ci, int co, int h, int w, int juanjihe, int pading = 0) : cudnn(cudnn_), batch(batch_)
, _ci(ci), _co(co), _h(h), _w(w), _jjh(juanjihe), _pad(pading) {//int stride=2,juanjihe=1时,pading=0;
layers.emplace_back(std::make_shared<Conv2D>(cudnn, batch, _ci, _co, _h, _w, _jjh, 2, _pad));//juanjihe=1时,pading=0;
layers.emplace_back(std::make_shared<BN>(cudnn, batch, _co, _h / 2, _w / 2));
cudaMalloc(&output, batch * _co * _h / 2 * _w / 2 * sizeof(float));//输出32*32*32-----------------------显然输入也是32*32*32
//观察
cudaMalloc(&grad_input, batch * _ci * _h * _w * sizeof(float));//
}
void forward(float* input_)override {
input = input_;
for (const auto& l : layers) {
l->forward(input);
input = l->get_output();// batch * _co * _h/2 * _w/2
}
}
void forward2(float* input_)override {//推理用
input = input_;
for (const auto& l : layers) {
l->forward2(input);
input = l->get_output(); //batch* _co* _h / 2 * _w / 2
}
}
void backward(float* grad_output)override {//梯度来自残差块后的relu,当前只有一个残差块!!!!!!!!!!!
float* grad = grad_output;//要记住这个梯度,即备份一个
// batch * _co * _h/2 * _w/2
for (int i = layers.size() - 1; i >= 0; i--) {
layers[i]->backward(grad);
grad = layers[i]->get_grad_input();// batch * _ci * _h * _w
}
int NN = batch * _ci * _h * _w;
cudaMemcpy(grad_input, grad, sizeof(float) * NN, cudaMemcpyDeviceToDevice);// batch * _ci * _h * _w
error_handling(cudaGetLastError());//仍然是第二个bn层方差均值为零
}
int getname() override { return 43; }
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);
}
}
~ConBN() {
cudaFree(output);
cudaFree(grad_input);
}
private:
// cublasHandle_t &cublas;
int _ci, _h, _w, _co;
int _jjh, _pad;
cudnnHandle_t& cudnn;
int batch;
float* input, * output, * grad_input;
//float* input2;
//float* d_residual;
public:
std::vector<std::shared_ptr<Layer>> layers;
};
自从lenet使用c++类递归成功之后,以上所有类递归实现:包括残差类,senet类,以及这个conBN类都是一样的举一反三的结果!
昨天干了一天,出成绩的架构如下:
//resnet18//resnet18//resnet18
layers.emplace_back(std::make_shared<Conv2D>(cudnn, batch, 5, 32, 32, 32, 3, 1, 1));
//第一残差开始
layers.emplace_back(std::make_shared<residualExt2>(cudnn, batch, 32, 32, 32));
layers.emplace_back(std::make_shared<ReLU>(cudnn, batch, 32, 32, 32));
//第二残差开始
layers.emplace_back(std::make_shared<Conv2D>(cudnn, batch, 32, 64, 32, 32, 3, 1, 1));
layers.emplace_back(std::make_shared<residualExt2>(cudnn, batch, 64, 32, 32));
layers.emplace_back(std::make_shared<ReLU>(cudnn, batch, 64, 32, 32));
//第三残差开始,虚线 //xuxianResidual//out->batch, 128, 16, 16
layers.emplace_back(std::make_shared<xuxianResidual>(cudnn, batch, 64, 32, 32));
layers.emplace_back(std::make_shared<ReLU>(cudnn, batch, 128, 16, 16));
layers.emplace_back(std::make_shared<residualExt2>(cudnn, batch, 128, 16, 16));
layers.emplace_back(std::make_shared<ReLU>(cudnn, batch, 128, 16, 16));
//虚线 //xuxianResidual//out->batch, 256, 8, 8
layers.emplace_back(std::make_shared<xuxianResidual>(cudnn, batch, 128, 16, 16));
layers.emplace_back(std::make_shared<ReLU>(cudnn, batch, 256, 8, 8));
layers.emplace_back(std::make_shared<residualExt2>(cudnn, batch, 256, 8, 8));
layers.emplace_back(std::make_shared<ReLU>(cudnn, batch, 256, 8, 8));
layers.emplace_back(std::make_shared<AvgPool2D>(cudnn, batch, 256, 8,8, 2, 2, 0, 2));
layers.emplace_back(std::make_shared<Linear>(cublas, batch, 256 * 16, 384));
layers.emplace_back(std::make_shared<BN>(cudnn, batch, 384, 1, 1));
layers.emplace_back(std::make_shared<ReLU>(cudnn, batch, 384, 1, 1));
layers.emplace_back(std::make_shared<Dropout>(cudnn, batch, 384, 1, 1));
layers.emplace_back(std::make_shared<Linear>(cublas, batch, 384, 10));
以上所有的RELU都是Leaky Relu!
为什么残差块后都有一个relu?原因是残差块中最后一步只实现了相加,并没有实现relu,所以这个架构中,所有残差块类都跟有relu!其实可以封装成一个类,即残差块类和relu类仿照上面的conBN类实现!闲了试试!
另外就是实线残差块类residualExt2中使用了1*1卷积核以及3*3卷积,并不是两次都是3*3卷积(原因是,测试中以出成绩为准!)
虽然上面架构与resnet18不同,但使用两个虚线残差块类成功运行!而且跑分超过60分!
这就够了,以后再慢慢改!看看训练成绩:(很奇怪,训练没有测试高!)
第一次没有用标签平滑!
轮次:22
learn rate:0.0001
rb均值: -0.8177493215,rb方差:6.634854793549
rb均值: 0.1464861631,rb方差:7.005175590515
rb均值: -4.8391342163,rb方差:8.484831809998
rb均值: 183.5361328125,rb方差:6.814857959747
rb均值: 180.6622619629,rb方差:11.203654289246
rb均值: 183.0979919434,rb方差:8.709230422974
rb均值: 179.8875579834,rb方差:6.918246746063
rb均值: 191.7814941406,rb方差:10.316461563110
rb均值: 175.9662780762,rb方差:13.105692863464
rb均值: 181.8635559082,rb方差:11.161525726318
rb均值: 187.7384338379,rb方差:8.852643013000
rb均值: 178.5686187744,rb方差:9.889279365540
rb均值: 179.4067230225,rb方差:6.745769500732
rb均值: 188.5673828125,rb方差:11.297363281250
rb均值: 187.2782745361,rb方差:8.041701316833
rb均值: 185.9717864990,rb方差:8.388052940369
rb均值: 183.1254577637,rb方差:10.292785644531
rb均值: 180.0892486572,rb方差:9.457773208618
rb均值: 182.7177276611,rb方差:7.496421337128
rb均值: 181.3819274902,rb方差:7.414596557617
rb均值: 179.7558746338,rb方差:8.540961265564
rb均值: 183.6046295166,rb方差:10.708087921143
rb均值: 188.1282196045,rb方差:11.029009819031
rb均值: 178.3198242188,rb方差:6.220466136932
rb均值: 177.4730072021,rb方差:9.512666702271
rb均值: 175.9327545166,rb方差:8.633837699890
rb均值: 177.5871124268,rb方差:7.106986045837
rb均值: 185.6342620850,rb方差:8.863368988037
rb均值: 177.6804046631,rb方差:8.646261215210
rb均值: 176.5341644287,rb方差:11.791280746460
rb均值: 182.7828826904,rb方差:5.481198787689
rb均值: 184.0901336670,rb方差:7.615890502930
rb均值: 175.5070495605,rb方差:9.408782958984
rb均值: 185.6214599609,rb方差:7.488677024841
rb均值: 182.3325958252,rb方差:10.377087593079
时间: 23880.949219 ms
train Classification result: 46.38% ok (used 49984 images)
时间: 2081.162109 ms
Test Classification result: 48.35% ok (used 9984 images)
轮次:23
learn rate:1e-05
rb均值: -0.8363910317,rb方差:6.782654285431
rb均值: 0.1454253346,rb方差:7.153752803802
rb均值: -4.8967700005,rb方差:8.671839714050
rb均值: 183.8880004883,rb方差:6.613060951233
rb均值: 181.0247955322,rb方差:11.021433830261
rb均值: 183.4161834717,rb方差:8.697054862976
rb均值: 180.2021636963,rb方差:6.648553848267
rb均值: 192.1543121338,rb方差:9.824802398682
rb均值: 176.2643737793,rb方差:12.752940177917
rb均值: 182.1811523438,rb方差:11.155039787292
rb均值: 188.1260375977,rb方差:8.570376396179
rb均值: 178.8726043701,rb方差:9.648173332214
rb均值: 179.8037414551,rb方差:6.302925586700
rb均值: 188.9741058350,rb方差:10.933872222900
rb均值: 187.6005249023,rb方差:7.677930355072
rb均值: 186.3298492432,rb方差:8.245573997498
rb均值: 183.5299072266,rb方差:10.089641571045
rb均值: 180.4233093262,rb方差:9.005263328552
rb均值: 183.0039062500,rb方差:7.045313835144
rb均值: 181.7451629639,rb方差:6.906162261963
rb均值: 180.0865478516,rb方差:8.532091140747
rb均值: 183.9595947266,rb方差:10.681144714355
rb均值: 188.5178527832,rb方差:10.653202056885
rb均值: 178.7029266357,rb方差:5.813003063202
rb均值: 177.8416137695,rb方差:8.963195800781
rb均值: 176.2655639648,rb方差:8.310072898865
rb均值: 177.9847412109,rb方差:6.497567176819
rb均值: 186.0661926270,rb方差:8.543817520142
rb均值: 177.9794158936,rb方差:8.282099723816
rb均值: 176.8688354492,rb方差:11.597938537598
rb均值: 183.1886901855,rb方差:5.056927680969
rb均值: 184.3971099854,rb方差:7.320156574249
rb均值: 175.7758331299,rb方差:8.950763702393
rb均值: 185.9281921387,rb方差:7.085634708405
rb均值: 182.6974334717,rb方差:10.211862564087
时间: 23970.154297 ms
train Classification result: 52.81% ok (used 49984 images)
时间: 2134.930908 ms
Test Classification result: 64.64% ok (used 9984 images)
轮次:24
learn rate:1e-05
rb均值: -0.8413067460,rb方差:6.835544109344
rb均值: 0.1433880478,rb方差:7.216166973114
rb均值: -4.9180655479,rb方差:8.757422447205
rb均值: 184.0388031006,rb方差:6.645013809204
rb均值: 181.1657409668,rb方差:10.984165191650
rb均值: 183.5779113770,rb方差:8.774834632874
rb均值: 180.3379974365,rb方差:6.749955177307
rb均值: 192.3291015625,rb方差:9.796758651733
rb均值: 176.4109954834,rb方差:12.617781639099
rb均值: 182.3268890381,rb方差:11.213191032410
rb均值: 188.3031768799,rb方差:8.583617210388
rb均值: 179.0145111084,rb方差:9.648314476013
rb均值: 179.9466705322,rb方差:6.253820896149
rb均值: 189.1435241699,rb方差:10.926195144653
rb均值: 187.7631378174,rb方差:7.607312202454
rb均值: 186.4966125488,rb方差:8.217050552368
rb均值: 183.6767425537,rb方差:10.064160346985
rb均值: 180.5755767822,rb方差:9.057271003723
rb均值: 183.1567382812,rb方差:7.126003742218
rb均值: 181.8740234375,rb方差:7.002972126007
rb均值: 180.2294769287,rb方差:8.497152328491
rb均值: 184.1197204590,rb方差:10.711235046387
rb均值: 188.6992492676,rb方差:10.539142608643
rb均值: 178.8376159668,rb方差:5.725384235382
rb均值: 177.9801940918,rb方差:8.844217300415
rb均值: 176.3877410889,rb方差:8.375956535339
rb均值: 178.1140594482,rb方差:6.481128692627
rb均值: 186.2222442627,rb方差:8.525619506836
rb均值: 178.1128540039,rb方差:8.331965446472
rb均值: 177.0007324219,rb方差:11.509457588196
rb均值: 183.3349456787,rb方差:5.052510738373
rb均值: 184.5490570068,rb方差:7.252855777740
rb均值: 175.9030151367,rb方差:9.053083419800
rb均值: 186.0856933594,rb方差:7.009299755096
rb均值: 182.8636779785,rb方差:10.063614845276
时间: 23881.013672 ms
train Classification result: 53.15% ok (used 49984 images)
时间: 2090.301025 ms
Test Classification result: 64.96% ok (used 9984 images)
第二次使用标签平滑!均值方差控制的好很多!
轮次:19
learn rate:0.0001
rb均值: 177.9396667480,rb方差:5.743079185486
时间: 24399.310547 ms
train Classification result: 31.39% ok (used 49984 images)
时间: 2172.226074 ms
Test Classification result: 39.09% ok (used 9984 images)
轮次:20
learn rate:0.0001
rb均值: 179.3192749023,rb方差:6.060407161713
时间: 24011.294922 ms
train Classification result: 32.76% ok (used 49984 images)
时间: 2177.707031 ms
Test Classification result: 33.25% ok (used 9984 images)
轮次:21
learn rate:0.0001
rb均值: 176.6586151123,rb方差:5.044001579285
rb均值: 180.6916656494,rb方差:6.061439990997
时间: 23770.380859 ms
train Classification result: 33.16% ok (used 49984 images)
时间: 2068.013916 ms
Test Classification result: 36.31% ok (used 9984 images)
轮次:22
learn rate:0.0001
rb均值: 177.9275970459,rb方差:5.317762851715
rb均值: 182.0581970215,rb方差:6.503596782684
时间: 23969.156250 ms
train Classification result: 34.54% ok (used 49984 images)
时间: 2121.339111 ms
Test Classification result: 35.72% ok (used 9984 images)
轮次:23
learn rate:1e-05
rb均值: 178.2171020508,rb方差:5.046384334564
rb均值: 182.4028930664,rb方差:6.254225730896
时间: 24613.876953 ms
train Classification result: 44.89% ok (used 49984 images)
时间: 2104.693115 ms
Test Classification result: 57.86% ok (used 9984 images)
轮次:24
learn rate:1e-05
rb均值: 178.3455352783,rb方差:5.032675743103
rb均值: 182.5644683838,rb方差:6.303113937378
时间: 24644.156250 ms
train Classification result: 46.12% ok (used 49984 images)
时间: 1967.187988 ms
Test Classification result: 58.63% ok (used 9984 images)
轮次:25
learn rate:1e-05
rb均值: 178.4705200195,rb方差:5.075919628143
rb均值: 182.7089843750,rb方差:6.323478221893
时间: 24964.757812 ms
train Classification result: 46.83% ok (used 49984 images)
时间: 2120.533936 ms
Test Classification result: 58.29% ok (used 9984 images)
轮次:26
learn rate:1e-05
rb均值: 178.5975189209,rb方差:5.137364864349
rb均值: 182.8522186279,rb方差:6.359841346741
时间: 24169.107422 ms
train Classification result: 47.33% ok (used 49984 images)
时间: 2081.800049 ms
Test Classification result: 58.22% ok (used 9984 images)
轮次:27
learn rate:1e-05
rb均值: 178.7335052490,rb方差:5.117462158203
rb均值: 183.0001068115,rb方差:6.380872726440
时间: 24743.724609 ms
train Classification result: 47.44% ok (used 49984 images)
时间: 2378.412109 ms
Test Classification result: 58.56% ok (used 9984 images)
轮次:28
learn rate:1e-05
rb均值: 178.8453216553,rb方差:5.183481693268
rb均值: 183.1543426514,rb方差:6.435914039612
时间: 24901.628906 ms
train Classification result: 47.63% ok (used 49984 images)
时间: 2120.143066 ms
Test Classification result: 58.59% ok (used 9984 images)
轮次:29
learn rate:1e-05
rb均值: 178.9731140137,rb方差:5.164259433746
rb均值: 183.3003234863,rb方差:6.452323913574
时间: 24618.148438 ms
train Classification result: 47.51% ok (used 49984 images)
时间: 1956.362061 ms
Test Classification result: 59.15% ok (used 9984 images)
轮次:30
learn rate:1e-05
rb均值: 179.1003723145,rb方差:5.210851192474
rb均值: 183.4498901367,rb方差:6.460504055023
时间: 23550.355469 ms
train Classification result: 48.02% ok (used 49984 images)
时间: 2221.782959 ms
Test Classification result: 58.26% ok (used 9984 images)
轮次:31
learn rate:1e-05
rb均值: 179.2317199707,rb方差:5.197669982910
rb均值: 183.5994720459,rb方差:6.466269969940
时间: 23957.259766 ms
train Classification result: 47.97% ok (used 49984 images)
时间: 2041.211060 ms
Test Classification result: 58.43% ok (used 9984 images)
轮次:32
learn rate:1e-05
rb均值: 179.3566741943,rb方差:5.214316368103
rb均值: 183.7448272705,rb方差:6.482991695404
时间: 24000.644531 ms
train Classification result: 48.10% ok (used 49984 images)
时间: 2101.131104 ms
Test Classification result: 58.29% ok (used 9984 images)
轮次:33
learn rate:1e-05
rb均值: 179.4797821045,rb方差:5.234365940094
rb均值: 183.8842620850,rb方差:6.457337856293
时间: 24633.330078 ms
train Classification result: 48.34% ok (used 49984 images)
时间: 2225.269043 ms
Test Classification result: 59.23% ok (used 9984 images)
轮次:34
learn rate:1e-05
rb均值: 179.6129302979,rb方差:5.328382492065
rb均值: 184.0348358154,rb方差:6.499778270721
时间: 24567.044922 ms
train Classification result: 48.69% ok (used 49984 images)
时间: 2276.252930 ms
Test Classification result: 59.27% ok (used 9984 images)
轮次:35
learn rate:1e-05
rb均值: 179.7359161377,rb方差:5.276028156281
rb均值: 184.1901245117,rb方差:6.448117256165
时间: 24445.064453 ms
train Classification result: 48.74% ok (used 49984 images)
时间: 2108.625000 ms
Test Classification result: 58.92% ok (used 9984 images)
轮次:36
learn rate:1e-05
rb均值: 179.8667907715,rb方差:5.256892204285
rb均值: 184.3215026855,rb方差:6.424473762512
时间: 24495.824219 ms
train Classification result: 48.73% ok (used 49984 images)
时间: 2091.352051 ms
Test Classification result: 59.01% ok (used 9984 images)
轮次:37
learn rate:1e-05
rb均值: 179.9925384521,rb方差:5.317588329315
rb均值: 184.4736022949,rb方差:6.487969875336
时间: 24732.597656 ms
train Classification result: 49.02% ok (used 49984 images)
时间: 2713.114990 ms
Test Classification result: 58.51% ok (used 9984 images)
轮次:38
learn rate:1e-05
rb均值: 180.1109771729,rb方差:5.326389789581
rb均值: 184.6088256836,rb方差:6.400336742401
时间: 24746.890625 ms
train Classification result: 48.91% ok (used 49984 images)
时间: 2193.957031 ms
Test Classification result: 58.94% ok (used 9984 images)
轮次:39
learn rate:1e-05
rb均值: 180.2441101074,rb方差:5.299893379211
rb均值: 184.7652282715,rb方差:6.426110744476
时间: 24492.427734 ms
train Classification result: 49.00% ok (used 49984 images)
时间: 2110.572998 ms
Test Classification result: 59.34% ok (used 9984 images)
轮次:40
learn rate:1e-05
rb均值: 180.3605346680,rb方差:5.354818344116
rb均值: 184.9234619141,rb方差:6.492108821869
时间: 24076.179688 ms
train Classification result: 48.99% ok (used 49984 images)
时间: 2105.639893 ms
Test Classification result: 59.85% ok (used 9984 images)
轮次:41
learn rate:1e-06
rb均值: 180.3820190430,rb方差:5.291257858276
rb均值: 184.9498138428,rb方差:6.474355220795
时间: 24520.054688 ms
train Classification result: 49.69% ok (used 49984 images)
时间: 2195.300049 ms
Test Classification result: 60.60% ok (used 9984 images)
轮次:42
learn rate:1e-06
rb均值: 180.3818969727,rb方差:5.297625541687
rb均值: 184.9518127441,rb方差:6.459012508392
时间: 23818.423828 ms
train Classification result: 49.76% ok (used 49984 images)
时间: 2096.556885 ms
Test Classification result: 60.55% ok (used 9984 images)
更多推荐



所有评论(0)