最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytorch ImageFolder的覆寫實例

 更新時間:2020年02月20日 13:15:14   作者:慢行厚積  
今天小編就為大家分享一篇pytorch ImageFolder的覆寫實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

在為數(shù)據(jù)分類訓練分類器的時候,比如貓狗分類時,我們經(jīng)常會使用pytorch的ImageFolder:

CLASS torchvision.datasets.ImageFolder(root, transform=None, target_transform=None, loader=<function default_loader>, is_valid_file=None)

使用可見pytorch torchvision.ImageFolder的用法介紹

這里想實現(xiàn)的是如果想要覆寫該函數(shù),即能使用它的特性,又可以實現(xiàn)自己的功能

首先先分析下其源代碼:

IMG_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.ppm', '.bmp', '.pgm', '.tif', '.tiff', 'webp']

class ImageFolder(DatasetFolder):
 """A generic data loader where the images are arranged in this way: ::

  root/dog/xxx.png
  root/dog/xxy.png
  root/dog/xxz.png

  root/cat/123.png
  root/cat/nsdf3.png
  root/cat/asd932_.png

 Args:
  root (string): Root directory path.
  transform (callable, optional): A function/transform that takes in an PIL image
   and returns a transformed version. E.g, ``transforms.RandomCrop``
  target_transform (callable, optional): A function/transform that takes in the
   target and transforms it.
  loader (callable, optional): A function to load an image given its path.

  Attributes:
  classes (list): List of the class names.
  class_to_idx (dict): Dict with items (class_name, class_index).
  imgs (list): List of (image path, class_index) tuples
 """
 def __init__(self, root, transform=None, target_transform=None,
     loader=default_loader):
  super(ImageFolder, self).__init__(root, loader, IMG_EXTENSIONS,
           transform=transform,
           target_transform=target_transform)
  self.imgs = self.samples

ImageFolder的代碼很簡單,主要是繼承了DatasetFolder:

def has_file_allowed_extension(filename, extensions):
 """查看文件是否是支持的可擴展類型

 Args:
  filename (string): 文件路徑
  extensions (iterable of strings): 可擴展類型列表,即能接受的圖像文件類型

 Returns:
  bool: True if the filename ends with one of given extensions
 """
 filename_lower = filename.lower()
 return any(filename_lower.endswith(ext) for ext in extensions) # 返回True或False列表


def make_dataset(dir, class_to_idx, extensions):
 """
  返回形如[(圖像路徑, 該圖像對應的類別索引值),(),...]
 """
 images = []
 dir = os.path.expanduser(dir)
 for target in sorted(class_to_idx.keys()):
  d = os.path.join(dir, target)
  if not os.path.isdir(d):
   continue

  for root, _, fnames in sorted(os.walk(d)): #層層遍歷文件夾,返回當前文件夾路徑,存在的所有文件夾名,存在的所有文件名
   for fname in sorted(fnames):
    if has_file_allowed_extension(fname, extensions):查看文件是否是支持的可擴展類型,是則繼續(xù)
     path = os.path.join(root, fname)
     item = (path, class_to_idx[target])
     images.append(item)

 return images

