tensor连接和拆分

连接

torch.cat()

函数目的: 在给定维度上对输入的张量序列 进行连接操作。

案例准备
a = torch.tensor([[1,2,3],[4,5,6],[7,8,9]], dtype=torch.float)
b = torch.tensor([[10,10,10,],[10,10,10],[10,10,10,]], dtype=torch.float)

在这里插入图片描述

# dim指的是维度,dim = 0就是行,所以下面的代码就是按行拼接
print("按行拼接:\n",torch.cat((a,b),dim=0))
print("按行拼接:\n",torch.cat((a,b),dim=0).shape) #6行3列

在这里插入图片描述

print("按列拼接:\n",torch.cat((a,b),dim=1))
print("按列拼接:\n",torch.cat((a,b),dim=1).shape)#3行6列

在这里插入图片描述

torch.stack()

沿着一个新维度对输入张量序列进行连接。 序列中所有的张量都应该为相同形状。
也就是2维拼成3维,3维拼4维,以此类推。

print("按行拼接:\n",torch.stack((a,b),dim=0))
print("按行拼接:\n",torch.stack((a,b),dim=0).shape) 

在这里插入图片描述

print("按行拼接:\n",torch.stack((a,b),dim=1))
print("按行拼接:\n",torch.stack((a,b),dim=1).shape)

在这里插入图片描述

print("按行拼接:\n",torch.stack((a,b),dim=2))
print("按行拼接:\n",torch.stack((a,b),dim=2).shape)

在这里插入图片描述

区别

stack与cat的区别在于,torch.stack()函数要求输入张量的大小完全相同,得到的张量的维度会比输入的张量的大小多1,并且多出的那个维度就是拼接的维度,那个维度的大小就是输入张量的个数。

c = torch.tensor([[10,20],[30,40],[50,60]], dtype=torch.float)
a = torch.tensor([[1,2,3],[4,5,6],[7,8,9]], dtype=torch.float)
torch.cat((a,c),dim=1)

在这里插入图片描述

#但是以下情况就会出错
torch.cat((a,c),dim=0)

在这里插入图片描述
如图,按行拼接会缺数据,报错吗,应该的。
在这里插入图片描述

torch.stack((a,c),dim=0)
###运行结果
RuntimeError: stack expects each tensor to be equal size, but got [3, 3] at entry 0 and [3, 2] at entry 1

再次验证stack需要两个大小一样的张量

拆分

torch.split()

def split(
tensor: Tensor, split_size_or_sections: Union[int, List[int]], dim: int = 0
) -> Tuple[Tensor, …]:

  • 按块大小拆分张量 除不尽的取余数,返回一个元组
a = torch.tensor([[1,2,3],[4,5,6],[7,8,9]], dtype=torch.float)
print(torch.split(a,2,dim=0))	#按行拆,两行拆成一个
print(torch.split(a,1,dim=0))	#按行拆,一行拆成一个
print(torch.split(a,1,dim=1))	#按列拆,一列拆成一个
print(torch.split(a,2,dim=1)) 	#按列拆,两列拆成一个

在这里插入图片描述

  • 按块数拆分张量
torch.chunk(a,2,dim=0)	#按行拆成两块
torch.split(a,2,dim=1)	#按列拆成两块

在这里插入图片描述

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基于PyTorch和LeNet模型实现猫狗分类的代码。我们将使用一个包含猫和狗的数据集,其中有25000张训练图像和12500张测试图像。 首先,我们需要安装PyTorch和torchvision库: ``` !pip install torch torchvision ``` 然后,我们需要下载数据集并将其拆分为训练集和测试集。你可以使用以下代码下载数据集: ``` !wget https://www.dropbox.com/s/0yzyf7bojd8xu9w/cat_dog_dataset.zip !unzip cat_dog_dataset.zip ``` 接下来,我们将使用以下代码来加载数据集并进行必要的预处理: ``` import torch import torchvision.transforms as transforms from torchvision.datasets import ImageFolder #设置数据预处理 transform = transforms.Compose([ transforms.Resize((32, 32)), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) #加载数据集 train_dataset = ImageFolder('cat_dog_dataset/train', transform=transform) test_dataset = ImageFolder('cat_dog_dataset/test', transform=transform) #设置批量大小 batch_size = 32 #创建数据加载器 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False) ``` 现在我们已经准备好开始构建模型了。我们将使用经典的LeNet-5模型,该模型适用于图像分类任务。下面是LeNet-5模型的实现: ``` import torch.nn as nn import torch.nn.functional as F class LeNet(nn.Module): def __init__(self): super(LeNet, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool1 = nn.MaxPool2d(2) self.conv2 = nn.Conv2d(6, 16, 5) self.pool2 = nn.MaxPool2d(2) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 2) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool1(x) x = F.relu(self.conv2(x)) x = self.pool2(x) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x ``` 我们定义了一个包含两个卷积层和三个全连接层的LeNet类。我们使用ReLU激活函数来增加非线性性,并且使用最大池化层来减少空间维度。 现在,我们将实例化LeNet类并定义我们想要使用的优化器和损失函数: ``` #实例化模型 model = LeNet() #定义优化器和损失函数 learning_rate = 0.001 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) ``` 我们使用Adam优化器和交叉熵损失函数进行训练。现在,我们可以开始训练模型: ``` #设置训练参数 num_epochs = 10 total_step = len(train_loader) #训练模型 for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): #前向传播 outputs = model(images) loss = criterion(outputs, labels) #反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() #记录训练状态 if (i+1) % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, i+1, total_step, loss.item())) ``` 在每个epoch中,我们遍历训练数据加载器并执行前向传播、反向传播和优化步骤。我们还打印了在每个epoch中的损失值以进行训练状态的记录。 现在,我们已经训练好了模型,我们可以在测试集上测试它的性能: ``` #测试模型 with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: #前向传播 outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Test Accuracy of the model on the test images: {} %'.format(100 * correct / total)) ``` 我们计算了模型在测试集上的准确率。现在,我们已经实现了一个基于PyTorch和LeNet模型的猫狗分类器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值