如何解决用于使用vgg16
我正在尝试实施反卷积特征金字塔网络 dfpn的目的是将低级特征图与高级特征图进行集成。 请阅读https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0203897部分反卷积特征金字塔网络下的文章。dfpn的输出将在分类网络和回归网络的卷积层之后使用。但是我得到的损失值很差,尤其是对于bBox回归。
我的代码是
def generate_dfpn(self):
self.training_parameters1=[]
#first step
self.shape1=tf.shape(self.base_net.conv5_3)
self.shape2=tf.shape(self.base_net.conv3_3)
self.deconv1=tf.image.resize(images=self.base_net.conv5_3,size=tf.shape(self.base_net.conv3_3)[1:3])
self.shape3=tf.shape(self.deconv1)
#self.conv1=tf.layers.conv2d(inputs=self.deconv1,filters=16,kernel_size=(3,3),padding='same',activation=tf.nn.relu)
kernel1 = tf.Variable(tf.truncated_normal([3,3,512,256],dtype=tf.float32,stddev=1e-2),name='weights')
dimensions=[3,256]
self.conv1= tf.nn.Conv2d(self.deconv1,filters=kernel1,strides=[1,1,1],padding = 'SAME')
biases = tf.Variable(tf.constant(0.0,shape=dimensions[-1:],dtype=tf.float32),trainable=True,name='biases')
self.output1 = tf.nn.bias_add(self.conv1,biases)
self.output1=tf.cond(self.is_training,lambda:tf.keras.layers.Batchnormalization(scale=False,trainable=True)(self.conv1),trainable=False)(self.conv1))
self.output1=tf.nn.relu(self.output1)
self.shape4=tf.shape(self.output1)
self.training_parameters1 += [kernel1,biases]
#second step
self.output2=tf.cond(self.is_training,lambda:tf.keras.layers.Batchnormalization(trainable=True)(self.base_net.conv3_3),lambda:tf.keras.layers.Batchnormalization(trainable=False)(self.base_net.conv3_3))
self.shape5=tf.shape(self.output2)
self.output2=tf.keras.layers.Concatenate()([self.output1,self.output2])
self.deconv2=tf.image.resize_nearest_neighbor(images=self.output2,size=tf.shape(self.base_net.conv2_2)[1:3])
kernel2 = tf.Variable(tf.truncated_normal([3,256,128],name='weights')
dimensions2=[3,128]
self.conv2= tf.nn.Conv2d(self.deconv2,filters=kernel2,padding = 'SAME')
biases2 = tf.Variable(tf.constant(0.0,shape=dimensions2[-1:],name='biases')
self.output3=tf.cond(self.is_training,trainable=True)(self.conv2),trainable=False)(self.conv2))
self.output3=tf.nn.relu(self.output3)
self.training_parameters1 += [kernel2,biases2]
#self.shape2=tf.shape(self.output3)
#add weights of conv layers to the var_list of the minimizer
#self.base_net.training_parameters += [kernel1,kernel2]
#third step
self.output4=tf.cond(self.is_training,lambda:tf.keras.layers.Batchnormalization(trainable=True)(self.base_net.conv2_2),lambda:tf.keras.layers.Batchnormalization(trainable=False)(self.base_net.conv2_2))
self.output4=tf.keras.layers.Concatenate()([self.output3,self.output4])
self.shape7=tf.shape(self.output4)
#fourth step (pooling)
self.max_pool = tf.nn.max_pool(self.output4,ksize=[1,2,4,padding ='SAME',name='max_pool')
self.avg_pool = tf.nn.avg_pool(self.output4,name='avg_pool')
self.dfpn_layer=tf.keras.layers.Concatenate()([self.max_pool,self.avg_pool])
self.shape_dfpn_layer=tf.shape(self.dfpn_layer)[1:3]
self.base_net.output_map=self.dfpn_layer
self.base_net.shape_output_map=self.shape_dfpn_layer
#self.base_net.shape_output_map1=tf.shape(self.max_pool)
self.base_net.shape_output_map1=tf.shape(self.dfpn_layer)
以及vgg16代码:
# conv1_1
self.conv1_1,param = self.conv_layer(images,name_of_scope="conv1_1",dimensions=[3,64])
self.parameters += param
# conv1_2
self.conv1_2,param = self.conv_layer(self.conv1_1,name_of_scope="conv1_2",64,64])
self.parameters += param
# pool1
self.pool1 = tf.nn.max_pool(self.conv1_2,padding = 'SAME',name='pool1')
# conv2_1
self.conv2_1,param = self.conv_layer(self.pool1,name_of_scope="conv2_1",128])
self.parameters += param
# conv2_2
self.conv2_2,param = self.conv_layer(self.conv2_1,name_of_scope="conv2_2",128,128])
self.parameters += param
# pool2
self.pool2 = tf.nn.max_pool(self.conv2_2,name='pool2')
# conv3_1
self.conv3_1,param = self.conv_layer(self.pool2,name_of_scope="conv3_1",256])
self.parameters += param
# conv3_2
self.conv3_2,param = self.conv_layer(self.conv3_1,name_of_scope="conv3_2",256])
self.parameters += param
# conv3_3
self.conv3_3,param = self.conv_layer(self.conv3_2,name_of_scope="conv3_3",256])
self.parameters += param
# pool3
self.pool3 = tf.nn.max_pool(self.conv3_3,padding='SAME',name='pool3')
# conv4_1
self.conv4_1,param = self.conv_layer(self.pool3,name_of_scope="conv4_1",512])
self.parameters += param
# conv4_2
self.conv4_2,param = self.conv_layer(self.conv4_1,name_of_scope="conv4_2",512])
self.parameters += param
# conv4_3
self.conv4_3,param = self.conv_layer(self.conv4_2,name_of_scope="conv4_3",512])
self.parameters += param
# pool4
self.pool4 = tf.nn.max_pool(self.conv4_3,ksize= [1,name='pool4')
# conv5_1
self.conv5_1,param = self.conv_layer(self.pool4,name_of_scope="conv5_1",512])
self.parameters += param
# conv5_2
self.conv5_2,param = self.conv_layer(self.conv5_1,name_of_scope="conv5_2",512])
self.parameters += param
# conv5_3
self.conv5_3,param = self.conv_layer(self.conv5_2,name_of_scope="conv5_3",512])
self.parameters += param
# pool5
self.pool5 = tf.nn.max_pool(self.conv5_3,name='pool5')
## shape
self.shape_conv5_3 = tf.shape(self.conv5_3)[1:3]
我使用vgg16的conv5_3作为输出特征图来创建类和回归网络。现在我使用dfpn的输出。 [步骤1]通过预先训练的模型初始化VGG-16网络。
对于i = 1最大化Do
[第二步]将调整大小后的图像发送到VGG-16网络以进行正向传播计算。
[第三步] DFPN用于将较低的特征图与顶层的特征图集成。
[第六步]执行Erpn的反向传播。
结束
那么dfpn的输出是否被视为顶级功能,或者这是我需要更改的问题?
如果您能帮助我,我将非常感谢。 预先感谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。