我有这段代码来理解Jaccard Index是如何工作的,我正试图将它实现为Keras自定义度量,但是这个函数的返回是错误的,我不知道为什么(顺便说一句,我是Keras新手)
此函数用于创建矩形区域以测试交点:
def block(start, width=20, heigth=10, length=60):
block = np.zeros((1, heigth, length))
block[:, :, start:(start + width)] = 1
return block.astype('uint8')
如果我得到一个block(10)
和一个block(20)
,应该有两个10x20块,交叉区域为10x10,因此并集必须是2*(10*20) - 10*10
,这由这条Numpy线确定:
np.sum(((block(10) + block(20)) > 0).astype('uint8'))
但是当我尝试使用这个Keras函数时:
def test(a, b):
return K.sum(K.cast((a + b) > 0, dtype='uint8'))
当我用K.eval(test(block(10), block(20)))
调用它时,结果是44
编辑(新测试):
def test(a, b):
return K.sum(a), K.sum(b), K.sum(a) + K.sum(b)
[K.eval(elem) for elem in test(block(10), block(20))]
结果如下:[200, 200, 144]
为了得到这个结果我做错了什么
Keras sum的数据类型是从求和的对象推断出来的,因此在这种情况下,sum的类型是
uint8
。结果是300。uint8
可以取256个不同的值,并且300 - 44 = 256
。如果您仔细查看python代码:所以你的结果是
uint64
类型的,而你让Keras在uint8
中给你一个结果。事实上,下面给出了44个答案:简而言之,切换到一个更大的数据类型来求和,或者按照
uint8
没有缺点的顺序手动执行操作相关问题 更多 >
编程相关推荐