paddle学习之复写Restnet
2020-08-24 00:06
387 查看
Restnet的意义
神经网络并不是层数越多越好,由于层数增多且每层都会带来信息损失,因此很可能导致后层网络出现梯度消失的情况。残差网络的思想是利用一些列残差块,其中每一个残差块的输出都是由输入该残差块的数据以及在该残差块处理后的数据进行对应叠加后所得到的,这样就有效地避免了信息的损失。
实现
import paddle from paddle import fluid from paddle.fluid.dygraph.nn import Conv2D,Pool2D,Linear,BatchNorm from paddle.fluid.layers import reshape,mean,accuracy,elementwise_add from paddle.fluid.layer_helper import LayerHelper class ConvwithBatchnorm(fluid.dygraph.Layer): def __init__(self,num_channels,num_filters,filter_size,act,stride): super(ConvwithBatchnorm,self) self.conv=Conv2D(num_channels=num_channels,num_filters=num_filters,stride=stride,act=act,filter_size=filter_size,padding=(filter_size-1)//2) self.bn=Batchnorm(filter_size,act=act) def forward(self,Input): return self.bn(self.conv(x)) class BottleneckBlock(fluid.dygraph.Layer): def __init__(self,num_channels,num_filters,stride,short_cut=False): super(BottleneckBlock,self) self.conv1=ConvwithBatchnorm(num_channels=num_channels,num_filters=num_filters,act="relu",filter_size=1) self.conv2=ConvwithBatchnorm(num_channels=num_filters,num_filters=num_filters,stride=stride,act="relu",filter_size=3) self.conv3=ConvwithBatchnorm(num_channels=num_filters,num_filters=4*num_filters,act=None,filter_size=1) self.short=ConvwithBatchnorm(num_channels=num_filters,num_filters=4*num_filters,stride=stride,act=act,filter_size=1) self.short_cut=short_cut def forward(self,x): out=self.conv3(self.conv2(self.conv1(x))) if self.short_cut: add_=Input else: add_=self.short(x) y=elementwise_add(out,add_) layer_helper = LayerHelper(self.full_name(), act='relu') return layer_helper.append_activation(y) class RestNet(fluid.dygraph.Layer): def __init__(self,layers=50,class_dim=1): super(RestNet,self).__init__() supported_layers=[50,101,152] assert layers in supported_layers, \ "supported layers are {} but input layer is {}".format(supported_layers, layers) num_filters = [64, 128, 256, 512] layer_accordingto_depth={ 50:[3, 4, 6, 3], 101:[3, 4, 23, 3], 152:[3, 8, 36, 3] } try: depth=layer_accordingto_depth[layers] except: print("plz select a choice from [50,101,52]") self.conv1=Conv2D(num_channels=3,num_filters=64,num_filter_size=7,stride=2,act="relu") self.pool2d=Pool2D(pool_size=3,pool_stride=2,pool_padding=1,pool_type="max") self.botten_block_list=[] num_channels=64 for block in range(len(depth)): shortcut=False for i in range(depth[block]): botten_block=self.add_sublayer( "bb_%d_%d"%(block,i), BottleneckBlock( num_channels=num_channels, num_filters=num_filters[block], stride=2 if i == 0 and block != 0 else 1, shortcut=shortcut)) num_channels = bottleneck_block._num_channels_out self.bottleneck_block_list.append(bottleneck_block) shortcut = True self.pool2d_avg = Pool2D(pool_size=7, pool_type='avg', global_pooling=True) import math stdv = 1.0 / math.sqrt(2048 * 1.0) self.out = Linear(input_dim=2048, output_dim=class_dim, param_attr=fluid.param_attr.ParamAttr( initializer=fluid.initializer.Uniform(-stdv, stdv))) def forward(self,Inputs): y=self.pool2d(self.conv1(Inputs)) for item in self.botten_block_list: y=item(y) y=self.pool2d_avg(y) y=reshape(y,[y.shape[0],-1]) y=self.out(y) return y
相关文章推荐
- ASP.NET Core 2 学习笔记(十二)REST-Like API
- 【ASP.NET MVC 学习笔记】- 19 REST和RESTful Web API
- PaddlePaddle, TensorFlow, MXNet, Caffe2 , PyTorch五大深度学习框架2017-10评测
- .Net 2.0实例学习:WebBrowser页面与WinForm交互技巧
- Spring.NET学习笔记20——整合Remoting(应用篇) Level 200
- 从零开始学习 ASP.NET MVC 1.0 (二) 识别URL的Routing组件
- 深度学习:YOLO v3(darknet)——训练自己的VOC数据
- 从零开始学习 ASP.NET MVC 1.0 (二) 识别URL的Routing组件
- ASP.NET 2.0 URL Rewrite 学习总结
- ASP.NET AJAX学习记要(2)-下手之DOM
- 学习IBatisNet + Castle
- ASP.Net学习笔记001--ASP.Net简介1
- linux学习入门1——bash命令基本操作(linuxcast.net)(bash部分快捷键、uname、history、通配符、切换用户、作业管理(前台、后台运行,暂停等操作))
- ASP.NET MVC Preview 4 源代码学习笔记 FilterAttribute
- ASP.NET学习笔记[9] - jQuery和UpdatePanel兼容的问题
- ASP.NET Core学习链接
- 黑马程序员之ADO.NET学习笔记:通过SqlCommand对象执行SQL语句
- [摘自MSDN] ASP.Net2.0学习 [1] 母版页 7: 引用 ASP.NET 母版页的内容
- asp.net学习资源网址
- C# System.Net.NetworkInformation 命名空间学习之NetworkInterface 类获取IP,DNS,Gateway,Mask, MAC等网络相关信息