zoukankan      html  css  js  c++  java
  • pythorch CNN 小教程,关于如何自定义数据集

    之前用官方的minist数据集测试过了,现在想加载自己的数据集并进行识别分类,应该如何加载呢?

    利用ImageFolder函数,将所需分类的图片提前按文件夹分类分别置于train val文件夹下即可

    代码如下所示:

    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    import numpy
    import cv2
    import torchvision
    import torch.optim as optim
    from torchvision import datasets, models, transforms
    from torch.autograd import Variable
    
    class CNNnet(torch.nn.Module):
        def __init__(self):
            super(CNNnet, self).__init__()
            self.conv1 = torch.nn.Sequential(
                torch.nn.Conv2d(in_channels=3,    # input 3,16,400,1400
                                out_channels=16, #16个filter,提取16个特征作为输出
                                kernel_size=5,
                                stride=1,
                                padding=2),
                torch.nn.BatchNorm2d(16),  # 是一个filter,提取特征, 特征窗
                torch.nn.ReLU(),
                torch.nn.MaxPool2d(2)  # 池化层 out 16,200,700
            )
            self.conv2 = torch.nn.Sequential(
                torch.nn.Conv2d(16, 32, 5, 1, 2),
                torch.nn.BatchNorm2d(32),
                torch.nn.ReLU(),
                torch.nn.MaxPool2d(2)  # 32,100,350
            )
            self.conv3 = torch.nn.Sequential(
                torch.nn.Conv2d(32, 32, 5, 1, 2),
                torch.nn.BatchNorm2d(32),
                torch.nn.ReLU(),
                torch.nn.MaxPool2d(2)  # 32 50 175
            )
            # self.conv4 = torch.nn.Sequential(
            #
            #     torch.nn.Conv2d(32, 64, 5, 1, 2),  # 2*32*48
            #     torch.nn.BatchNorm2d(64),
            #     torch.nn.ReLU(),
            #     torch.nn.MaxPool2d(2)  # 64,25,87
            # )
            # self.mlp1 = torch.nn.Linear(2*2*2*16*24, 2000)
            self.mlp1 = torch.nn.Linear(32*64*64, 1000)
            self.mlp2 = torch.nn.Linear(1000, 3)
    
        def forward(self, x):
            x = self.conv1(x)
            x = self.conv2(x)
            x = self.conv3(x)
    
            # x = self.conv4(x)
            # print(x.shape)
            # t = x.size(0)
            x = self.mlp1(x.view(x.size(0), -1))
            out = self.mlp2(x)
            return out
    
    
    train_data = torchvision.datasets.ImageFolder('D:/pytorchdemo/pic/train',
                                                transform=transforms.Compose([
                                                    # transforms.Scale(512,768),
                                                    # transforms.Resize((512,768)),
                                                    transforms.CenterCrop(512),
                                                    transforms.ToTensor()])
                                                )
    test_data = torchvision.datasets.ImageFolder('D:/pytorchdemo/pic/val',
                                                transform=transforms.Compose([
                                                    # transforms.Scale(512,768),
                                                    # transforms.Resize((768,512)),
                                                    transforms.CenterCrop(512),
                                                    transforms.ToTensor()])
                                                )
    train_loader = torch.utils.data.DataLoader(train_data, batch_size=2,shuffle=True)
    test_loader = torch.utils.data.DataLoader(test_data,batch_size=2, shuffle=True)
    # print(train_data.train_data.size())
    x1,x2 = train_data.samples[0]
    # print(x1)
    
    
    model = CNNnet()
    loss_func = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=0.001)  # 设置学习方法
    # num_epochs = 100 # 设置训练次数
    EPOCH = 20
    # print(model)
    
    def train_fun():
        # epochs = 0
    
        loss_list = []
        for epoch in range(EPOCH):
            step = 0
            for data in (train_loader):
                b_x,b_y=data
                b_x,b_y=Variable(b_x),Variable(b_y)
                out_put=model(b_x)
                loss=loss_func(out_put,b_y)
                optimizer.zero_grad()
                loss.backward()
                optimizer.step()
                step += 1
            #
            # if epochs < 20:
            #     epochs += 1
                print('Epoch: ', epoch,'step: ',step,'loss: ', float(loss))
                loss_list.append(float(loss))
            # else:
            #     epochs += 1
    
        return loss_list
    
    
    # criterion = nn.MSELoss()  # 设定误差函数
    def test_fun():
        eval_loss = 0
        eval_acc = 0
        # for eopch in range(EPOCH):
        for data in (test_loader):
            b_x, b_y = data
            b_x, b_y = Variable(b_x), Variable(b_y)  # b_x 是 img b_y是标签
            out_put = model(b_x)
            loss = loss_func(out_put, b_y)
            eval_loss += loss.data.item() * b_y.size(0)
            _, pred = torch.max(out_put, 1)
            # print("pred",pred,b_y)
            num_correct = (pred == b_y).sum()
            eval_acc += num_correct.item()
            # print(eval_acc)
            print('Test Loss: {:.4f}, Acc: {:.4f}'.format(
            eval_loss / (len(test_data)),
            eval_acc / (len(test_data)), 100. * eval_acc / len(test_data)
        ))
    
    
    def main():
        print("------starting-------")
    
    
    if __name__ == '__main__':
        main()
        print("ok")
        # params = list(model.parameters())
        train_fun()
        #torch.save(model,"mycnn2")
        # test_fun()
  • 相关阅读:
    yarn 国内加速,修改镜像源
    Gradle Wrapper 介绍
    使用 Gradle 快速创建 Java 项目
    Gradle 安装
    gradle 国内加速,修改镜像源
    maven 国内加速,修改镜像源
    java如何对map进行排序详解(map集合的使用)
    Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用
    给定字符串正整数,进行排序并返回排序后字符串
    Linux学习118 nginx与php结合实现web网站及优化
  • 原文地址:https://www.cnblogs.com/neo3301/p/13169845.html
Copyright © 2011-2022 走看看