首先,先看一下在分割问题中,最常见的one-hot编码直观上是如何进行的,以及是怎样进行preds的
下图(图一),是常见的ground-truth分割图,一共有两个类别(背景可以作为0,不单独作为一个类别)
如果想进行cross-entropy计算损失函数等,就需要对图一的label进行one-hot编码,直观上会变成下图所示(图二)
然后,我们的图片经过神经网络,训练好之后,输出的预测值就会如下图所示(图三)
那么下面,假设有两个class,然后图片的格式是(2,3)即height=rows=2,width=cols=3。
根据一般dense prediction,输出格式类似于:(batch_size, 2, 3, 2)
下面为了简便,省略batch_size这个维度,变成(2,3,2)
假设图片在class0与class1上的预测值分别为
#preds values at class0
0.1 0.3 0.1
0.2 0.4 0.1
# preds values at class1
0.2 0.2 0.1
0.5 0.1 0.1
现在的要求是,手写出(2,3,2)的结果,我最开始写的是:
test1 = np.array([[[0.1,0.3,0.1],[0.2,0.4,0.1]],[[0.2,0.2,0.1],[0.5,0.1,0.1]]])
但是,test1.shape:(2,2,3)
,显然有问题。
那么,(2,3,2)怎么来?
mat1 = np.array([[0.1,0.3,0.1],[0.2,0.4,0.1]])
mat1 = np.expand_dims(mat1,axis=-1)
mat2 = np.array([[0.2,0.2,0.1],[0.5,0.1,0.1]])
mat2 = np.expand_dims(mat2,axis=-1)
mat3 = np.concatenate((mat1,mat2),axis=2)
"""
mat3
Out[91]:
array([[[0.1, 0.2],
[0.3, 0.2],
[0.1, 0.1]],
[[0.2, 0.5],
[0.4, 0.1],
[0.1, 0.1]]])
"""
其实,是最开始的那些“形象”的理解把自己误导了,仔细想想也容易发现,(2,3,2)那么最后肯定是两个类的preds value连在一起的。
最后,说一个我自己理解高维数组的方法。