pythorch CNN 小教程,关于如何自定义数据集

22 篇文章 1 订阅
1 篇文章 0 订阅

之前用官方的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()

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
SimCLR是一种用于自监督学习的方法,可以通过使用自定义数据集进行训练。下面是使用SimCLR训练自定义数据集的步骤: 1. 数据预处理:首先,需要对自定义数据集进行预处理。这包括图像的裁剪、缩放、旋转等操作,以增加数据的多样性和丰富性。同时,还可以应用数据增强技术如翻转、随机遮挡等来增加数据集的大小。 2. 构建训练集:接下来,从自定义数据集中构建训练集。为了使用SimCLR,我们需要生成图像对。这可以通过从数据集中随机选择两个不同的图像,并用同一种数据增强方法对它们进行增强来实现。最终,我们会得到一组图像对作为训练集。 3. 模型搭建:接下来,需要搭建SimCLR模型。SimCLR采用了深度卷积神经网络(CNN)作为骨干网络,并在其之上添加了几个全连接层。这个模型会接受两个图像作为输入,输出它们的特征表示。 4. 损失函数:SimCLR使用了对比损失函数来学习图像的相似性。对于每一对图像,模型会生成它们的特征表示,并计算它们之间的相似度。然后使用对比损失函数来最小化同类图像对的特征距离,并最大化非同类图像对的特征距离。 5. 训练模型:最后,使用自定义数据集进行模型训练。将构建好的训练集输入SimCLR模型,并使用梯度下降算法来更新模型的参数。通过不断迭代训练,模型会逐渐学习到图像的特征表示,使得相似的图像特征更加接近,而不相似的图像特征更加远离。 通过以上步骤,我们可以使用SimCLR来训练自定义数据集。这样,我们可以为特定任务(如图像分类、目标检测等)提供更好的特征表示,从而提升模型的性能。同时,使用自定义数据集可以更好地适应特定应用场景,使得模型更具泛化能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值