dataset&dataloader
对于model.fit()中使用的数据集的话,继承Dataset类
![](https://i-blog.csdnimg.cn/blog_migrate/a285f37a21c34bbe8ec5f0d1f22d6df5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/239a6aad439ca2e61026f4a08020789b.png)
其中必要的是init 与 getitem。
init主要是针对创建数据集所需输入的参数和一些类内参数的定义。
getitem主要目的是返回img与label,当然也可以定义其他的自定义函数在类中。
通常也会有__len__之类这就代表,输入len(dataset_name)会给与设定的反馈。
Dataloader设置:
![](https://i-blog.csdnimg.cn/blog_migrate/4f4a35a8ce0a4f76110826ca72d5c06c.png)
Collate_fn:
相当于是否要对dataloader输出的batch进行自己想要的处理。
如果默认就以组的形式输出
就假设batch为8 默认输出一个列表
你可以在collatefn上设置比如输出一个元祖或者直接合并等操作
迁移学习
迁移学习是在Backbone中导入已训练好的权重使网络更好收敛。
最基本操作如下图。
![](https://i-blog.csdnimg.cn/blog_migrate/48f5eaf43a94525d2fb983889299824f.png)
其中的条件有:
首先得到权重文件
已知该权重文件对应的网络机构,必须一一对应才能导入。
而后通过load操作得到了一个参数字典,包含各层的所有参数。
之后通过load_state_dict方法将权重导入网络中。
因为参数字典其并非以层作为最小单元,故通常操作是先导入权重,而后对网络进行提取,提取需要的部分。
通过net.children()方法可以分割网络。其结果如下所示:
可看到虽然同为resnet,可官方实现是将各个重复Block层都以Sequential来包含划分为一层,如果不这样实现则导入不了参数。
![](https://i-blog.csdnimg.cn/blog_migrate/9927d4970b3c710330553adf27696d0c.png)
如果我只想要获得07的输出,之后都不需要。即提取00-07的网络。可如下所示,并且调整了细部的参数。
![](https://i-blog.csdnimg.cn/blog_migrate/8492d890685c685feb265f5f8fce7a60.png)
的*list其实就是将list中所有内容列出,这样将得到了以Sequential为主体的Backbone,如需要调整与所导入参数无关的值,可如上所示。上方代码即首先获取Backbone最后一层(一个Sequential)的第一层(一个Basic block),而后将这个Block中卷积层与下采样层的步距进行调整。