Caffe Loss 层 - SigmoidCrossEntropyLoss 推导与Python实现

17 篇文章 0 订阅
16 篇文章 0 订阅

Caffe Loss 层 - SigmoidCrossEntropyLoss 推导与Python实现

[原文 - Caffe custom sigmoid cross entropy loss layer].

很清晰的一篇介绍,学习下.

1. Sigmoid Cross Entropy Loss 推导

Sigmoid Cross Entropy Loss 定义形式:

L=tln(P)+(1t)ln(1P) L = t l n ( P ) + ( 1 − t ) l n ( 1 − P ) ​

其中,

  • t t - target 或 label;
  • P - Sigmoid Score, P=11+ex P = 1 1 + e − x

则有:

L=tln(11+ex)+(1t)ln(111+ex) L = t l n ( 1 1 + e − x ) + ( 1 − t ) l n ( 1 − 1 1 + e − x )

公式推导有:

L=tln(11+ex)+(1t)ln(ex1+ex) L = t l n ( 1 1 + e − x ) + ( 1 − t ) l n ( e − x 1 + e − x )

L=tln(11+ex)+ln(ex1+ex)tln(ex1+ex) L = t l n ( 1 1 + e − x ) + l n ( e − x 1 + e − x ) − t l n ( e − x 1 + e − x )

L=t[ln1ln(1+ex)]+[ln(e1)ln(1+ex)]t[ln(ex)ln(1+ex)] L = t [ l n 1 − l n ( 1 + e − x ) ] + [ l n ( e − 1 ) − l n ( 1 + e − x ) ] − t [ l n ( e − x ) − l n ( 1 + e − x ) ]

L=[tln(1+ex)]+ln(ex)ln(1+ex)tln(ex)+[tln(1+ex)] L = [ − t l n ( 1 + e − x ) ] + l n ( e − x ) − l n ( 1 + e − x ) − t l n ( e − x ) + [ t l n ( 1 + e − x ) ]

合并相关项:

L=ln(ex)ln(1+ex)tln(ex) L = l n ( e − x ) − l n ( 1 + e − x ) − t l n ( e − x )

L=xln(e)ln(1+ex)+txln(e) L = − x l n ( e ) − l n ( 1 + e − x ) + t x l n ( e )

L=xln(1+ex)+xt L = − x − l n ( 1 + e − x ) + x t

即:

L=xtxln(1+ex) L = x t − x − l n ( 1 + e − x ) <1>

ex e − x (左) 和 ex e x (右) 的函数特点:
这里写图片描述

ex e − x 随着 x x 值的增加而减小,当 x 值为较大的负值时, ex e − x 值变得非常大,很容易引起溢出(overflow). 也就是说,函数需要避免出现这种数据类型.

因此,为了避免溢出,对损失函数 L L 进行改动. 即,当 x<0 时,采用 ex e x 进行修改损失函数:

原损失函数: L=xtxln(1+ex) L = x t − x − l n ( 1 + e − x ) <1>

有: L=xtx+ln(11+ex) L = x t − x + l n ( 1 1 + e − x )

最后一项乘以 ex e x

L=xtx+ln(1ex(1+ex)ex) L = x t − x + l n ( 1 ∗ e x ( 1 + e − x ) ∗ e x )

L=xtx+ln(ex1+ex) L = x t − x + l n ( e x 1 + e x )

L=xtx+[ln(ex)ln(1+ex)] L = x t − x + [ l n ( e x ) − l n ( 1 + e x ) ]

L=xtx+xlneln(1+ex) L = x t − x + x l n e − l n ( 1 + e x )

有:

L=xtln(1+ex) L = x t − l n ( 1 + e x ) <2>

根据 <1> 和 <2>,可以得到最终的损失函数:

L=xtxln(1+ex)(x>0) L = x t − x − l n ( 1 + e − x ) , ( x > 0 )

L=xt0ln(1+ex)(x<0) L = x t − 0 − l n ( 1 + e x ) , ( x < 0 )

合二为一,有:

L=xtmax(x,0)ln(1+e|x|)for all x L = x t − m a x ( x , 0 ) − l n ( 1 + e − | x | ) , f o r   a l l   x

2. Sigmoid Cross Entropy Loss 求导计算

x>0 x > 0 时, L=xtxln(1+ex) L = x t − x − l n ( 1 + e − x )

有:

Lx=(xtxln(1+ex))x ∂ L ∂ x = ∂ ( x t − x − l n ( 1 + e − x ) ) ∂ x

Lx=xtxxx(ln(1+ex))x ∂ L ∂ x = ∂ x t ∂ x − ∂ x ∂ x − ∂ ( l n ( 1 + e − x ) ) ∂ x

Lx=t111+ex(1+ex)x ∂ L ∂ x = t − 1 − 1 1 + e − x ∗ ∂ ( 1 + e − x ) ∂ x

