本周计划
1.完成辅助loss代码
2.二值分割效果有所提升,现在训练 一下多值分割的效果。有两个思路,只修改class个数
还有一个想法是以二值分割为另一个分支网络的gt,但这个需要处理一下分割处理的二值图。
3.尽量读完PRML书的高斯部分。每次读英文版的都很慢。但还是要读呀。
4.卸载3号服务器上的anaconda然后重新安装
●辅助loss代码已完成。
BUG1:在Unet末尾cat了前面几层后,在计算loss的时候,出现了
RuntimeError: Given groups=1, weight[32, 576, 3, 3], so expected input[1, 544, 224, 224] to have 576 channels, but got 544 channels instead
解决尝试:打印所有weight都是什么,看多了哪些。原因竟然是自己把输出维数写错了。。
BUG2:给辅助loss设置权重的时候
RuntimeError: weight tensor should be defined either for all or no classes at /opt/conda/conda-bld/pytorch_1518243271935/work/torch/lib/THCUNN/generic/SpatialClassNLLCriterion.cu:28
解决办法:打印了一下out 和辅助loss里out_aux的shape,发现
out_shape: torch.Size([1, 12, 224, 224])
out_aux_shape: torch.Size([1, 32, 224, 224])
所以out_aux也应该经过softmax。
BUG3:对应相乘/向量相乘
解决办法:class_weight.mul(class_weight)
==>在训练之前检查了一下图片,发现GT上传错了。最近因为生病,都有点恍惚了。
训练完成后,测试。
●一边等待结果一边学习吴恩达机器学习课程。这周讲的是如何评估你的模型并改善。
第一个讲的是如何评估假设模型,确定是否欠拟合或者过拟合了。
结论就是:采用交叉验证的方法,以6:2:2进行划分数据集。
如果训练集loss很低但测试集很高就过拟合了。如果训练集loss都不低就是欠拟合。验证集的存在就是防止出现模型去拟合测试集,而无法实现真正的泛化。
其实,我觉得现实中最需要解决的是,训练集很低,测试集也很低的情况下二者怎样更低而且,错误率更低。
●结果已出,加了辅助loss效果不升反降。也可能是weight设置不合理。
鉴于二值分割效果很好,现对计划做以下调整:
1.大数据驱动训练二值(已在跑,很慢,一个epochtrain11mins,val14mins)
2.cat多个浅层,制造densenet效果的网络
3.对二值图进行加辅助的训练:结果,不知道是不是weight不合适,效果不升反降。重新调整了一下weight再训练一版。结果,效果稍有提升,但是我觉得加权重训练本身就是这个权重设置太难了,宏观调控,总不能一个值一个值的去尝试,何况有几个类别就有几个权重,这样的组合数量也是爆炸。还是不加了以后。
●4.12今天学习学校机器学习课程,并写作业。
1. 第一题要用matlab求一个样本点决策超平面的距离,我觉得求欧氏距离简单一点。然后百度了一下,求一个点到直线的距离要用到“外积”的概念,好久没用都忘记了:
外积、又叫叉积:向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。
而点到空间直线的距离就是外积的模与空间直线方向向量的模相除。
因此,P-点坐标;Q1, Q2线上两点坐标:d = abs(det([Q2-Q1;P-Q1]))/norm(Q2-Q1);
4.13完成作业
3.编写一个感知器算法并实现
(1)matlab—load命令读的数据为struct类型的数据的处理方法:用“.”访问成员
(2)matlab中将矩阵按照行打乱顺序的一个例子:
A = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]
rowrank = randperm(size(A, 1)); % 随机打乱的数字,从1~行数打乱
B = A(rowrank, :)%%按照rowrank打乱矩阵的行数
一个可能的输出结果:
A = 1 2 3
4 5 6
7 8 9
10 11 12
B = 1 2 3
7 8 9
4 5 6
10 11 12