class DatasetFolder(data.Dataset):
 """A generic data loader where the samples are arranged in this way: ::

  root/class_x/xxx.ext
  root/class_x/xxy.ext
  root/class_x/xxz.ext

  root/class_y/123.ext
  root/class_y/nsdf3.ext
  root/class_y/asd932_.ext

 Args:
  root (string): 根目錄路徑
  loader (callable): 根據(jù)給定的路徑來加載樣本的可調(diào)用函數(shù)
  extensions (list[string]): 可擴展類型列表,即能接受的圖像文件類型.
  transform (callable, optional): 用于樣本的transform函數(shù),然后返回樣本transform后的版本
   E.g, ``transforms.RandomCrop`` for images.
  target_transform (callable, optional): 用于樣本標簽的transform函數(shù)

  Attributes:
  classes (list): 類別名列表
  class_to_idx (dict): 項目(class_name, class_index)字典,如{'cat': 0, 'dog': 1}
  samples (list): (sample path, class_index) 元組列表,即(樣本路徑, 類別索引)
  targets (list): 在數(shù)據(jù)集中每張圖片的類索引值,為列表
 """

 def __init__(self, root, loader, extensions, transform=None, target_transform=None):
  classes, class_to_idx = self._find_classes(root) # 得到類名和類索引,如['cat', 'dog']和{'cat': 0, 'dog': 1}
  # 返回形如[(圖像路徑, 該圖像對應的類別索引值),(),...],即對每個圖像進行標記
  samples = make_dataset(root, class_to_idx, extensions) 
  if len(samples) == 0:
   raise(RuntimeError("Found 0 files in subfolders of: " + root + "\n"
        "Supported extensions are: " + ",".join(extensions)))

  self.root = root
  self.loader = loader
  self.extensions = extensions

  self.classes = classes
  self.class_to_idx = class_to_idx
  self.samples = samples
  self.targets = [s[1] for s in samples] #所有圖像的類索引值組成的列表

  self.transform = transform
  self.target_transform = target_transform

 def _find_classes(self, dir):
  """
  在數(shù)據(jù)集中查找類文件夾。

  Args:
   dir (string): 根目錄路徑

  Returns:
   返回元組: (classes, class_to_idx)即(類名, 類索引),其中classes即相應的目錄名,如['cat', 'dog'];class_to_idx為形如{類名:類索引}的字典,如{'cat': 0, 'dog': 1}.

  Ensures:
   保證沒有類名是另一個類目錄的子目錄
  """
  if sys.version_info >= (3, 5):
   # Faster and available in Python 3.5 and above
   classes = [d.name for d in os.scandir(dir) if d.is_dir()] #獲得根目錄dir的所有第一層子目錄名
  else:
   classes = [d for d in os.listdir(dir) if os.path.isdir(os.path.join(dir, d))] #效果和上面的一樣,只是版本不同方法不同
  classes.sort() #然后對類名進行排序
  class_to_idx = {classes[i]: i for i in range(len(classes))} #然后將類名和索引值一一對應的到相應字典,如{'cat': 0, 'dog': 1}
  return classes, class_to_idx #然后返回類名和類索引

 def __getitem__(self, index):
  """
  Args:
   index (int): Index

  Returns:
   tuple: (sample, target) where target is class_index of the target class.
  """
  path, target = self.samples[index]
  sample = self.loader(path) # 加載圖片
  if self.transform is not None:
   sample = self.transform(sample)
  if self.target_transform is not None:
   target = self.target_transform(target)

  return sample, target

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

 def __repr__(self):
  fmt_str = 'Dataset ' + self.__class__.__name__ + '\n'
  fmt_str += ' Number of datapoints: {}\n'.format(self.__len__())
  fmt_str += ' Root Location: {}\n'.format(self.root)
  tmp = ' Transforms (if any): '
  fmt_str += '{0}{1}\n'.format(tmp, self.transform.__repr__().replace('\n', '\n' + ' ' * len(tmp)))
  tmp = ' Target Transforms (if any): '
  fmt_str += '{0}{1}'.format(tmp, self.target_transform.__repr__().replace('\n', '\n' + ' ' * len(tmp)))
  return fmt_str

此時想要覆寫ImageFolder,代碼為:

class CustomImageFolder(ImageFolder):
 """
  為了得到兩張圖(其中一張是隨機選取的)的圖像和索引值信息
 """
 def __init__(self, root, transform=None):
  super(CustomImageFolder, self).__init__(root, transform)
  self.indices = range(len(self)) #該文件夾中的長度

 def __getitem__(self, index1):
  index2 = random.choice(self.indices) #從[0,indices]中隨機抽取一個數(shù)字,為了隨機選取一張圖

  path1 = self.imgs[index1][0] #此時的self.imgs等于self.samples,即內(nèi)容為[(圖像路徑, 該圖像對應的類別索引值),(),...]
  label1 = self.imgs[index1][1]
  path2 = self.imgs[index2][0]
  label2 = self.imgs[index2][1]

  img1 = self.loader(path1)
  img2 = self.loader(path2)
  if self.transform is not None:
   img1 = self.transform(img1)
   img2 = self.transform(img2)

  return img1, img2, label1, label2