Lx=t111+ex(ex)x ∂ L ∂ x = t − 1 − 1 1 + e − x ∗ ∂ ( e − x ) ∂ x

Lx=t1+ex1+ex ∂ L ∂ x = t − 1 + e − x 1 + e − x

有:

Lx=t11+ex ∂ L ∂ x = t − 1 1 + e − x

第二项为 Sigmoid 函数 P=11+ex P = 1 1 + e − x ,故,

Lx=tP ∂ L ∂ x = t − P

x<0 x < 0 时, L=xtln(1+ex) L = x t − l n ( 1 + e x )

Lx=(xtln(1+ex))x ∂ L ∂ x = ∂ ( x t − l n ( 1 + e x ) ) ∂ x

Lx=xtx(ln(1+ex))x ∂ L ∂ x = ∂ x t ∂ x − ∂ ( l n ( 1 + e x ) ) ∂ x

Lx=t11+ex(ex)x ∂ L ∂ x = t − 1 1 + e x ∗ ∂ ( e x ) ∂ x

Lx=tex1+ex ∂ L ∂ x = t − e x 1 + e x

Lx=texex(1+ex)(ex) ∂ L ∂ x = t − e x ∗ e − x ( 1 + e x ) ( e − x )

Lx=t11+ex ∂ L ∂ x = t − 1 1 + e − x

第二项为 Sigmoid 函数 P=11+ex P = 1 1 + e − x ,故,

Lx=tP ∂ L ∂ x = t − P

可以看出,对于 x>0 x > 0 x<0 x < 0 ,其求导的结果是一样的,都是 target 值与 Sigmoid 值的差值.

3. 基于 Python 定制 caffe loss layer

Caffe 官方给出了基于 Python 定制 EuclideanLossLayer 的 Demo.

这里,根据上面的公式推导,创建基于 Python 的 Caffe SigmoidCrossEntropyLossLayer.
Caffe 自带的是 C++ 实现 - SigmoidCrossEntropyLossLayer,可见 Caffe Loss层 - SigmoidCrossEntropyLossLayer.

假设 Labels{0,1} L a b e l s ∈ { 0 , 1 } .

3.1 SigmoidCrossEntropyLossLayer 实现

import caffe
import scipy

class CustomSigmoidCrossEntropyLossLayer(caffe.Layer):

    def setup(self, bottom, top):
        # check for all inputs
        if len(bottom) != 2:
            raise Exception("Need two inputs (scores and labels) to compute sigmoid crossentropy loss.")

    def reshape(self, bottom, top):
        # check input dimensions match between the scores and labels
        if bottom[0].count != bottom[1].count:
            raise Exception("Inputs must have the same dimension.")
        # difference would be the same shape as any input
        self.diff = np.zeros_like(bottom[0].data, dtype=np.float32)
        # layer output would be an averaged scalar loss
        top[0].reshape(1)

    def forward(self, bottom, top):
        score=bottom[0].data
        label=bottom[1].data

        first_term=np.maximum(score,0)
        second_term=-1*score*label
        third_term=np.log(1+np.exp(-1*np.absolute(score)))

        top[0].data[...]=np.sum(first_term+second_term+third_term)
        sig=scipy.special.expit(score)
        self.diff=(sig-label)
        if np.isnan(top[0].data):
                exit()

    def backward(self, top, propagate_down, bottom):
        bottom[0].diff[...]=self.diff

3.2 prototxt 中定义

layer {
  type: 'Python'
  name: 'loss'
  top: 'loss_opt'
  bottom: 'score'
  bottom: 'label'
  python_param {
    # the module name -- usually the filename -- that needs to be in $PYTHONPATH
    module: 'loss_layers'
    # the layer name -- the class name in the module
    layer: 'CustomSigmoidCrossEntropyLossLayer'
  }
  include {
        phase: TRAIN
  }
  # set loss weight so Caffe knows this is a loss layer.
  # since PythonLayer inherits directly from Layer, this isn't automatically
  # known to Caffe
  loss_weight: 1
}

