代码大佬都已经写好了,具体参考:https://github.com/bonlime/keras-deeplab-v3-plus
git clone 下来以后,按照指南要训练自己的数据集,只要设置好自己的数据大小和类别就可以了
from model import Deeplabv3 deeplab_model = Deeplabv3(input_shape=(384, 384, 3), classes=4)
问题1:我的数据集不是一张张小图片,而是一个大的遥感影像tif,如何训练这个数据
解决:用 gdal 读取得到它的 np.array,再通过生成器一小块一小块输入
问题2:但是这样的生成器无法打乱顺序,把多景影像标签和图像 zip 起来后也无法用 random.shuffle 打乱图片顺序
解决:现在只能每次都按顺序读入,应该对训练影响不大
设想:后续想法是设置一个随机数列,根据这个随机数列读取指定大小范围,这样是把步长变为了1,会有好多样本
问题3:验证集和训练集只能按 tif 分,如何能随机取
设想:随机数列解决
问题4:运行一直报错,各种错,先后有
module 'tensorflow._api.v1.compat' has no attribute 'v1'
unsupported operand type(s) for /: 'Dimension' and 'float'
解决:直接 git clone 下来的是用最新版 tf2.0 写的,需要升级自己的 tf 或者用作者之前版本的实现,在这里用了之前版本的 keras 实现,在命令行输入一下代码
git clone https://github.com/bonlime/keras-deeplab-v3-plus/ cd keras-deeplab-v3-plus/ git checkout 714a6b7d1a069a07547c5c08282f1a706db92e20
问题5:写的生成器生成的标签最后一维是1,导致运行一直报错,维度不匹配
解决:这个写的是用了 one-hot 编码的,需要把标签转换成 one-hot,用 “ from keras.utils import to_categorical ”,to_categorical(x, num_classes=n)把 x 里从 0 到 n-1的值根据大小扩展到 n 维,若最大值和类别数目不同会报错
问题6:评价指标 loss 和各种系数不在正常范围内
解决:一开始以为是 one-hot 编码问题,一直尝试用 k.argmax 去得到1维的 tensor,死活弄不出来,报错有:数据类型不对,用 K.cast 强制转换解决,tensor 不能和数值相加,用argmax导致梯度无法回流等。睡了一觉想想不能用 argmax,他就是要在每一个维度上计算出相应指标再求平均,原来在不是 one-hot 编码里用的函数都还是对的,那问题出在老版本里最后没有用激活函数,给他加个激活函数以后一切都正常了。
问题7:作者说没有实现 weight_decay,需要的自己加
还未解决:不知道去哪加