以上這篇pytorch ImageFolder的覆寫實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vscode帶命令行參數(shù)進行調(diào)試的方法

    vscode帶命令行參數(shù)進行調(diào)試的方法

    文章介紹了如何在VSCode中使用命令行參數(shù)進行調(diào)試,并描述了如何通過修改`launch.json`文件來簡化調(diào)試過程
    2025-01-01
  • Python操作多維數(shù)組輸出和矩陣運算示例

    Python操作多維數(shù)組輸出和矩陣運算示例

    這篇文章主要介紹了Python操作多維數(shù)組輸出和矩陣運算,結(jié)合實例形式分析了Python多維數(shù)組的生成、打印輸出及矩陣運算相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • python 正則表達式的使用

    python 正則表達式的使用

    這篇文章主要介紹了python 正則表達式的使用,Python 中正則表達式應用非常廣泛,如數(shù)據(jù)挖掘、數(shù)據(jù)分析、網(wǎng)絡爬蟲、輸入有效性驗證等,Python 也提供了利用正則表達式實現(xiàn)文本的匹配、查找和替換等操作的 re 模塊,下面和小編一起進入文章了解具體內(nèi)容吧
    2021-10-10
  • Python求解正態(tài)分布置信區(qū)間教程

    Python求解正態(tài)分布置信區(qū)間教程

    今天小編就為大家分享一篇Python求解正態(tài)分布置信區(qū)間教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python數(shù)據(jù)庫編程之SQLite和MySQL的實踐指南

    Python數(shù)據(jù)庫編程之SQLite和MySQL的實踐指南

    這篇文章主要為大家詳細介紹了Python數(shù)據(jù)庫編程中SQLite和MySQL的相關(guān)操作指南,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • Python中發(fā)布Web應用的常見方法與對比

    Python中發(fā)布Web應用的常見方法與對比

    這篇文章主要為大家詳細介紹了Python中發(fā)布?Web?應用的幾種常見方法的實現(xiàn)詳細步驟以及它們的部署方法對比,有需要的小伙伴可以參考下
    2025-02-02
  • Python利用D3Blocks繪制可動態(tài)交互的圖表

    Python利用D3Blocks繪制可動態(tài)交互的圖表

    今天小編給大家來介紹一款十分好用的可視化模塊,D3Blocks,不僅可以用來繪制可動態(tài)交互的圖表,并且導出的圖表可以是HTML格式,方便在瀏覽器上面呈現(xiàn),感興趣的可以了解一下
    2023-02-02
  • Python中字符串的基礎介紹及常用操作總結(jié)

    Python中字符串的基礎介紹及常用操作總結(jié)

    字符串輸出格式與輸入的樣子相同,都是用撇號包裹,撇號和其它特殊字符用用反斜杠轉(zhuǎn)義。如果字符串中有單撇號而沒有雙撇號則用雙撇號包裹,否則應該用單撇號包裹。后面要介紹的print語句可以不帶撇號或轉(zhuǎn)義輸出字符串
    2021-09-09
  • 使用Python快速搭建文件傳輸服務的方法

    使用Python快速搭建文件傳輸服務的方法

    這篇文章主要介紹了使用Python快速搭建一個文件傳輸服務,這樣任何一個人都能打開瀏覽器把他電腦上的文件傳給我了,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Python入門之三角函數(shù)全解【收藏】

    Python入門之三角函數(shù)全解【收藏】

    這篇文章主要介紹了Python入門之三角函數(shù)全解【收藏】,還是比較全面的,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論

启东市| 保康县| 交城县| 松江区| 黎川县| 盱眙县| 于田县| 云阳县| 邵武市| 博乐市| 昌都县| 九龙城区| 布拖县| 恩施市| 德钦县| 蕲春县| 蚌埠市| 华宁县| 肥乡县| 龙游县| 建阳市| 开远市| 文成县| 天等县| 正宁县| 满城县| 饶河县| 舞阳县| 新龙县| 高州市| 沅江市| 富顺县| 封丘县| 汝城县| 洛阳市| 武鸣县| 永胜县| 泰和县| 浦东新区| 长丰县| 申扎县|