[1] - Caffe Loss层 - SigmoidCrossEntropyLossLayer

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
### 回答1: 安装caffe-ssd-gpu在ubuntu18.04的步骤如下: 1. 安装CUDA:从Nvidia官网下载合适的CUDA安装包,按照官方文档的指引进行安装。 2. 安装依赖:运行以下命令安装所需依赖库: ``` sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev \ libopencv-dev libhdf5-serial-dev protobuf-compiler \ libgflags-dev libgoogle-glog-dev liblmdb-dev libboost-all-dev ``` 3. 下载caffe-ssd-gpu源码并编译:从Github上下载caffe-ssd-gpu的源码,按照官方文档指引进行编译。编译时需要指定编译选项为GPU模式。 4. 运行测试:安装完成后,运行测试脚本,确保安装配置成功。 以上为简要步骤,具体操作请参考对应文档和官方指引。 ### 回答2: Ubuntu18.04是目前比较常见的Linux操作系统之一,而CAFFE-SSD-GPU是深度学习的一个工具。下面是安装caffe-ssd-gpu的步骤: 1. 安装CUDA和cuDNN 首先,您需要安装CUDA和cuDNN,这是运行深度学习框架所需的必备组件。下载安装CUDA和cuDNN之前,您需要查看您的图形卡的型号,以便选择正确的CUDA版本和cuDNN版本。 在下载和安装CUDA和cuDNN之前,您需要在NVIDIA的开发者网站上注册自己,并下载适用于您机器的CUDA和cuDNN版本。此外,您还需要在命令行界面中设置以下环境变量: export PATH=/usr/local/cuda-8.0/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH 2. 安装依赖项 在安装caffe之前,需要安装一些依赖项。您可以使用以下命令将这些依赖项安装到您的Ubuntu系统上: sudo apt-get update sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler gfortran libjpeg62 libfreeimage-dev libatlas-base-dev git python-dev python-pip libgoogle-glog-dev libbz2-dev libxml2-dev libxslt-dev libffi-dev libssl-dev libgflags-dev liblmdb-dev python-yaml python-numpy python-scipy 3. 下载和安装CAFFE 现在,您需要在您的系统上下载和安装CAFFE。从github上获取caffesource代码并进行安装: git clone https://github.com/weiliu89/caffe.git cd caffe git checkout ssd 4. 编译和安装CAFFE 使用以下命令编译和安装caffe: cp Makefile.config.example Makefile.config make all -j $(($(nproc) + 1)) make pycaffe 执行该命令后,您需要等待一段时间才能完成CAFFE的编译。如果出现任何编译错误,请检查您的CUDA和cuDNN版本是否正确,并重新安装依赖项。 5. 使用CAFFE-SSD-GPU 现在,您已经成功地在Ubuntu18.04操作系统上安装并编译了CAFFE-SSD-GPU,您可以开始使用该工具来执行深度学习任务了。 总结 安装CAFFE-SSD-GPU需要充分理解linux的命令行操作。需要先确认CUDA和cuDNN已经安装,并正确设置环境变量。然后需要下载和安装CAFFE, 并最后编译和安装CAFFE。在安装过程中如果存在问题,可以查看错误日志,重新检查步骤。如果对命令行操作不熟悉,则先学习linux基础操作。 ### 回答3: caffe-ssd-gpu是一种基于caffe框架的用于实现目标检测的神经网络模型,在Ubuntu18.04系统中安装caffe-ssd-gpu需要进行以下步骤: 1. 安装CUDA CUDA是NVIDIA公司推出的用于高性能计算的并行计算平台和编程模型,是使用GPU进行深度学习任务所必需的。在Ubuntu18.04上安装CUDA需要首先确认自己的显卡型号,并选择合适的CUDA版本进行安装。可以在NVIDIA官网上下载相应的CUDA安装包,也可以通过命令行方式进行安装。在安装过程中注意要按照提示完成相应的配置和设置。 2. 安装cuDNN cuDNN是用于深度神经网络的GPU加速库,也是必需的组件之一。在安装过程中同样需要确认CUDA的版本和自己的显卡型号,并下载相应的cuDNN安装包进行安装。 3. 安装依赖包 在安装caffe-ssd-gpu前需要先安装几个依赖包,包括protobuf、opencv、boost等。可以通过命令行方式进行安装,例如: ``` sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev ``` 4. 下载caffe-ssd-gpu源码 可以在GitHub上找到caffe-ssd-gpu的源码,下载后解压到自己想要的目录下。 5. 编译和安装caffe-ssd-gpu 进入caffe-ssd-gpu源码目录下,执行以下命令: ``` cd caffe-ssd-gpu mkdir build cd build cmake .. make all -j8 make install ``` 其中,make all -j8表示使用8个线程进行编译,提高编译速度。make install表示安装编译好的caffe-ssd-gpu库文件和可执行文件。 6. 测试安装是否成功 可以尝试运行caffe-ssd-gpu自带的测试程序,检查安装是否成功。在源码目录下执行以下命令: ``` ./build/tools/caffe time --model=models/VGGNet/VOC0712/SSD_300x300_ft/deploy.prototxt --gpu=0 ``` 这条命令会测试caffe-ssd-gpu在GPU上执行推断的速度,如果没有问题,则说明安装成功。 需要注意的是,在安装过程中可能会遇到各种问题,例如依赖包的版本不兼容、CUDA和cuDNN的配置出错等等。这时候需要耐心调试错误,逐个解决问题,才能确保caffe-ssd-gpu能够正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值