笔者本科毕设做的是遥感图像分割相关的研究,当时采用的Potsdam数据集由于所有图像GSD(对地观测距离)固定且适中,因此将训练时的batch_size设置为了16,基本能满足每个批次中都包含所有地表要素的需求。然而NAIC2020数据集中包含的数据的GSD从0.1m-4m不等,0.1m的GSD意味着一张256x256的影像切片中甚至能够看到一根树干的轮廓,然而这也使得该切片包含的要素种类很少!以致于一个batch中的16张切片可能也无法包含所有的要素。
一旦batch训练数据无法包含所有要素,就使得当次训练结果对于未被包含的要素基本不具备识别能力,表现为第n次训练和第n+1次训练结果梯度变化很大,有点像拆了东墙补西墙;而限制了batch_size的最根本原因是GPU限制,本模型完全跑起来需要约9G显存(输入大小为[16,256,256,3],即16张256x256大小的RGB图像),服务器上的GPU仅有11G,虽然显存不大,但是GPU多呀,4块2080Ti现在只用了一块。
因此笔者考虑使用多GPU来增大batch_size,以此来使得每个batch训练的参数结果对所有要素都较为适配。
Java - Spring学习笔记
理解DIP、IOC、DI及IOC容器
C# - 实现读写锁
使用C#实现的可重入
、非公平
的读写锁
,主要目的实现并发读写以及读写同步问题。为了减少读等待时间以及防止出现写饥饿现象,本锁使用了非同步锁的实现,允许读优先(提高效率)的同时使用一个阈值限定读者的最大数量(防止写饥饿);重入机制允许某个线程可以获取锁多次(如多次函数调用导致的锁重入),每次获取都需要有对应的释放,否则会出错。