办法1:debug原来的unet代码,看看哪里不对劲。
1.sigmoid
sigmoid是处理二分类问题的。
在loss function里,用了sigmoid函数进行prediction结果的二分类。
所以应该是一个channel用来表示一个label比较合适。
所以针对我们的问题:
就是2个output channel 就可以了。
办法2:跑新的代码
https://github.com/zsdonghao/u-net-brain-tumor
以后再说。
具体操作:
1.label the gourndtruth
2. 思路是:
在同一张图中label,然后再手动转化成two channels.然后丢进网络里去跑。
3.直接改loss function部分就好啦
直接在lossfunction里 把groudnturth的一张图变成两个channel
详细的改loss function的步骤:
建议是都用 tensor写,不要转化成numpy
view(-1) 是把array变成一维的
torch的一些tip:
1.查看数组的type
var.size()
2.
torch.zeros([2,4],dtype=torch.int32)
3.
torch转numpy的转换方法
Numpy2Tensor:1. torch.from_numpy(Numpy_data) 2. torch.tensor(Numpy_data)
Tensor2Variable: 1. Variable(Tensor_data)
Variable2Tensor: 1. Variable_data.data()
Tensor2Numpy : 1.Tensor_data.numpy()
4.
画图
import matplotlib.pyplot as plt
plt.imshow(img). imshow()
debug:
1. Totensor这个是怎么实现的。
可以从to_tensor()函数看到,函数接受PIL Image或numpy.ndarray,将其先由HWC转置为CHW格式,再转为float后每个像素除以255.
记录:label1是171,label2是85
2.问题出在label不是单纯的171和85
找到原因了。放大nrrd图,其实同一个cell的label的颜色还是不一样的!
现在需要做的事情是nrrd图转tif图的过程的检查
运行命令行:
python main.py -n_classes 2
报错:
RuntimeError: expected backend CPU and dtype Float but got backend CUDA and dtype Float
期望得到CPU类型张量,得到的却是CUDA张量类型。
很典型的错误,例如计算图中有的参数为cuda型有的参数却是cpu型就会遇到这样的错误。
把数据从cpu迁移到cuda的网址:
https://blog.csdn.net/qq_28444159/article/details/78781201
https://blog.csdn.net/hustchenze/article/details/79154139
结果:
用了这里的代码
https://github.com/HZCTony/U-net-with-multiple-classification
代码理解和分析:
为什么之前自己跑不出来!
shape问题!
gt 和 prediction flat之后相减,对应元素对不上!