【发布时间】:2019-09-13 08:49:09
【问题描述】:
我正在尝试将 Yolo v3 转换为 tensorflow 2.0 我编写了 Darknet53 网络层,我能够在测试输入和实际图像上运行它,但两种情况下的结果都是“nan”
我已经尝试过放大和缩小代码。首先将图像除以 255 以在 0 和 1 之间缩放,如原始论文中那样,然后乘以 255 以检查值是否太低而无法处理。我也尝试了不缩放的原始图像。
这是实际的网络
import tensorflow as tf
class ResnetIdentityBlock(tf.keras.Model):
def __init__(self, kernel_size, filters):
super(ResnetIdentityBlock, self).__init__(name='')
filters1, filters2, filters3 = filters
self.conv2a = tf.keras.layers.Conv2D(filters1, (1,1))
self.bn2a = tf.keras.layers.BatchNormalization()
self.conv2b = tf.keras.layers.Conv2D(filters2, kernel_size, padding="SAME")
self.bn2b = tf.keras.layers.BatchNormalization()
self.conv2c = tf.keras.layers.Conv2D(filters3, (1,1))
self.bn2c = tf.keras.layers.BatchNormalization()
def call(self, input_tensor, training=False):
x = self.conv2a(input_tensor)
x = self.bn2a(x, training=training)
x = tf.nn.relu(x)
print(f"after conv + bn a \n{x.shape}")
x = self.conv2b(x)
x = self.bn2b(x, training=training)
x = tf.nn.relu(x)
print(f"after conv + bn b \n{x.shape}")
x = self.conv2c(x)
x = self.bn2c(x, training=training)
print(f"after conv + bn c \n{x.shape}")
x += input_tensor
print(f"input shape\n {input_tensor.shape}")
print(f"final shape \n{x.shape}")
return tf.nn.relu(x)
class Darknet53Block(tf.keras.Model):
'''the main block of Darknet53, two conv followed by a residual'''
def __init__(self, filters):
super(Darknet53Block, self).__init__(name='')
self.conv2a = tf.keras.layers.Conv2D(filters,1)
self.bn2a = tf.keras.layers.BatchNormalization(epsilon=1e-05)
self.conv2b = tf.keras.layers.Conv2D(filters*2, 3, padding="SAME")
self.bn2b = tf.keras.layers.BatchNormalization(epsilon=1e-05)
def call(self, input_tensor, training=False):
x = self.conv2a(input_tensor)
x = self.bn2a(x, training=training)
x = tf.nn.leaky_relu(x, 0.1)
x = self.conv2b(x)
x = self.bn2b(x, training=training)
x = tf.nn.leaky_relu(x, 0.1)
x += input_tensor
return x
class Darknet53(tf.keras.Model):
def __init__(self, *args, **kwargs):
super(Darknet53, self).__init__(name='')
self.bn = tf.keras.layers.BatchNormalization(epsilon=1e-05)
self.conv2a = tf.keras.layers.Conv2D(filters=32,kernel_size=3)
self.conv2b = tf.keras.layers.Conv2D(filters=64, kernel_size=3, strides=2)
self.dn_a = Darknet53Block(filters=32)
self.conv2c = tf.keras.layers.Conv2D(filters=128,kernel_size=3, strides=2)
self.dn_b = Darknet53Block(filters=64)
self.conv2d = tf.keras.layers.Conv2D(filters=256, kernel_size=3, strides=2)
self.dn_c = Darknet53Block(filters=128)
self.conv2e = tf.keras.layers.Conv2D(filters=512, kernel_size=3, strides=2)
self.dn_d = Darknet53Block(filters=256)
self.conv2f = tf.keras.layers.Conv2D(filters=1024,kernel_size=3, strides=2)
self.dn_e = Darknet53Block(filters=512)
def call(self, input_tensor):
x = self.conv2a(input_tensor)
x = self.bn(x)
x = tf.nn.leaky_relu(x, alpha=0.1)
x = self.conv2b(x)
x = self.bn(x)
x = tf.nn.leaky_relu(x, alpha=0.1)
x = self.dn_a(x)
x = self.conv2c(x)
x = self.bn(x)
x = tf.nn.leaky_relu(x, alpha=0.1)
for i in range(2):
x = self.dn_b(x)
x = self.conv2d(x)
x = self.bn(x)
x = tf.nn.leaky_relu(x, alpha=0.1)
for i in range(8):
x = self.dn_c(x)
scale_1 = x
x = self.conv2e(x)
x = self.bn(x)
x = tf.nn.leaky_relu(x, alpha=0.1)
for i in range(8):
x = self.dn_d(x)
scale_2 = x
x = self.conv2f(x)
x = self.bn(x)
x = tf.nn.leaky_relu(x, alpha=0.1)
for i in range(4):
x = self.dn_e(x)
return scale_1, scale_2, x
这里是测试代码
if __name__ == "__main__":
import numpy as np
import cv2
darknet = Darknet53()
img = cv2.imread("20190413_143522_126.jpg")
img = cv2.resize(img, (416,416))/255.0
img = img.reshape((1,416,416,3))
img = np.asarray(img, dtype=np.float32)
print(img)
result1, result2, result3 = darknet(img)
print(result1)
print(result2)
print(result3)
我希望输出在 0 和 1 之间。结果的大小很好,但它们似乎都填充了“nan”
【问题讨论】:
标签: python tensorflow yolo tensorflow2.0