win7+anaconda+CPU(无GPU)跑pointnet网络记录

1、前期准备
安装好anaconda 和pytorch
2、下载pointnet文件
下载地址
3、下载数据集
本来下载地址在pointnet包里的bash文件里,但只适用于Linux系统,所以Windows需要手动下载,下载地址
4、打开anaconda navigator,点击环境打开主环境或者是自建环境(注意要安装有pytorch),点击三角形打开终端。
在这里插入图片描述
5、cd 到pointnet程序包目录下,如:C:\Users\Administrator\Downloads\pointnet.pytorch-master在这里插入图片描述
安装pointnet所需环境,在终端中输入:

pip install -e .

6.打开utils中的train_classification.py文件,进行修改修改,(1)只调用CPU运行不使用cuda,(2)添加main函数,要不然会报多线程错误(3)调换scheduler.step()和optimizer.step()顺序,要不pytotrch1.1之后的版本都会报错

修改完的代码如下:

from __future__ import print_function
import argparse
import os
import random
import torch
import torch.nn.parallel
import torch.optim as optim
import torch.utils.data
from pointnet.dataset import ShapeNetDataset, ModelNetDataset
from pointnet.model import PointNetCls, feature_transform_regularizer
import torch.nn.functional as F
from tqdm import tqdm

def main():
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--batchSize', type=int, default=32, help='input batch size')
    parser.add_argument(
        '--num_points', type=int, default=2500, help='input batch size')
    parser.add_argument(
        '--workers', type=int, help='number of data loading workers', default=4)
    parser.add_argument(
        '--nepoch', type=int, default=250, help='number of epochs to train for')
    parser.add_argument('--outf', type=str, default='cls', help='output folder')
    parser.add_argument('--model', type=str, default='', help='model path')
    parser.add_argument('--dataset', type=str, required=True, help="dataset path")
    parser.add_argument('--dataset_type', type=str, default='shapenet', help="dataset type shapenet|modelnet40")
    parser.add_argument('--feature_transform', action='store_true', help="use feature transform")

    opt = parser.parse_args()
    print(opt)

    blue = lambda x: '\033[94m' + x + '\033[0m'

    opt.manualSeed = random.randint(1, 10000)  # fix seed
    print("Random Seed: ", opt.manualSeed)
    random.seed(opt.manualSeed)
    torch.manual_seed(opt.manualSeed)

    if opt.dataset_type == 'shapenet':
        dataset = ShapeNetDataset(
            root=opt.dataset,
            classification=True,
            npoints=opt.num_points)

        test_dataset = ShapeNetDataset(
            root=opt.dataset,
            classification=True,
            split='test',
            npoints=opt.num_points,
            data_augmentation=False)
    elif opt.dataset_type == 'modelnet40':
        dataset = ModelNetDataset(
            root=opt.dataset,
            npoints=opt.num_points,
            split='trainval')

        test_dataset = ModelNetDataset(
            root=opt.dataset,
            split='test',
            npoints=opt.num_points,
            data_augmentation=False)
    else:
        exit('wrong dataset type')


    dataloader = torch.utils.data.DataLoader(
        dataset,
        batch_size=opt.batchSize,
        shuffle=True,
        num_workers=int(opt.workers))

    testdataloader = torch.utils.data.DataLoader(
            test_dataset,
            batch_size=opt.batchSize,
            shuffle=True,
            num_workers=int(opt.workers))

    print(len(dataset), len(test_dataset))
    num_classes = len(dataset.classes)
    print('classes', num_classes)

    try:
        os.makedirs(opt.outf)
    except OSError:
        pass

    classifier = PointNetCls(k=num_classes, feature_transform=opt.feature_transform)

    if opt.model != '':
        classifier.load_state_dict(torch.load(opt.model))


    optimizer = optim.Adam(classifier.parameters(), lr=0.001, betas=(0.9, 0.999))
    scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.5)
    classifier.to(device)

    num_batch = len(dataset) / opt.batchSize

    for epoch in range(opt.nepoch):
        #scheduler.step()
        optimizer.step()
        for i, data in enumerate(dataloader, 0):
            points, target = data
            target = target[:, 0]
            points = points.transpose(2, 1)
            points, target = points.to(device), target.to(device)
            optimizer.zero_grad()
            classifier = classifier.train()
            pred, trans, trans_feat = classifier(points)
            loss = F.nll_loss(pred, target)
            if opt.feature_transform:
                loss += feature_transform_regularizer(trans_feat) * 0.001
            loss.backward()
            #optimizer.step()
            scheduler.step()
            pred_choice = pred.data.max(1)[1]
            correct = pred_choice.eq(target.data).cpu().sum()
            print('[%d: %d/%d] train loss: %f accuracy: %f' % (epoch, i, num_batch, loss.item(), correct.item() / float(opt.batchSize)))

            if i % 10 == 0:
                j, data = next(enumerate(testdataloader, 0))
                points, target = data
                target = target[:, 0]
                points = points.transpose(2, 1)
                points, target = points.to(device), target.to(device)
                classifier = classifier.eval()
                pred, _, _ = classifier(points)
                loss = F.nll_loss(pred, target)
                pred_choice = pred.data.max(1)[1]
                correct = pred_choice.eq(target.data).cpu().sum()
                print('[%d: %d/%d] %s loss: %f accuracy: %f' % (epoch, i, num_batch, blue('test'), loss.item(), correct.item()/float(opt.batchSize)))

        torch.save(classifier.state_dict(), '%s/cls_model_%d.pth' % (opt.outf, epoch))

    total_correct = 0
    total_testset = 0
    for i,data in tqdm(enumerate(testdataloader, 0)):
        points, target = data
        target = target[:, 0]
        points = points.transpose(2, 1)
        points, target = points.to(device), target.to(device)
        classifier = classifier.eval()
        pred, _, _ = classifier(points)
        pred_choice = pred.data.max(1)[1]
        correct = pred_choice.eq(target.data).cpu().sum()
        total_correct += correct.item()
        total_testset += points.size()[0]

    print("final accuracy {}".format(total_correct / float(total_testset)))

