您的位置:首页 > 编程语言 > Go语言

paddle学习之复写GoogLeNet

2020-08-21 23:37 761 查看

GoogLeNet的意义

经过学习,我初步认识到了该网络的意义所在:
1.卷积核不一定是越大越好,本网络中多次使用小size的卷积核进行处理,也得到了很好的效果
2.本网络使用了Inception,利用不同大小的卷积核去处理图片从而得到了多尺度信息,但是这个channel设置有什么说法,还需要进一步学习。

代码

由于网络结构涉及到横向运算与纵向运算,所以不再绘图

import paddle
from paddle import fluid
from paddle.fluid.layers import reshape,mean,accuracy
from paddle.fluid.dygraph.nn import Conv2D,Pool2D,Linear

inception:

class Inception(fluid.dygraph.Layer):

def __init__(self,c,c2,c3,c4):
super(Inception,self).__init__()

self.conv1=Conv2D(num_channels=c,num_filters=c2[0],filter_size=1,act="relu")

self.conv2_1=Conv2D(num_channels=c,num_filters=c2[0],filter_size=1,act="relu")
self.conv2_2=Conv2D(num_channels=c2[0],num_filters=c2[1],filter_size=1,act="relu")

self.conv3_1=Conv2D(num_channels=c,num_filters=c3[0],filter_size=1,act="relu")
self.conv3_2=Conv2D(num_channels=c3[0],num_filters=c3[1],filter_size=5,padding=2,act="relu")

self.pool4_1=Pool2D(pool_padding=1,pool_size=3,pool_type="max")
self.conv4_2=Conv2D(num_channels=c,num_filters=c4,filter_size=1,act="relu")

def forward(self,x):

p1=self.conv1(x)
p2=self.conv2_2(self.conv2_1(x))
p3=self.conv3_2(self.conv3_1(x))
p4=self.conv4_2(self.pool4_1(x))

return fluid.layers.contact([p1,p2,p3,p4],axis=1)

net:

class googlenet(fluid.dygraph.Layer):
def __init__(self):
super(googlenet,self).__init__()

#module1:
self.conv_m1=Conv2D(num_channels=3,num_filters=64,filter_size=7,padding=3,act="relu")
self.pool_m1=Pool2D(pool_size=3,pool_stride=2,pool_padding=1,pool_type="max")

#module2
self.conv_m21=Conv2D(num_channels=64,num_filters=64,filter_size=1,act="relu")
self.conv_m22=Conv2D(num_channels=64,num_filters=192,filter_size=3,act="relu")
self.pool_m23=Pool2D(pool_size=3,pool_stride=2,pool_padding=1,pool_type="max")

#module3
self.inception_m31=Inception(192,64,(96,128),(16,32),32)
self.inception_m32=Inception(256,128,(128,192),(32,96),(64))
self.pool_m33=Pool2D(pool_size=3,pool_stride=2,padding=1,pool_type="max")

#module4
self.inception_m41=Inception(480,192,(96,208),(16,48),64)
self.inception_m42=Inception(512,160,(112,224),(24,64),64)
self.inception_m43=Inception(512,128,(128,256),(24,64),64)
self.inception_m44=Inception(512,112,(114,288),(32,64),64)
self.inception_m45=Inception(528,256,(160,320),(32,128),128)
self.pool_m46=Pool2D(pool_size=3,pool_stride=2,pool_padding=1,pool_type="max")

#module5
self.inception_m51=Inception(832,256,(160,320),(32,128),128)
self.inception_m52=Inception(832,384,(192,384),(48,128),128)
self.pool_m53=Pool2D(pool_size=1,global_pooling=True,pool_type="avg")

self.fc = Linear(input_dim=1024, output_dim=1, act=None)
def forward(self,x):
x=self.pool_m1(self.conv_m1(x))
x=self.pool_m23(self.conv_m22(self.conv_m21(x)))
x=self.pool_m33(self.inception_m32(self.inception_m32(x)))
x=self.pool_m46(self.inception_m45(self.inception_m44(self.inception_m43(self.inception_m42(self.inception_m41(x))))))
x=self.pool_m53(self.inception_m52(self.inception_m51(x)))
x=reshape(x,[x.shape[0],-1])
x=self.fc(x)

return x
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: