Keras返回错误的sum值

2024-07-08 10:51:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这段代码来理解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]

为了得到这个结果我做错了什么


Tags: 函数test区域returndefnpwidthblock
1条回答
网友
1楼 · 发布于 2024-07-08 10:51:43

Keras sum的数据类型是从求和的对象推断出来的,因此在这种情况下,sum的类型是uint8。结果是300。uint8可以取256个不同的值,并且300 - 44 = 256。如果您仔细查看python代码:

blocks = block(10) + block(20) # dtype='uint8'
mask = (blocks > 0) # dtype=bool
mask_as_uint = mask.astype('uint8') # dtype='uint8', which is an unnescessary conversion
np.sum(mask_as_uint) # dtype='uint64

所以你的结果是uint64类型的,而你让Keras在uint8中给你一个结果。事实上,下面给出了44个答案:

np.int8(300)

简而言之,切换到一个更大的数据类型来求和,或者按照uint8没有缺点的顺序手动执行操作

相关问题 更多 >

    热门问题