上次说到模型是由一个副程序_build_deeplab
去建立的,但由於Deeplab有支援multi GPU,所以在建立整个训练流程时,需要部署模型与资料,也就是说,我可能需要去看model_deploy
这个东西是怎麽处理送来的_build_deeplab
。
好吧,不管怎麽样,我就先从model_deploy
开始看吧。
model_deploy是从deployment这里import进来的,我从github的deeplab资料夹往上层移动,但没有看到有叫做deployment的资料夹,所以我又往deeplab的README.md
去看,找到Installation的连结,也没有看到,只有看到slim,所以先去slim资料夹找。
幸运的是,部署的功能的确是在slim这个专案内。
赶紧来看deployment.py
deployment.py
一开始呼叫的是create_clones()
,model_fn的参数放的是_build_deeplab()这个副程序的名字,然後args放的是model_args。
create_clones
就是在处理每个GPU上需要的资源:组成模型的tensor。就一般认知而言,每个变数在同一个程序中,必须是不同的名称,才能正常运作,但是在Deep Learning开出来的模型中,随便就会产生出好几百万个变数,所以在命名时为了方便,可以加入scope,去简单的把变数分组。
具体作法就是:假设今天有个scope叫做「Tesla」,那麽在这个with这个scope底下所有新产生的tensor,他的tensor name都会自带Tesla/
作为标示,像是如果在这个底下建立一个conv layer, 那麽这个conv layer的名称就会是Tesla/Conv_xx
。
然後因为slim的API预设会让convlution layer加上一个bias,所以其实他的名称会是
Tesla/Conv_xx/BiasAdd
的样子
那为了能在不同的clone上辨识同名同姓的tensor,所以在使用multi gpu时,会需要把模型中同样名称的tensor,再用scope加入一个可以标示他属於哪个clone的标示,就是像上图187行在做的事一样。
每一层关於scope的部分,都是在处理这个名称问题。
预备处理好到时候产生model时,各clone需要调整名称的问题,192行就呼叫了model_fn
,然後...*你以为他是return 一个outputs吗?
*错了!才不是呢,因为_build_deeplab()这个method根本没有return值!!没有吧?
他其实是把model_fn(*args, **kwargs)
整个放入outputs
这个变数,然後再把它放到Clone里。
Clone是什麽?
这个要拉到上面看118行,他是一个有名称的tuple,有outputs
:经过模型後的output、scope
:会建立在哪个scope里、device
:会在哪片GPU上跑。
然後把设定append进clones
变数里,回传它。
讲到这边,看来似乎得去看_build_deeplab到底在做什麽,才会明白outputs
这个栏位放的是什麽东西。
我暂时无法理解,他在写这个model_fn时,设定的这三个参数要怎麽从model_args取得,但没关系,反正我只要知道他会传过来就行。
总而言之,这个method会取得已经处理好的dataset做成的iterator,和训练集的分类数量,以及忽略计算的label是哪个。
还记得我们的sample格式有key name为common.IMAGE
跟common.LABEL
的栏位。
後面的ModelOptions的呼叫方式不太懂,希望明天的我会懂。
<<: 【少女人妻的30天Elastic】Day 29 : App Search_API 介绍与应用_Curations
>>: iOS Developer Learning Flutter. Lesson28 打包上架
Colab连结 图片标准化 Image Normalization 不做可以吗?小实验实测差别 一般...
Day 5 进到了网站中最常见需要做功能性的环节 Button <Button variant...
今天来讲讲 Math.pow( ),那这个是什麽呢,昨天讲的是Math.round( )四舍五入的语...
五、了解利害关系者的需求和期望 组织必须确定与资讯安全管理系统相关的利害关系者及其要求,有关利害关系...
遍历 HTML tag 这时候你会需要使用Vue Server Test Utils暴露的另一个方法...