PyTorch 训练前对数据加载、预处理

参考:pytorch torchvision transform官方文档

Pytorch学习--编程实战:猫和狗二分类

深度学习框架PyTorch一书的学习-第五章-常用工具模块

# coding:utf8
import os
from PIL import Image
from torch.utils import data
import numpy as np
from torchvision import transforms as T

class DogCat(data.Dataset):

    def __init__(self, root, transforms=None, train=True, test=False):
        ‘‘‘‘‘‘
        ‘‘‘
        主要目标: 获取所有图片的地址,并根据训练,验证,测试划分数据
        ‘‘‘
        self.test = test
        imgs = [os.path.join(root, img) for img in os.listdir(root)]

        # test1: data/test1/8973.jpg
        # train: data/train/cat.10004.jpg
        if self.test:
            imgs = sorted(imgs, key=lambda x: int(x.split(‘.‘)[-2].split(‘/‘)[-1]))
        else:
            imgs = sorted(imgs, key=lambda x: int(x.split(‘.‘)[-2]))

        imgs_num = len(imgs)

        # shuffle imgs 打乱图片顺序
        np.random.seed(100)
        imgs = np.random.permutation(imgs)

        #训练集和验证集比例为7:3
        if self.test:
            self.imgs = imgs
        elif train:
            self.imgs = imgs[:int(0.7 * imgs_num)]  #训练集
        else:
            self.imgs = imgs[int(0.7 * imgs_num):]  #验证集

        if transforms is None:
            normalize = T.Normalize(mean=[0.485, 0.456, 0.406], #数据归一化处理
                                    std=[0.229, 0.224, 0.225])

            if self.test or not train:  #测试集+验证集
                self.transforms = T.Compose([   #用来管理各个transform
                    T.Scale(224),#将输入的`PIL.Image`重新改变大小成给定的`size`,`size`是最小边的边长。                    举个例子,如果原图的`height>width`,那么改变大小后的图片大小是`(size*height/width, size)`。
                    T.CenterCrop(224), #以输入图像img的中心作为中心点进行指定size的crop操作
                    T.ToTensor(), #在做数据归一化之前必须要把PIL Image转成Tensor
                    normalize  #数据归一化处理
                ])
            else:  #训练集
                self.transforms = T.Compose([
                    T.Scale(256),
                    T.RandomSizedCrop(224),#先将给定的PIL.Image随机切,然后再resize成给定的size大小。
                    T.RandomHorizontalFlip(),#随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。
                    T.ToTensor(),
                    normalize
                ])

    def __getitem__(self, index):
        ‘‘‘‘‘‘
        ‘‘‘
        一次返回一张图片的数据,并为训练集和验证集打标签
        ‘‘‘
        img_path = self.imgs[index]
        if self.test: #测试集
            label = int(self.imgs[index].split(‘.‘)[-2].split(‘/‘)[-1])
        else: #验证集 训练集
            label = 1 if ‘dog‘ in img_path.split(‘/‘)[-1] else 0
        data = Image.open(img_path)
        data = self.transforms(data)
        return data, label

    def __len__(self):
        return len(self.imgs)

原文地址:https://www.cnblogs.com/cekong/p/11155836.html

时间: 2024-11-07 18:57:39

PyTorch 训练前对数据加载、预处理的相关文章

PyTorch 数据集类 和 数据加载类 的一些尝试

最近在学习PyTorch,  但是对里面的数据类和数据加载类比较迷糊,可能是封装的太好大部分情况下是不需要有什么自己的操作的,不过偶然遇到一些自己导入的数据时就会遇到一些问题,因此自己对此做了一些小实验,小尝试. 下面给出一个常用的数据类使用方式: def data_tf(x): x = np.array(x, dtype='float32') / 255 # 将数据变到 0 ~ 1 之间 x = (x - 0.5) / 0.5 # 标准化,这个技巧之后会讲到 x = x.reshape((-1

JQuery插件:遮罩+数据加载中。。。(特点:遮你想遮,罩你想罩)

在很多项目中都会涉及到数据加载.数据加载有时可能会是2-3秒,为了给一个友好的提示,一般都会给一个[数据加载中...]的提示.今天就做了一个这样的提示框. 先去jQuery官网看看怎么写jQuery插件,然后就开始写了.写下来这么一个插件,稍作优化,就在项目中使用了.下面贴的是我写这个插件时的测试图: 这张图模拟数据加载前提示框的展示,这个表格是一个写在页面上的.蓝色的底纹就是遮罩层. (function($){ $.fn.extend({ /** * 打开遮罩,并显示一段文字. * @para

vue使用ECharts时的异步更新与数据加载

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px "Helvetica Neue"; color: #404040 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Helvetica Neue"; color: #737373 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco

[Aaronyang] 写给自己的WPF4.5 笔记6[三巴掌-大数据加载与WPF4.5 验证体系详解 2/3]

我要做回自己--Aaronyang的博客(www.ayjs.net) 博客摘要: Virtualizing虚拟化DEMO 和 大数据加载的思路及相关知识 WPF数据提供者的使用ObjectDataProvider 和 XmlDataProvider WPF验证 第一:使用自带的属性SET抛出异常,前台捕捉到异常,描红 第二:我们可以自定义验证规则,替代刚开始的异常捕捉验证 第三:我们可以使用INotifyDataErrorInfo方式,增加异常,并实现了验证通知和还原非法值 第四:我们使用了Er

winform如何实现将数据库数据加载到树上

一.简介 对于winform中如何加载xml生成目录树,在前边一篇文章"c#如何实现从xml中加载树目录,并且显示完整的Text"中我已经写了详细的过程.但是有些时候我们不可能将大量的数据存储到xml中,原因是,xml一般用于小数据量的传递.而大数据的存储与传递我们一般用专门的数据库管理工具作为传递的介质.在此,声明一点是,对于大数据量的传递,我们在这里不考虑速率传递快慢问题,我们举例只是实现最基本的功能,这样也方便和我一样的初学者理解. 好了,说了这么多废话,开始正式进入我们这篇文章

GreenPlum数据加载

1. copy命令 对于数据加载,GreenPlum数据库提供copy工具,copy工具源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.使用copy命令进行数据加载,数据需要经过Master节点分发到Segment节点,同样使用copy命令进行数据卸载,数据也需要由Segment发送到Master节点,由Master节点汇总后再写入外部文件,这样就限制了数据加载与卸载的效率,但是数据量较小的情况下,copy命令就非常方便.下面测试通过copy命令实现操

Android5.1图库Gallery2代码分析数据加载流程

图片数据加载流程. Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->PhotoPage 相册集                        照片集                 某张图片 1,AlbumSetPage.java private void initializeData(Bundle data) { String mediaPath = data.getString(A

实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624.aspx  译 Q:77811970 实现虚拟模式的原因之一 DataGridView控制只检索数据,因为它是必要的. 这就是所谓的 即时数据加载 . 如果你正在与一个非常大的表在一个远程数据库,例如,您可能希望避免启动延迟,只检索所需的数据显示和检索额外的数据只有当用户新行滚动到视图. 如果客户

浅谈Entity Framework中的数据加载方式

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx,其中的一系列文