【神经网络实践】tentorflow上的多目标识别(5,完)

前言:

{

    经过这么久,这一系列终于结束了。

}

 

正文:

{

    网络的特征提取部分被我换成了inceptionV3。用分类训练好的pnasnet进行单目标分类的效果还不错,但是用于多目标检测时却学不到东西(可能是此网络过于复杂,特征到最后都被混淆到了一起)。

    我做了以下实验:

    1,VOC2012分类 + pnasnet + 自定义归一化 + 双补偿方差损失 = 网络学不到东西

    2,floscular images + inceptionV3 + 自定义归一化 + 双补偿方差损失 = 快速拟合到80%的正确率

    3,VOC2012分类 + inceptionV3 + 自定义归一化 + 双补偿方差损失 = 正确率最高到96%,但输出的第0位容易出1

    4,VOC2012分类 + inceptionV3 + 自定义归一化 + 新双补偿方差损失 + batch_size=64 = 200次迭代后正确率在85%左右

    5,VOC2012分类 + inceptionV3 + 自定义归一化 + 无补偿方差损失 = 正确率快速升高,但正确率到90%后就很难再升高

    6,VOC2012分类 + inceptionV3 + 自定义归一化 + 无补偿方差损失 + 学习率=0.1 = (最优)在接近200次迭代时出现“顿悟”,之后正确率大多在95%以上,最高到达97%

    7,VOC2012分类 + inceptionV3 + 自定义归一化 + 无补偿标准差损失 + 学习率=0.1 = 同5

    8,VOC2012分类 + inceptionV3 + 自定义归一化 + 无补偿标准差损失 = 同5,在第300次迭代时才出现突破,但在之后的100多次迭代中正确率最高才到95%

    9,VOC2012分类 + inceptionV3 + 自定义归一化 + 新双补偿方差损失 + 学习率=0.1 = (最优)正确率在270次迭代时到达95%

    其中,两个最优分别是考虑样本分布的最优和不考虑样本分布的最优;双补偿和新双补偿是一种我设计的损失补偿方法,目的是为了平衡样本的不均衡。初始的双补偿很复杂,而且是随感觉设计的。代码1是新双补偿的代码。

#代码1
base_loss = tf.math.squared_difference(self.final_output, binaryzed_FC_labels)
weight_dictionary = tf.constant(dictionary.class_weight_dictionary, tf.float32)
class_total = tf.reduce_sum(weight_dictionary)
weight_dictionary = tf.tile(tf.expand_dims(weight_dictionary, 0), [self.batch_size, 1])
positive_class_weights = class_total / weight_dictionary * binaryzed_FC_labels
negative_class_weights = class_total / (class_total-weight_dictionary) * (1-binaryzed_FC_labels)
loss_weights = positive_class_weights + negative_class_weights   #calculate the loss compensation
tf.losses.add_loss(tf.reduce_sum(base_loss*loss_weights))

    代码没有优化过(特别是那个self.batch_size,我还不知道怎么创建张量与shape中有None的张量进行计算),总之就是根据样本的分布设置损失的权值。

    再放上一些结果图。图1是“顿悟”时刻的部分结果记录;图2是最高正确率的截图。

【神经网络实践】tentorflow上的多目标识别(5,完)_第1张图片 图1 【神经网络实践】tentorflow上的多目标识别(5,完)_第2张图片 图2

}

 

结语:

{

    代码需要进一步调试和整理,整理好之后我就把代码放到github上。

}

你可能感兴趣的:(python,神经网络与机器学习,神经网络实践)