
拿到数据之后,不应该直接进行模型的训练,首先进行如下几步:
关于这几种样本(对于分类):
(对于语义分割):
这里挖个坑,之后填
一些个人理解:
PIL库是python的原生库,兼容性比较强,需要安装对应的包 pip install pillow
但是要记住PIL读取出来是image格式,需要转化numpy;支持单通道及多通道Uint8 TIFF图像读取,读取单通道Uint16 TIFF图像转为Uint8处理,直接读取Uint16 TIFF多通道图像出错
matplotlib本身只能读取PNG,所以会有局限性
opencv读取出来直接是numpy,但是通道和shape不一样,这里不需要在意,因为在ToTensor()时,pytorch会将其通道纠正,所以其实也很方便,最主要是其功能较多,比较权威
pytorch的dataset
(1)为什么dataset返回的数据形状需要保持一致?
因为pytorch的dataloader默认的collate_fn会使用torch.stack合并多张图片成为batch,形状不同的tensor不能stack
(2)如果非要加载不同形状的样本怎么办?
要么另外写一个collate_fn,进行单独处理;要么在dataset类中对图片做padding,使得图片的size一样,可以直接stack
transform.normalization()
公式随处可见,此处不赘述。
作用:就是可以使(0, 1)变为(-1, 1)
原因:模型初始化时bias=0,但是实际的bias可能会比较大,这样的初始化就会导致神经网络收敛比较慢,经过Normalize后,可以加快模型的收敛速度。实验结果证明了,在多次周期迭代之后,我们的网络在使用归一化数据时有更高的准确性。有时被称为网络的快速收敛。
需要注意的是,并不总是归一化的数据更好。一个好的经验法则是在有疑问的时候,两种方式都要尝试。
目前很多网络都在用batch normalization,批量归一化或批量规范化就是在网络的各层输出激活上,在网络的各层里面进行的这个同样的过程,具有很多优点,所以就不加transform.normalization()了,并且如果数据量较小,训练集和测试集的normalization的指标差距较大,可能效果不是很好。
挖坑:
SyncBatchNorm和Normalization的差别
那么关键问题是,网络输出[b,num_class,h,w],num_class为对应类别(几分类就是几),gt为单通道的图片,怎样处理可以使其可以进行loss的计算?
例如:语义分割的图片输入是224×224×3经过神经网络之后输出是224×224×21而label值是224×224×1那么这两个值怎么转换才能构建损失函数呢?
参考:
知乎:语义分割的loss值怎么定义?
最后说一下语义分割的几个loss,最近也没少看,但是实验结果并没有告诉我这几个的优劣性:
训练更倾向于挖掘前景区域,正负样本不平衡的情况就是前景占比较小。而ce loss会公平处理正负样本,当出现正样本占比较小时,就会被更多的负样本淹没。dice loss对正负样本严重不平衡的场景有着不错的性能,训练过程中更侧重对前景区域的挖掘。但训练loss容易不稳定,尤其是小目标的情况下,另外极端情况会导致梯度饱和现象。因此有一些改进操作,主要是结合ce loss等改进,比如: dice + ce loss,dice + focal loss等。