Softmax函数防止溢出,稳定计算

Softmax函数

用户:

cv::Mat softmax(const cv::Mat& src) {
   
    CV_Assert(src.type() == CV_32FC1); // 确保输入矩阵是单通道的32位浮点类型
    for (auto i = 0; i < src.rows; ++i) {
   
      cv::Mat singleRow = src.row(i);
      double max;
      cv::minMaxLoc(singleRow, NULL, &max, NULL, NULL);
      singleRow -= static_cast<float>(max);
      cv::exp(singleRow, singleRow);
      cv::Mat sumMat;
      cv::reduce(singleRow, sumMat, 1, cv::REDUCE_SUM, CV_32F);
      float sum = sumMat.at<float>(0, 0); // 假设 sumMat 是一个单列矩阵
      singleRow /= sum;
    }
    return src;
}

根据这个softmax把数学表达式写出来

ChatGPT:

Softmax函数是一种常用于多分类任务的激活函数,它能够将一个向量转换成概率分布。给定一个输入向量 ( z = [ z 1 , z 2 , … , z n ] ) (\mathbf{z} = [z_1, z_2, \ldots, z_n]) (z=[z1,z2,,zn]),Softmax函数的输出是:

softmax ( z i ) = e z i ∑ j = 1 n e z j \text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}} softmax(zi)=j=1nezjezi

这个函数将输入向量中的每个元素 z i z_i zi转换为一个非负数,并且这些非负数的总和为1。

对于你的代码,假设输入矩阵 X \mathbf{X} X m m m 行和 n n n 列。代码的每一步操作可以用数学表达式表示如下:

  1. 取每一行的最大值并减去它
    对于矩阵 X \mathbf{X} X 的第 i i i x i \mathbf{x}_i xi,找到最大值 max ⁡ ( x i ) \max(\mathbf{x}_i) max(xi) 并减去它,用公式表示为:
    x i ′ = x i − max ⁡ ( x i ) \mathbf{x}_i' = \mathbf{x}_i - \max(\mathbf{x}_i) xi=ximax(xi)

  2. 对每个元素取指数
    对于每个元素 x i j ′ \mathbf{x}_{ij}' xij(第 i i i 行第 j j j 列的元素),取指数:
    y i j = e x i j ′ \mathbf{y}_{ij} = e^{\mathbf{x}_{ij}'} yij=exij

  3. 计算每一行的元素和
    对于第 i i i 行,计算所有元素的和:
    S i = ∑ j = 1 n y i j S_i = \sum_{j=1}^{n} \mathbf{y}_{ij} Si=j=1nyij

  4. 每一行的元素除以该行的和
    对于第 i i i 行的每个元素,除以该行的和 S i S_i Si
    z i j = y i j S i \mathbf{z}_{ij} = \frac{\mathbf{y}_{ij}}{S_i} zij=Siyij

综合起来,对于矩阵 X \mathbf{X} X 中的每一行 x i \mathbf{x}_i xi,Softmax函数的数学表达式是:

softmax ( x i ) = [ e x i 1 − max ⁡ ( x i ) ∑ j = 1 n e x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值