0 说明

        使用yolov3检测目标时,出现RuntimeWarning: overflow encountered in exp警告;进行了一些代码优化,参考下文,但效果都不好,最后因为仅仅是警告,不是报错,放弃优化代码了

RuntimeWarning: overflow encountered in exp
  s = 1 / (1 + np.exp(-x))

原函数:

    def _sigmoid(x):
        s = 1 / (1 + np.exp(-x))
        return s

1 代码优化

1.1 将正负数值进行区分

        下面的代码适合处理单个元素,而非数组

    def _sigmoid(x):
        if x>=0:      #对sigmoid函数的优化,避免了出现极大的数据溢出
            s=1.0/(1+exp(-x))
            return s
        else:
            s=exp(x)/(1+exp(x))
            return s

出现新的报错:

    if x>=0:      #对sigmoid函数的优化,避免了出现极大的数据溢出
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这是因为函数输入参数是numpy的数组,不是一个元素

1.2 将数组中负数元素处理成正数元素,对每一个元素进行exp运算

        结合1.1的报错,在numpy数组中,不好直接判断np.array整个数组大于零或小于零,所以需要把数组里的数字取出来一个一个判断,计算后,再重新整合:

    #    在numpy数组中,不好直接判断np.array整个数组大于零或小于零,
        #所以需要把数组里的数字取出来一个一个判断,计算后,再重新整合:
        #但这样会增加处理时间,会让帧率变慢
    def _sigmoid(x):
        x_ravel = x.ravel()  # 将numpy数组展平
        length = len(x_ravel)
        y = []
        for index in range(length):
            if x_ravel[index] >= 0:
                y.append(1.0 / (1 + np.exp(-x_ravel[index])))
            else:
                y.append(np.exp(x_ravel[index]) / (np.exp(x_ravel[index]) + 1))
        return np.array(y).reshape(x.shape)

没有出现报错,但处理视频的帧率下降非常明显,应该是此处增加了较多的运算复杂度

1.3 将数组中负数元素处理成正数元素,对整个数组进行np.exp运算

    def _sigmoid(x):
        x_ravel = x.ravel()  # 将numpy数组展平
        length = len(x_ravel)
        tmp = []
        for index in range(length): #将负值变正
            if x_ravel[index] < 0:
                tmp.append(-x_ravel[index])
            else:
                tmp.append(x_ravel[index])            
        x_positive=np.array(tmp).reshape(x.shape)
        s = 1.0 / (1 + np.exp(-x_positive))
        return s   

程序会报错,不知道为什么,尴尬

 2 放弃优化

还是用原先的函数,如下,尽管有警告

    def _sigmoid(x):
        s = 1 / (1 + np.exp(-x))
        return s

3 参考链接

a.any() or a.all():

https://blog.csdn.net/sinat_33563325/article/details/79868109

1.2 参考:

https://dontla.blog.csdn.net/article/details/106565725

1.1 参考:

https://blog.csdn.net/CY_TEC/article/details/106083366 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