if __name__=='__main__':
    main()


7,修改完成后 cd 到utils,开始训练网格,注意替换数据集地址

python train_classification.py --dataset F:/download/pointnet.pytorch/shapenetcore_partanno_segmentation_benchmark_v0/   --nepoch=20 --dataset_type shapenet

这样第一步分类训练就可以进行了。
还有其他参考

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Win10是Windows操作系统的最新版本,它具有更好的性能和用户体验。Anaconda是一个流行的Python发行版,它内置了许多科学计算和数据分析的库。PyTorch是一个深度学习框架,可以进行神经网络的设计和训练。 在Windows 10上安装AnacondaPyTorch是非常简单的。首先,我们可以从Anaconda官网下载适用于Windows 10的安装文件。下载完成后,双击运行安装程序,并按照提示进行安装。安装过程中,我们可以选择安装Anaconda所需的库和工具。 安装完成后,我们可以打开Anaconda Navigator,这是一个可视化的管理界面,可以帮助我们轻松管理和使用各种Python包和环境。在Navigator中,我们可以创建新的Python环境,选择安装所需的包。 接下来,我们需要安装PyTorch。在Anaconda Navigator中,我们可以通过选择我们创建的Python环境,然后点击“Channels”选项卡,选择“conda-forge”通道。然后,在搜索框中输入“pytorch”,选择合适的版本进行安装。 等待安装完成后,我们就可以在Python环境中使用PyTorch进行深度学习的开发了。我们可以使用PyTorch构建神经网络模型,进行训练和预测。此外,Anaconda还提供了许多其他有用的库,如NumPy、Pandas和Matplotlib,这些库可以帮助我们进行数据处理和可视化。 总结来说,使用Win10操作系统安装并使用AnacondaPyTorch是非常方便和简单的。通过Anaconda,我们可以快速配置Python环境,并方便地安装和管理所需的库和工具。而PyTorch则为我们提供了一个强大的深度学习框架,可以支持各种神经网络的设计和训练。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值