参考链接:https://blog.csdn.net/qq_43799400/article/details/131202148
1、解决 Softmax 的数值溢出问题
数值溢出是 Softmax 函数经常遇到的问题,数值溢出包括数值上溢和下溢两张情况:
(1)上溢:数值较大的数据经过一些运算后其数值非常大,以至于超过计算机的存储范围而无法继续运算,在程序中表现为 NAN
解决办法:
(2)下溢:非常接近0 的数据被四舍五入为 0,从而产生毁灭性的误差。
解决办法:
2、大津阈值法(Otsu's method)计算原理
其基本原理是找到一个阈值,将图像分为两个类别,使得类别内的方差最小,而类间方差最大。
计算步骤:
-
灰度直方图: 首先,计算图像的灰度直方图,即图像中每个灰度级别的像素数量。
-
归一化直方图: 将灰度直方图归一化,得到每个灰度级别的像素概率分布。
-
类间方差计算: 对于每个可能的阈值 T(0 到 255),将图像分成两个类别:小于等于 T 的像素和大于 T 的像素。然后,计算这两个类别的概率分布和平均灰度,并计算类间方差。
类间方差(inter-class variance)的计算公式为: σ2=w1⋅w2⋅(μ1−μ2)^2其中:w1 和 w2 分别是两个类别的概率分布。μ1 和 μ2 分别是两个类别的平均灰度。
-
选择阈值: 遍历所有的阈值,选择使类间方差最大的阈值作为最佳阈值。
-
二值化: 使用选择的最佳阈值对图像进行二值化,将像素值小于等于阈值的设置为一个值(通常为 0 或 1),而像素值大于阈值的设置为另一个值。
3、装饰器的原理、分类以及实现
原理:装饰器是一种语法糖,它简化了在函数定义和调用时的操作。当你在一个函数定义前面加上 @decorator
时,它实际上是在告诉解释器将该函数作为参数传递给装饰器函数,然后将装饰器函数的返回值赋给原始函数名。
分类:
- 函数装饰器
实现timing_decorator函数是一个闭包,在函数里面嵌套一个wrapper函数。
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time - start_time} seconds to run.")
return result
return wrapper
@timing_decorator
def my_function():
# Some time-consuming operation
time.sleep(2)
print("Function completed.")
my_function()
- 类装饰器
类装饰器是一种将装饰器定义为类的实例的方式。它们适用于需要保持状态的装饰器。类装饰器需要实现 __call__
方法。例如,一个带有状态的计数器装饰器:
class CounterDecorator:
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
print(f"Function {self.func.__name__} has been called {self.count} times.")
return self.func(*args, **kwargs)
@CounterDecorator
def my_function():
print("Function called.")
my_function()
- 方法装饰器
def log_method(func):
def wrapper(self, *args, **kwargs):
print(f"Calling method {func.__name__} with arguments {args} and {kwargs}")
result = func(self, *args, **kwargs)
print(f"Method {func.__name__} completed.")
return result
return wrapper
class MyClass:
@log_method
def my_method(self, value):
print(f"My method called with value: {value}")
obj = MyClass()
obj.my_method(42)
- 参数装饰器
import time
def timing_decorator(threshold):
def decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
if end_time - start_time > threshold:
print(f"{func.__name__} took more than {threshold} seconds to run.")
return result
return wrapper
return decorator
@timing_decorator(threshold=1)
def my_function():
# Some time-consuming operation
time.sleep(2)
print("Function completed.")
my_function()