zoukankan      html  css  js  c++  java
  • 迭代器iter(db),db为实例化的类对象,类对象中没有__iter__,但有__getitem__

    def main():
        import visdom
        import time
    
        viz = visdom.Visdom()
    
        db = Pokemon('pokeman', 224, 'train')
    
        x,y = next(iter(db))   ##
        print('sample:',x.shape,y.shape,y)
    
        viz.image(x,win='sample_x',opts=dict(title='sample_x'))
    ##类
    class  Pokemon(Dataset):
            
            def __init__(self):
                pass                      ##简写了
            
    
           def __getitem__(self, idx):
            # idx~[0~len(images)]
            # self.images,self.labels
            # img :'pokemon\bulbasaur\000000.png'
            # labels: 0
            img, label = self.images[idx], self.labels[idx]
    
            tf = transforms.Compose([
                lambda x: Image.open(x).convert('RGB'),  # string path=> image data
                transforms.Resize((self.resize, self.resize)),
                transforms.RandomRotation(15),##指定15度不至于造成难度太大,不收敛;同时增加了图片多样性
                transforms.CenterCrop(self.resize),#中心裁剪,旋转后填充的黑部分,都会减掉
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485,0.456,0.406],
                                     std = [0.229,0.224,0.225])
                #归一化操作不想让数据在0-1,分布在0的右侧,想让数据围绕0左右分布, mean和std是imagenet统计出来的,以后就用这个就就行:RGB的均值和方差:mean=[0.485,0.456,0.406],std = [0.229,0.224,0.225]
                #但归一化后范围变为-1~1,图片会发生变化,整体数值向下进行了放缩和平移,因此需要做一个denomalize()
    
            ])
    
            img = tf(img)
            label = torch.tensor(label)
    
            return img, label    #这里只有关注img 和 label 是两个列表
    
               
                    

    在这种情况下用到了iter(),但类中也没有__iter__,所以有点疑惑

    查阅资料后发现

      当for发现没有__iter__但是有__getitem__的时候,会从0开始依次读取相应的下标,直到发生IndexError为止,这是一种旧的迭代协议。iter方法也会处理这种情况,在不存在__iter__的时候,返回一个下标迭代的iterator对象来代替。一个重要的例子是str,字符串就是没有__iter__接口的。

     
     
    # -*- coding: utf-8 -*-
    
    class Library(object):
        def __init__(self):                                                     
            self.books = { 'title' : 'a', 'title2' : 'b', 'title3' : 'c', }
            
        def __getitem__(self, i):
            return self.books[i]
            
     #   def __iter__(self):
            # 方法1 使用生成器
      #      for titles in self.books:
      #          yield self.books[titles]
            # 方法2 使用迭代器
    #        return self.books.itervalues()
     
    library = Library()
    
    # 1.普通方法
    print(library.books[1])
    
    # 2.使用__getitem__
    print(library[1])
    
    # 3.迭代器
    for book in library:
        print(book)

    结果:

    >>> 
    ===================== RESTART: C:/Users/CUI/Desktop/1.py =====================
    a
    a
    title
    a
    title2
    b
    title3
    c
    >>> 
     
  • 相关阅读:
    函数对象中的prototype属性
    undefined和null的区别
    访问修饰符
    继承
    静态成员和实例成员的区别
    js模拟Trim()方法
    连接池的执行原理
    Javascript中的= =(等于)与= = =(全等于)区别
    数据库中创建约束
    KM算法入门
  • 原文地址:https://www.cnblogs.com/kevin-red-heart/p/11297715.html
Copyright © 2011-2022 走看看