大家好,欢迎来到IT知识分享网。
大家好,小编来为大家解答以下问题,python如何编写小程序,python小程序开发教程,今天让我们一起来看看吧!
问题导出:
比如CTPN的网络结构在 下:
((‘data’)
.conv(3, 3, 64, 1, 1, name=’conv1_1′)
.conv(3, 3, 64, 1, 1, name=’conv1_2′)
.max_pool(2, 2, 2, 2, padding=’VALID’, name=’pool1′)
.conv(3, 3, 128, 1, 1, name=’conv2_1′)
.conv(3, 3, 128, 1, 1, name=’conv2_2′)
.max_pool(2, 2, 2, 2, padding=’VALID’, name=’pool2′)
.conv(3, 3, 256, 1, 1, name=’conv3_1′)
.conv(3, 3, 256, 1, 1, name=’conv3_2′)
.conv(3, 3, 256, 1, 1, name=’conv3_3′)
.max_pool(2, 2, 2, 2, padding=’VALID’, name=’pool3′)
.conv(3, 3, 512, 1, 1, name=’conv4_1′)
.conv(3, 3, 512, 1, 1, name=’conv4_2′)
.conv(3, 3, 512, 1, 1, name=’conv4_3′)
.max_pool(2, 2, 2, 2, padding=’VALID’, name=’pool4′)
.conv(3, 3, 512, 1, 1, name=’conv5_1′)
.conv(3, 3, 512, 1, 1, name=’conv5_2′)
.conv(3, 3, 512, 1, 1, name=’conv5_3′))
#========= RPN ============
((‘conv5_3’)
.conv(3,3,512,1,1,name=’rpn_conv/3×3′))
((‘rpn_conv/3×3′).Bilstm(512,128,512,name=’lstm_o’))
((‘lstm_o’).lstm_fc(512,len(anchor_scales) * 10 * 4, name=’rpn_bbox_pred’))
((‘lstm_o’).lstm_fc(512,len(anchor_scales) * 10 * 2, name=’rpn_cls_score’))
# generating training labels on the fly
# output: rpn_labels(HxWxA, 2) rpn_bbox_targets(HxWxA, 4) rpn_bbox_inside_weights rpn_bbox_outside_weights
# 给每个anchor上标签,并计算真值(也是delta的形式),以及内部权重和外部权重
((‘rpn_cls_score’, ‘gt_boxes’, ‘gt_ishard’, ‘dontcare_areas’, ‘im_info’)
.anchor_target_layer(_feat_stride, anchor_scales, name = ‘rpn-data’ ))
# shape is (1, H, W, Ax2) -> (1, H, WxA, 2)
# 给之前得到的score进行softmax,得到0-1之间的得分
((‘rpn_cls_score’)
.spatial_reshape_layer(2, name = ‘rpn_cls_score_reshape’)
.spatial_softmax(name=’rpn_cls_prob’))
整体的网络结构是Conv+RPN+Bi-LSTM+fc,但本文探究的就不是这些了,只是好奇为什么这么多网络结构能链式连接在一起,所以恰当来说,本文类型属于Python语法之类了python 可视化设计界面。
———————————————————————–纯语法,非喜勿进———————————————————————
首先需要这个Class是如何调用的。
:
class VGGnet_train(Network):
:
class Network(object):
在实例化class VGGnet_train的时候,继承了class Network,所以class VGGnet_train继承了class Network所有的类函数。
实例化的过程会调用__init__()函数,可以看到最后一行:
self.setup()
所以说网络结构在一开始实例化的时候就加载进内存了,只不过一般都会初始化为一个值(比如Conv中的weights一般初始化为mean为0、std为0.1的值)。
分析setup()函数,从(‘data’)开始,就一直链式调用将所有网格加载进来了。
首先来说,self代表的是类的实例化,而非类,可以参考Python面向对象。
类的实例化表明其可以通过点号来访问类的属性。
先下个结论,链式调用的原理是type(self) = type((‘data’)) = type((3, 3, 64, 1, 1, name=’conv1_1′)),即类的实例化访问类属性后返回值依然是类的实例化,从而可以继续访问返回值的类属性,实现链式调用。
那么关键是,怎么实现:类的实例化访问类属性后返回值依然是类的实例化,答案就是里面的装饰器函数layer()【注:feed()函数除外,其本身就返回了一个类的实例化self】,在一个函数上方添加代码@layer就是其表示形式。
装饰器的作用就是将被修饰的函数作为参数,并返回修饰后的同名函数或其它可调用的东西。
在这份代码里,意思就是在执行属性conv(3, 3, 64, 1, 1, name=’conv1_1′)及max_pool(2, 2, 2, 2, padding=’VALID’, name=’pool1′)之前,会先调用layer函数。
分析conv()等函数发现,其与一般的卷积函数并无不同,也是调用TensorFlow里面的函数,将输入经过函数操作后得到输出值。
再回顾下装饰器的作用,操作被修饰的函数后,装饰器再执行操作返回类的实例化self即可。
观察源码发现确实是这样的,在layer()函数中:
# Perform the operation and get the output.
layer_output = op(self, layer_input, *args, kwargs)
# Add to layer LUT.
self.layers[name] = layer_output
# This output is now the input for the next layer.
(layer_output)
# Return self for chained calls.
return self
执行op(self, layer_input, *args, kwargs)操作会将输入处理后得到输出,最后还是需要return self的。
至于(layer_output)的作用,是将列表清空,将输出放入进去替换输入,这样下一次调用的输入就是这次的输出了,达到链式调用的目的。
原文地址1:https://blog.csdn.net/weixin_/article/details/
参考资料:python中用turtle画一个圆形 https://blog.csdn.net/SXIAOYAN_/article/details/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/145337.html