学习https://pytorch.org/tutorials/beginner/data_loading_tutorial.html
pytorch官方教程之二 dataloader的笔记
Dataset类
继承Dataset类,重写__len__与__getitem__方法
len :外部调用len(dataset)时,返回dataset的长度
show_landmarks(**sample):
解释一下这里的“**”是什么意思
首先,sample = face_dataset[i]
face_dataset[i]会调用face_dataset的__getitem__方法,返回sample
根据重写的__getitem__方法,返回的sample是一个dict
而show_landmarks()的参数应该是两个才对,def show_landmarks(image, landmarks):
这里直接传入一个dict,即需要对dict解包
解包
一般来说,用*对list解包,用**对dict解包,解完包后再传入函数
plt笔记
(1)plt.figure()建立画布
(2)当没有显示设备时,在开头写上plt.switch_backend(‘agg’)
(3)ax = plt.subplot(nrows,nclos,index)
建立子图
注意:子图index是从1开始的
表示接下来的plt有几行几列,这是第index个子图
(4)plt.tight_layout()
自动调整子图参数,填充整个区域
(5)ax.axis(‘off’)取消坐标轴
计算图像均值与方差
如何随机选取n张图片?
=》只要找到所有图片的地址,shuffle,然后取前n个就好了
with open(train_txt_path, 'r') as f:
lines = f.readlines()
random.shuffle(lines)
注
由于在训练时会对图像做处理,所以这里也要先做减均值之前的同样操作再算均值与方差(比如resize与归一化)
如何算均值与方差
这里作者的实现是把所有图片叠起来,然后遍历每个通道,用np.mean算均值
imgs = np.zeros([img_w, img_h, 3, 1])
***
img = img[:, :, :, np.newaxis]
imgs = np.concatenate((imgs, img), axis=3)
#把已有的图片和现在的图片叠起来,由于要初始化,只能拿0初始化,相当于多了一张全为0的图,不过总共2000张图的话应该影响不大
***
for i in range(3):
pixels = imgs[:,:,i,:].ravel() # 按通道拉成一行, ravel()相当于原来的引用,而flatten()重新开辟内存
means.append(np.mean(pixels))
stdevs.append(np.std(pixels))
模型搭建与初始化
模型定义
继承nn.Module类,在__init__中定义需要用到的组件,在forward()中搭积木,其他的函数用来实现各种组件
初始化
定义的类中,父类中定义好的方法:self.modules()返回一个迭代器,遍历可以依次返回模型的每一层
def modules(self):
for name, module in self.named_modules():
yield module
可以用
for m in self.modules():
if isinstance(m, nn.Conv2d):
来判断每一层是不是某种层,从而对不同层采用不同的初始化方法
finetune
这里就要讲到python的几个基础函数了
map()
map(function, iterable, …)
将function函数应用到iterable对象的每个值,也就是说将iterable的每个值分别传入function,得到的返回值组成一个list(python3.是组成一个iterable,可以用list(iterable)把它变成list)
filter()
filter(function, iterable)
将iterable的每个值依次传入function,function返回True或False,把传入后返回True的值组成一个list(python3.为组成iterable)
id()
id([object])
返回对象的内存地址
可以与lambda,filter组合使用,返回内存地址有效的对象:
base_params = filter(lambda p: id(p) not in ignored_params, net.parameters())