基于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
此时,二分网络已建成,可根据场景需要建立多分网络结构。