• 技术文章 >后端开发 >Python教程

    pytorch + visdom CNN处理自建图片数据集的方法

    不言不言2018-06-04 16:19:00原创3115
    这篇文章主要介绍了关于pytorch + visdom CNN处理自建图片数据集的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

    环境

    系统:win10

    cpu:i7-6700HQ

    gpu:gtx965m

    python : 3.6

    pytorch :0.3

    数据下载

    来源自Sasank Chilamkurthy 的教程; 数据:下载链接。

    下载后解压放到项目根目录:

    php入门到就业线上直播课:进入学习


    数据集为用来分类 蚂蚁和蜜蜂。有大约120个训练图像,每个类有75个验证图像。

    数据导入

    可以使用 torchvision.datasets.ImageFolder(root,transforms) 模块 可以将 图片转换为 tensor。

    先定义transform:

    ata_transforms = {
      'train': transforms.Compose([
        # 随机切成224x224 大小图片 统一图片格式
        transforms.RandomResizedCrop(224),
        # 图像翻转
        transforms.RandomHorizontalFlip(),
        # totensor 归一化(0,255) >> (0,1)  normalize  channel=(channel-mean)/std
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
      ]),
      "val" : transforms.Compose([
        # 图片大小缩放 统一图片格式
        transforms.Resize(256),
        # 以中心裁剪
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
      ])
    }

    导入,加载数据:

    data_dir = './hymenoptera_data'
    # trans data
    image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']}
    # load data
    data_loaders = {x: DataLoader(image_datasets[x], batch_size=BATCH_SIZE, shuffle=True) for x in ['train', 'val']}
    
    data_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
    class_names = image_datasets['train'].classes
    print(data_sizes, class_names)
    {'train': 244, 'val': 153} ['ants', 'bees']

    训练集 244图片 , 测试集153图片 。

    可视化部分图片看看,由于visdom支持tensor输入 ,不用换成numpy,直接用tensor计算即可 :

    inputs, classes = next(iter(data_loaders['val']))
    out = torchvision.utils.make_grid(inputs)
    inp = torch.transpose(out, 0, 2)
    mean = torch.FloatTensor([0.485, 0.456, 0.406])
    std = torch.FloatTensor([0.229, 0.224, 0.225])
    inp = std * inp + mean
    inp = torch.transpose(inp, 0, 2)
    viz.images(inp)

    创建CNN

    net 根据上一篇的处理cifar10的改了一下规格:

    class CNN(nn.Module):
      def __init__(self, in_dim, n_class):
        super(CNN, self).__init__()
        self.cnn = nn.Sequential(
          nn.BatchNorm2d(in_dim),
          nn.ReLU(True),
          nn.Conv2d(in_dim, 16, 7), # 224 >> 218
          nn.BatchNorm2d(16),
          nn.ReLU(inplace=True),
          nn.MaxPool2d(2, 2), # 218 >> 109
          nn.ReLU(True),
          nn.Conv2d(16, 32, 5), # 105
          nn.BatchNorm2d(32),
          nn.ReLU(True),
          nn.Conv2d(32, 64, 5), # 101
          nn.BatchNorm2d(64),
          nn.ReLU(True),
          nn.Conv2d(64, 64, 3, 1, 1),
          nn.BatchNorm2d(64),
          nn.ReLU(True),
          nn.MaxPool2d(2, 2), # 101 >> 50
          nn.Conv2d(64, 128, 3, 1, 1), #
          nn.BatchNorm2d(128),
          nn.ReLU(True),
          nn.MaxPool2d(3), # 50 >> 16
        )
        self.fc = nn.Sequential(
          nn.Linear(128*16*16, 120),
          nn.BatchNorm1d(120),
          nn.ReLU(True),
          nn.Linear(120, n_class))
      def forward(self, x):
        out = self.cnn(x)
        out = self.fc(out.view(-1, 128*16*16))
        return out
    
    # 输入3层rgb ,输出 分类 2    
    model = CNN(3, 2)

    loss,优化函数:

    line = viz.line(Y=np.arange(10))
    loss_f = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=LR, momentum=0.9)
    scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)

    参数:

    BATCH_SIZE = 4
    LR = 0.001
    EPOCHS = 10

    运行 10个 epoch 看看:

    [9/10] train_loss:0.650|train_acc:0.639|test_loss:0.621|test_acc0.706
    [10/10] train_loss:0.645|train_acc:0.627|test_loss:0.654|test_acc0.686
    Training complete in 1m 16s
    Best val Acc: 0.712418

    运行 20个看看:

    [19/20] train_loss:0.592|train_acc:0.701|test_loss:0.563|test_acc0.712
    [20/20] train_loss:0.564|train_acc:0.721|test_loss:0.571|test_acc0.706
    Training complete in 2m 30s
    Best val Acc: 0.745098

    准确率比较低:只有74.5%

    我们使用models 里的 resnet18 运行 10个epoch:

    model = torchvision.models.resnet18(True)
    num_ftrs = model.fc.in_features
    model.fc = nn.Linear(num_ftrs, 2)
    [9/10] train_loss:0.621|train_acc:0.652|test_loss:0.588|test_acc0.667
    [10/10] train_loss:0.610|train_acc:0.680|test_loss:0.561|test_acc0.667
    Training complete in 1m 24s
    Best val Acc: 0.686275

    效果也很一般,想要短时间内就训练出效果很好的models,我们可以下载训练好的state,在此基础上训练:

    model = torchvision.models.resnet18(pretrained=True)
    num_ftrs = model.fc.in_features
    model.fc = nn.Linear(num_ftrs, 2)
    [9/10] train_loss:0.308|train_acc:0.877|test_loss:0.160|test_acc0.941
    [10/10] train_loss:0.267|train_acc:0.885|test_loss:0.148|test_acc0.954
    Training complete in 1m 25s
    Best val Acc: 0.954248

    10个epoch直接的到95%的准确率。

    相关推荐:

    pytorch + visdom 处理简单分类问题

    以上就是pytorch + visdom CNN处理自建图片数据集的方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:pytorch visdom 图片
    上一篇:python实现判断一个字符串是否是合法IP地址 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• Python NumPy教程之数据类型对象• 使用Python处理KNN分类算法• Python标准库中的logging用法示例• python发腾讯微博代码分享• python自动化测试实例解析
    1/1

    PHP中文网