上个ep稍微去看了deployment.py
後,大概知道他在处理各个clone拿到的model的tensor name,那代表,要真的了解model在干麻,还是得回归到train.py
里作为model_fn的_build_deeplab()
才行。
build model的过程伴随着资料的输入,第一件做的事情就是从iterator中取出一个batch的训练样本。
上次就讲到这些,让我们继续开始吧。
train.py
(cont.)
ModelOptions
是来自common.py
的class,目的就是在制作要设定此次模型的参数。
outputs_to_num_classes
就是此次分类的数量crop_size
是input tensor shape,之前iterator已经按照这个尺寸处理好资料了atrous_rates
就是deeplab的论文核心,空洞的部分,顺带一提,蛮多API的conv layer都已经有提供这个参数做使用。output_stride
是input的尺寸与output尺寸的比例,我记得应该是input/output
这个部分就要去看model.py
的multi_scale_logits()
,我一直蛮好奇这个「logits」指的究竟是什麽意思?我们通常搭建的模型会是前面有许多conv layer层去找特徵,然後後面接几个全连接层将其展开,然後最後用一层输出跟分类数量一样的神经层去输出最後的output。而这个logits,一般就是最後一层的「前一层」的输出。
也就是说,主要的模型架构应该就在这个method里面。
接下来是将模型的logits取出来,把他们存在一个dict里,并且给他tensor name。
接着最後就是将logits送去给add_softmax_cross_entropy_loss_for_each_scale()
去计算最後的输出,并且跟label进行比较。
有没有做到更新参数这件事要等看了这个method才知道。
所以接着去utils资料夹看train_utils.py
的程序吧。
train.utils.py
对不同scale的logits,都去计算softmax cross entropy的loss。
其实在这个method的第74行~140行,都在处理scale的问题,让logits与label有对应到,所以会有一些resize跟reshape的部分。
这里其实还有一个重点,data与label使用的resize method不一样,也不应该一样,data适合使用bilinear这类interpolation的,而label则是适合nearest neighbor这类的resize。
毕竟不会有人希望,label resize後,居然出现1.5这种label...
最终就是把label跟logits拿去计算loss,不过这里已经到tf.nn这个原始API了,身为上层API的使用户,我已经无法继续解释下去了,所以只能在这里打住。
噢然後在算完loss後,其实有个叫top_k的东西,可以用来帮忙提高更新loss的效率,就是top_k。
他的使用时机就是在算完loss後,把loss交给这个method,他就会去取loss最高的前k个,只把这些loss拿出来,然後去把这些地方做更新。
然後之後把loss加进tf.losses这个地方,没意外的话,我想这些loss,应该是可以被tf.GraphKeys.LOSSES找到的。
这样,应该都结束了吧。
系统上下文图 System Context Diagram (SCD) 是一种概念图的呈现,用於表达...
电脑中的字元 电脑中的所有资料都是用0和1表示,为了表示不同的资料,电脑中存在许多不同的解读规则 电...
影分身之术 网站正式上线运行时,会开始有使用者访问浏览,流量就会开始出现变化,当网站推广新活动或周年...
2021/12/15更新:Meta公司改名 我还在解Bug跟试其他的模拟器,今天就先来看看我能找到的...
这系列文章,将会带过数个跨度极大的主题,故有需要先於开篇的引文来作展开。 首先,我们由RISC-V是...