YOLOX-initialize_biases

    def initialize_biases(self, prior_prob):
        for conv in self.cls_preds:                                         # cls_preds 用于分类,其输入通道数为 256,输出通道数为类别数
                                                                            # conv表示的是每个卷积层
            b = conv.bias.view(1, -1)                                       # conv.bias.view(1, -1) 表示将 conv.bias 的形状转换为 1 行,列数自动计算
            # conv.bias原本的形状为 3 x 1,经过 conv.bias.view(1, -1) 转换后的形状为 1 x 3
            b.data.fill_(-math.log((1 - prior_prob) / prior_prob))          # prior_prob 表示先验概率,即目标存在的概率
            # math.log((1 - prior_prob) / prior_prob) 表示计算对数
            # fill_() 表示将 b.data 填充为 -math.log((1 - prior_prob) / prior_prob)
            # 如果目标存在的概率为 0.01,那么目标不存在的概率为 0.99,那么 -math.log((1 - prior_prob) / prior_prob) = -4.60517
            conv.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)
            # Q: view(-1)表示什么意思?
            # A: view(-1) 表示将 b.view(-1) 的形状转换为 1 列,行数自动计算
            # Q: b.data原本的形状是什么呢?
            # A: b.data原本的形状是 1 x 80,行数为 1,列数为 80
            # torch.nn.Parameter() 表示将 b.view(-1) 转换为 Parameter 类型
            # Parameter 类型的数据可以被模型参数化
        for conv in self.obj_preds:
            b = conv.bias.view(1, -1)
            b.data.fill_(-math.log((1 - prior_prob) / prior_prob))
            conv.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)
    # Q: 为什么要初始化 biases对cls_preds和obj_preds有什么影响呢?
    # A: 因为在训练过程中,如果不初始化 biases,那么在训练过程中,模型会将所有的预测结果都置为 0,这样会导致模型无法学习到任何信息
    # Q: 我理解所有的卷积层都会被初始化,那么为什么只有cls_preds和obj_preds有对应的函数呢?
    # A: 因为 cls_preds 和 obj_preds 是用于分类和检测的,所以需要初始化 biases
    # Q: 如同你说的,cls_preds 和 obj_preds 均被初始化,那么为什么其他的卷积层没有被初始化呢?
    # A: 因为其他的卷积层不是用于分类和检测的,所以不需要初始化 biases
    # Q: 如果其他的卷积层都被置为 0,那么会有什么影响呢?
    # A: 如果其他的卷积层都被置为 0,那么会导致模型无法学习到任何信息
    # Q: 那其他卷积层是在哪里初始化的呢?
    # A: 其他卷积层是在 torch.nn.Conv2d() 中初始化的
    # Q: initialize_biases只会在初始化时被调用一次吗?
    # A: 是的

已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注