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。
4、使用empty跟内建函数random_进行初始化Tensor:
# 将y取0或1
y = torch.empty(3).random_(2)
其中如果函数有下标“_”这个表示时Tensor里的内建函数,其中产生一个0到2-1的整数值来随机初始化y。