pytorch里cat、stack、unsqueeze、squeeze、自带网络自适应输入大小方法、初始化一个输入获取最后一层特征向量的维度大小

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangdashi888/article/details/85781496

1、其中cat是用于拼接矩阵数据:

参考:pytorch中的cat、stack、tranpose、permute、unsqeeze

#把数据1跟数据2进行按行拼接,其中0,表示按行,如果1则表示按列
outputssum = torch.cat((outputs1, outputs2), 0)
outputssum = torch.cat((outputssum, outputs3), 0)
#返回矩阵中最大值跟其index其中第一个'_'是数据的index位置,preds是返回的数据大小
_, preds = torch.max(outputssum.data, 1)

其中cat适合构建残差网络的适合使用,其用于合并通道构建特征图。如下构建densenet的一些基本block模块:

    def forward(self, x):
        new_features = super(_DenseLayer, self).forward(x)
        if self.drop_rate > 0:
            new_features = F.dropout(new_features, p=self.drop_rate, training=self.training)
        return torch.cat([x, new_features], 1)

B、stack会增加维度信息,用于把多个单图样本构建成一个batchsize的训练数据集或者用于构建3D数据集,集时序数据集:

        clip = self.loader(path, frame_indices)
        torch.Tensor.transpose(torch.from_numpy(np.array(clip[0])), 0, 2)
        if self.spatial_transform is not None:
            # 这个注释了会报错
            self.spatial_transform.randomize_parameters()
            datalist=[]
            for img in clip:
                datalist.append(np.array(img))
            #这里clip是一个列表里面的成员为[3,112,112]
            clip = [self.spatial_transform(img) for img in clip]
         #这里通过stack合并成一个[16,3,112,112]的3d时序数据。permute进行多通道装置
        clip = torch.stack(clip, 0).permute(1, 0, 2, 3)

其中stack的另一例子:

a = torch.ones([1,2])
b = torch.ones([1,2])
c= torch.stack([a,b],0) // 第0个维度stack

C、transpose进行维度交换:

一次性只能进行多个维度中的其中两个维度进行交换:

torch.manual_seed(1)
x = torch.randn(2,3)
print(x)
x.transpose(0,1)

D、permute适合多维数据交换,比transpose更灵活:

x = torch.randn(2,3,4)
print(x.size())
x_p = x.permute(1,0,2) # 将原来第1维变为0维,同理,0→1,2→2
print(x_p.size())

E、squeeze 和unsqueeze:

squeeze:进行维度压缩,其去掉的只能是维度值为1的矩阵;

unsqueeze:进行数据维度增维,其增加的值是1;

2、如何调节网络自适应数据的输入大小:

 pytorch自带的网络都是按照224为输入大小构造的,如果输入数据不等于224则会报错。其实只要改一处就可以使其自适应任何输入数据大小。代码如下:

 from torch.nn import functional as F   
 def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        # 把这里的平均池化的核大小改为上一层输出数据特征图大小即可。原始的使固定为7.
        # x = self.model.avgpool(x) 原始的平均池化的操作函数
        x = F.avg_pool2d(x, x.size(2), 1)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

修改自带网络最好备份一个进行修改。

3、如何获取残差网络的最后一层的特征向量:

    inputdata=np.ones([1,3,224,224])
    # input=torch.Tensor()
    inputs=torch.from_numpy(inputdata).float().cuda()
    model = models.resnet18(pretrained=True)
    model.cuda()
    model.forward(inputs)

得到resnet18的最后特征向量维度导大小是512。

猜你喜欢

转载自blog.csdn.net/yangdashi888/article/details/85781496