基于MindSpore编写二分网络架构

基于MindSpore编写二分网络架构

当前单纯的某个网络很难有效执行复杂任务,比如戴有墨镜的人脸识别或者戴有口罩的人脸识别,需要把整张人脸和半张人脸输入到二分网络中,分别进行学习解析,在FC层把它们整合到一起,尤其在多任务学习领域中,二分甚至多分网络尤为重要。下面列举又给二分网络的例子。

 

二分网络架构(require_theta是求取STN仿射变换坐标函数,self.stn是得到输入x经过仿射变换后的x2和仿射变换矩阵的(1,1)坐标对应的值):

def construct(self, x):
    stn_theta  = self.require_theta(x)
    x_p, theta = self.stn(x,stn_theta)
    x = self.conv1(x)
    x = self.bn1(x)
    x = self.relu(x)
    c1 = self.maxpool(x)
    c2 = self.layer1(c1)
    c3 = self.layer2(c2)
    c4 = self.layer3(c3)
    c5 = self.layer4(c4)

    out = self.max(c5, (2, 3))
    out = self.global_bn(out)
    global_f = self.flatten(out)
    
    x_p = self.conv1(x_p)
    x_p = self.bn1(x_p)
    x_p = self.relu(x_p)
    c1_p = self.maxpool(x_p)

    c2_p = self.layer1(c1_p)
    c3_p = self.layer2(c2_p)
    c4_p = self.layer3(c3_p)
    c5_p = self.layer4(c4_p)

    out_p = self.max(c5_p, (2, 3))
    out_p = self.partial_bn(out_p)
    partial_f = self.flatten(out_p)

    global_out = self.global_fc(global_f)
    partial_out = self.partial_fc(partial_f)
    return global_f, partial_f, global_out, partial_out, theta

 

 

在初始化函数中定义

self.require_theta = HardAttn(2048)

 

再定义HardAttn类

class HardAttn(nn.Cell):
    def __init__(self, in_channels):
        super(HardAttn, self).__init__()
        layers = []
        self.relu = nn.ReLU()
        self.fc1 = _fc(128*128, 32)
        self.bn1 = _bn1(32)
        self.fc2 = _fc(32,4)
        self.bn2 = _bn1(4)
        self.reshape = P.Reshape()
        self.shape = P.Shape()
        self.reduce_mean = P.ReduceMean()


    def construct(self, x):
        x = self.reduce_mean(x, 1)
        x_size = self.shape(x)
        x = self.reshape(x, (x_size[0], 128*128))
        x = self.fc1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.fc2(x)
        x = self.bn2(x)
        x = self.reshape(x, (x_size[0], 4))
        return x

 

此时,二分网络已建成,可根据场景需要建立多分网络结构。

posted @ 2021-12-30 19:42  MS小白  阅读(37)  评论(0)    收藏  举报