Python 转换暗色t53得到;“南”;结果是Tensorflow 2.0

Python 转换暗色t53得到;“南”;结果是Tensorflow 2.0,python,tensorflow,yolo,tensorflow2.0,Python,Tensorflow,Yolo,Tensorflow2.0,我正在尝试将Yolo v3转换为tensorflow 2.0 我编写了Darknet53网络层,我能够在测试输入和实际图像上运行它,但在这两种情况下的结果都是“nan” 我已经尝试过上下扩展代码。首先,将图像除以255以在0和1之间缩放,如原始纸张中所示,然后乘以255以检查值是否太低而无法处理。我还尝试了没有缩放的原始图像 这是实际的网络 将tensorflow导入为tf 类ResnetIdentityBlock(tf.keras.Model): 定义初始化(自身、内核大小、过滤器): 超级(

我正在尝试将Yolo v3转换为tensorflow 2.0 我编写了Darknet53网络层,我能够在测试输入和实际图像上运行它,但在这两种情况下的结果都是“nan”

我已经尝试过上下扩展代码。首先,将图像除以255以在0和1之间缩放,如原始纸张中所示,然后乘以255以检查值是否太低而无法处理。我还尝试了没有缩放的原始图像

这是实际的网络

将tensorflow导入为tf
类ResnetIdentityBlock(tf.keras.Model):
定义初始化(自身、内核大小、过滤器):
超级(ResnetIdentityBlock,self)。\uuuuu初始化(name=“”)
过滤器1、过滤器2、过滤器3=过滤器
self.conv2a=tf.keras.layers.Conv2D(过滤器1,(1,1))
self.bn2a=tf.keras.layers.BatchNormalization()
self.conv2b=tf.keras.layers.Conv2D(过滤器2,内核大小,padding=“相同”)
self.bn2b=tf.keras.layers.BatchNormalization()
self.conv2c=tf.keras.layers.Conv2D(过滤器3,(1,1))
self.bn2c=tf.keras.layers.BatchNormalization()
def调用(自、输入张量、训练=假):
x=self.conv2a(输入张量)
x=自我。bn2a(x,培训=培训)
x=tf.nn.relu(x)
打印(在conv+bna\n{x.shape}之后为“f”)
x=自转换2b(x)
x=自我。bn2b(x,培训=培训)
x=tf.nn.relu(x)
打印(f“在conv+bn b\n{x.shape}之后)
x=自转换2C(x)
x=自我。bn2c(x,培训=培训)
打印(f“在conv+bn c\n{x.shape}之后)
x+=输入张量
打印(f“输入形状\n{input_tensor.shape}”)
打印(f“最终形状\n{x.shape}”)
返回tf.nn.relu(x)
暗色53级区块(tf.keras.Model):
“深色53的主块,两个conv,后面是一个剩余块”
定义初始化(自,过滤器):
超级(暗色53Block,self)。\uuuuu初始化(名称=“”)
self.conv2a=tf.keras.layers.Conv2D(过滤器,1)
self.bn2a=tf.keras.layers.BatchNormalization(ε=1e-05)
self.conv2b=tf.keras.layers.Conv2D(过滤器*2,3,padding=“相同”)
self.bn2b=tf.keras.layers.BatchNormalization(ε=1e-05)
def调用(自、输入张量、训练=假):
x=self.conv2a(输入张量)
x=自我。bn2a(x,培训=培训)
x=tf.nn.leaky_relu(x,0.1)
x=自转换2b(x)
x=自我。bn2b(x,培训=培训)
x=tf.nn.leaky_relu(x,0.1)
x+=输入张量
返回x
黑暗等级53(tf.keras.Model):
定义初始化(self,*args,**kwargs):
超级(暗色53,自我)。\uuuuu初始(名称=“”)
self.bn=tf.keras.layers.BatchNormalization(ε=1e-05)
self.conv2a=tf.keras.layers.Conv2D(过滤器=32,内核大小=3)
self.conv2b=tf.keras.layers.Conv2D(过滤器=64,内核大小=3,步幅=2)
self.dn_a=darknet53块(过滤器=32)
self.conv2c=tf.keras.layers.Conv2D(过滤器=128,内核大小=3,步幅=2)
self.dn_b=darknet53块(过滤器=64)
self.conv2d=tf.keras.layers.conv2d(过滤器=256,内核大小=3,步幅=2)
self.dn_c=darknet53块(过滤器=128)
self.conv2e=tf.keras.layers.Conv2D(过滤器=512,内核大小=3,步幅=2)
self.dn_d=darknet53块(过滤器=256)
self.conv2f=tf.keras.layers.Conv2D(过滤器=1024,内核大小=3,步幅=2)
self.dn_e=darknet53块(过滤器=512)
def调用(自、输入张量):
x=self.conv2a(输入张量)
x=自身.bn(x)
x=tf.nn.leaky_relu(x,alpha=0.1)
x=自转换2b(x)
x=自身.bn(x)
x=tf.nn.leaky_relu(x,alpha=0.1)
x=自身dn_a(x)
x=自转换2C(x)
x=自身.bn(x)
x=tf.nn.leaky_relu(x,alpha=0.1)
对于范围(2)中的i:
x=自身dn_b(x)
x=自。conv2d(x)
x=自身.bn(x)
x=tf.nn.leaky_relu(x,alpha=0.1)
对于范围(8)中的i:
x=自身dn_c(x)
标度_1=x
x=自转换(x)
x=自身.bn(x)
x=tf.nn.leaky_relu(x,alpha=0.1)
对于范围(8)中的i:
x=自身dn_d(x)
刻度盘2=x
x=自转换函数2f(x)
x=自身.bn(x)
x=tf.nn.leaky_relu(x,alpha=0.1)
对于范围(4)中的i:
x=自身dn_e(x)
返回刻度盘1,刻度盘2,x
这是测试代码

如果名称=“\uuuuu main\uuuuuuuu”:
将numpy作为np导入
进口cv2
darknet=Darknet53()
img=cv2.imread(“20190413_143522_126.jpg”)
img=cv2.resize(img,(416416))/255.0
img=img.重塑((1416416,3))
img=np.asarray(img,dtype=np.float32)
打印(img)
结果1、结果2、结果3=暗网(img)
打印(结果1)
打印(结果2)
打印(结果3)

我希望输出介于0和1之间。结果的大小很好,但它们似乎都填充了“nan”

因为tensorflow 2.1.0rc0很快将作为最终的2.1.0发布,有一个新的API专门设计来帮助用户找出此类数字问题的根本原因,即
tf.调试。启用\u check\u numerics()

tf.debug.enable\u check\u numerics()
是TF1中名为
tf.add\u check\u numerics\u ops()
的旧API的继承者,该API在TF2中不受支持

要在TF2中使用新API,只需在构建和运行模型之前将该行添加到代码中的某个位置。作为一个简单的例子

将tensorflow导入为tf
tf.debug.enable_check_numerics()#将这一行添加到代码中。
#...
darknet=Darknet53()
结果1、结果2、结果3=暗网(img)
在执行过程中(即,
darknet(img)
)调用,一旦任何操作(无论是急切地执行还是在tf.function图中执行)在其浮点型张量输出中输出任何无穷大或NaN,程序就会出错。错误