今天介绍点牛逼的(相对昨天而言)。
上午再看pytorch的Dataset、DataLoader、DataLoaderIter的相关博客,就是这篇很简单明了,然后我发现文章在介绍DataLoader的时候这样说:
DataLoader返回的是一个迭代器,我们通过这个迭代器来获取数据
我就奇怪,这个迭代器是个啥(毕竟本人学python时只看到了类,果然学习要坚持和深究)?
找了下这篇文章,简单来说,就是这样:老师让班里的每个同学做演讲,一天一个人,按学号来,比如说第一天是001来讲,那么第二天就应该是002.老师用来记住明天谁讲,那么老师就是一个迭代器。
我理解就是历遍列表的一种方式,我不用把整个数组放到内存,我想用下一个的时候直接用迭代器,不占用内存,感觉很优雅(个人愚见,有问题烦请指出!)。
插一句,这个文章里提到了:
import collection
a = isinstance(object, classinfo)
#object就是实例对象,classinfo就是类名或者基本类型
#这个函数和type是一个样子的,判断这个类是不是已知的类型
和这篇文章没大有关系,就是看的时候收集到的,姑且写在这。
到这里这篇文章本来应该结束了。但是!我在文章里看到作者一直说什么魔方方法、魔方方法我就很烦。那又是个啥?
然后我百度了一下魔方方法,然后:
你仿佛在逗我笑,搞点正经的啊百度!
然后关键词“python 魔方方法”,这次终于正常了。
然后就是各种奇奇怪怪的魔方方法总结大表格,一套一套的看着就晕。
然后我看到了这篇(嘿嘿)(感觉人家写的贼好),终于画风正常了。
我直接总结几点:
- 魔方方法都是前面后面都有双下划线的
- 魔方方法一般不会用 类.__魔方方法__这样的方式来调用,而是在特殊情况下才会被调用
这两特点是我自己乱总结的,为什么把这个写在这是因为联想到我昨天写的检查pytorch的Dataset是否正确,我突然意识到了!
pytorch在写自己的Dataset的时候一般是继承,然后重写__len__和__getitem__,那我们写的这个是啥呢?就是魔方方法啊!
我昨天写的我摘抄一点过来就是:
#为了清楚一点我把我重写的__getitem__贴在这,返回的是输入与输出两个数据
def __getitem__(self, item):
input_img = load_img(self.input_filenames_list[item])
target_img = load_img(self.target_filenames_list[item])
if self.input_data_process:
input_data = self.input_data_process(input_img)
if self.target_data_process:
target_data = self.target_data_process(target_img)
return input_data, target_data
train_data = getting_train_data(args) #这里的train_data是我已经定义的我重写的Dataset类
img = train_data.__getitem__(0).[0]
# 这样赋值的是第0张图片的input
img = train_data[1][1]
但是下面这个语句也是同样的功能!我寻思这不就是魔方方法吗?我自己写的双下划线包围的魔方方法,不是直接的像是普通方法一样调用,而是有自己的调用方式,比如这里的__getitem__,就是用[]矩阵的形式调用的。
大概就这么点理解,能把这些串到一起感觉挺好的。