复现PointNet++时,遇到的问题总结(PointNet++中的python语法)

本文总结了在复现PointNet++时遇到的Python语法问题,包括使用GPU和CPU、独热编码、argparse命令行参数解析、日志信息处理、pathlib路径操作以及strip和split函数的用法。对于机器学习和深度学习开发者来说,这些是实现项目过程中常见的技术点。
摘要由CSDN通过智能技术生成

1、使用GPU和CPU的方法。

y.cpu()使用CPU进行计算。

y.cuda(),使用GPU进行计算。

2、one-hot encode(独热编码)

独热码是一组数,其中只有一个值为1,其余都是0。同样的,一组数中只有一个0,而其余都为1则称为独冷码

举例:

如四类物品,标签为1,2,3,4.

采用独热编码,一个标签对应一个编码:

1:[1,0,0,0]

2:[0,1,0,0]

3:[0,0,1,0]

4:[0,0,0,1]

为什么要用独热编码呢?

  1. 使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
  2. 将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
  3. 将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理

3、命令行参数解析器--argparse

argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过这个我们可以获取在命令行输入的内容。

使用方法:

  1. 导入argparse:import argparse
  2. 创建ArgumentParser()对象
  3. 调用add_argument()方法添加参数
  4. 使用parse_args()添加解析参数
import argparse

parse = argparseArgumentParser('Model')#Model是自己定义的名字
parse.add_argument('--model',type=str,default='mymodel',help='model name[default:mymodel]')

return parser.parse_args()

4、日志信息(转自:https

以下是使用PyTorch复现PointNet的基本步骤: 1. 导入必要的库 ```python import torch import torch.nn as nn import torch.nn.functional as F ``` 2. 定义PointNet的基本操作 ```python class TNet(nn.Module): def __init__(self, k=3): super(TNet, self).__init__() self.conv1 = nn.Conv1d(k, 64, 1) self.conv2 = nn.Conv1d(64, 128, 1) self.conv3 = nn.Conv1d(128, 1024, 1) self.fc1 = nn.Linear(1024, 512) self.fc2 = nn.Linear(512, 256) self.fc3 = nn.Linear(256, k*k) def forward(self, x): batch_size = x.size(0) x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = F.relu(self.conv3(x)) x = torch.max(x, 2, keepdim=True)[0] x = x.view(-1, 1024) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) iden = torch.eye(x.size(1)).view(1, x.size(1)*x.size(1)).repeat(batch_size,1) if x.is_cuda: iden = iden.cuda() x = x + iden x = x.view(-1, x.size(1), x.size(1)) return x ``` 3. 定义PointNet的分类模型 ```python class PointNetCls(nn.Module): def __init__(self, k=2): super(PointNetCls, self).__init__() self.tnet1 = TNet(k=3) self.conv1 = nn.Conv1d(3, 64, 1) self.conv2 = nn.Conv1d(64, 64, 1) self.tnet2 = TNet(k=64) self.conv3 = nn.Conv1d(64, 128, 1) self.conv4 = nn.Conv1d(128, 1024, 1) self.fc1 = nn.Linear(1024, 512) self.fc2 = nn.Linear(512, 256) self.fc3 = nn.Linear(256, k) def forward(self, x): batch_size = x.size(0) x = self.tnet1(x) x = torch.bmm(x, x.transpose(2,1)) x = x.unsqueeze(1) x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = torch.max(x, 2, keepdim=True)[0] x = x.repeat(1, 1, 1024) x = torch.cat([x, self.tnet2(x)], 1) x = F.relu(self.conv3(x)) x = self.conv4(x) x = torch.max(x, 2, keepdim=True)[0] x = x.view(-1, 1024) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return F.log_softmax(x, dim=1) ``` 4. 定义损失函数和优化器 ```python model = PointNetCls() criterion = nn.NLLLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` 5. 进行训练 ```python for epoch in range(50): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch %d loss: %.3f' %(epoch+1, running_loss/len(trainloader))) ``` 6. 进行测试 ```python correct = 0 total = 0 with torch.no_grad(): for data in testloader: inputs, labels = data outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy: %.2f %%' % (100 * correct / total)) ``` 这就是使用PyTorch复现PointNet的基本步骤。可以根据需要进行调整和改进,以获得更好的性能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值