ASGNet论文和代码解读( 五 )


参考:中残差网络的源码解读
四、Debug模型的(Way-Shot:支撑集图片和mask有shot张,但是查询集图片和mask只有1张)
输入进函数的参数:
4.1 处理查询集特征(没有使用到即): PS:with torch.的作用
参考:【系列】 with torch.():用法详解
with torch.() 是一个上下文管理器,由它管理的代码块不需要计算梯度,也不会进行反向传播,因此在训练阶段常用于验证集计算loss、在测试阶段,则需要加上该代码,避免进行损失梯度的计算
首先从讲起:
在中,有一个参数,如果设置为True,则反向传播时,该就会自动求导 。的的属性默认为False,若一个节点(叶子变量:自己创建的)被设置为True,那么所有依赖它的节点都为True(即使其他相依赖的的 = False)
当设置为False时,反向传播时就不会自动求导了,因此大大节约了显存或者说内存 。
with torch.的作用
在该模块下,所有计算得出的的都自动设置为False 。
处 理 查 询 集 特 征 代 码 如 下 : \color{red}{处理查询集特征代码如下:} 处理查询集特征代码如下:
得到的特征图尺寸如下:(因为卷积的是不一样的,所以输出的特征图后两个维度也可能不一样)
可以看出3和2特征图[60, 60]是一样的,所以可以按照通道数拼接:
调用self.函数进行通道数1024+512 ----- 256卷积和:
self.down_conv = nn.Sequential(nn.Conv2d(fea_dim, reduce_dim, kernel_size=1, padding=0, bias=False),nn.Dropout2d(p=0.5))
最后查询集特征变成
4.2 处理支撑集特征(也没有使用到即):
处 理 支 撑 集 特 征 代 码 如 下 : \color{red}{处理支撑集特征代码如下:} 处理支撑集特征代码如下:
使用np.(s_y.cpu().numpy()).()查看s_y中数值:
尺度变化:
里面只有0.0和1.0(存在目标的地方,即原来为1的地方变为1.0;原来为255自动变为0):
最后mask = (s_y[:, i, :, :] == 1).float().(1)得到的mask只包含0.0和1.0,它的尺度如下:
PS:【学习笔记】中()和()函数介绍
参考:中()和()函数介绍
一、()函数
首先初始化一个a
可以看出a的维度为(2,3)在第二维增加一个维度,使其维度变为(2,1,3)
可以看出a的维度已经变为(2,1,3)了,同样如果需要在倒数第二个维度上增加一个维度,那么使用b.(-2)
二、()函数介绍
1.首先得到一个维度为(1,2,3)的(张量)
由图中可以看出c的维度为(1,2,3)
2.下面使用()函数将第一维去掉
可见,维度已经变为(2,3)
3.另外如果倒数第二个维度2就不行了
可以看出维度并没有变化,仍然为(1,2,3),这是因为只有维度为1时才会去掉 。
下一步输入到:尺度由原来[16, Shot, c, h, w]变为[16, c, h, w]
支撑集特征经过网络后:和支撑集一样最后都变成了[16, 1024, 60, 60],无
然后经过双线性插值:将mask的尺度变为和图像特征一样的【60,60】
添加到中(主要针对shot>1的情况,可以加到list中) 。
支撑集特征和按照通道数cat,再下采样为256通道
添加到中(主要针对shot>1的情况)
4.3 SGC自适应超像素引导聚类模块
S G C 代 码 如 下 : \color{red}{SGC代码如下:} SGC代码如下:
其中.size()尺度如下:
查看中的元素:[0, 1, 5, 9,10, 11, 12, 13, 14, 17,18,19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 50, 51, 52, 53, 54, 57, 59]
五、自己的修改
以下实验都使用了在上的预训练权重 。