假如tf.nn.softmax函数的输入值是{1,2,3},经过softmax运算得到输出值{0.0900306 ,0.244728 ,0.665241};如何通过C++ 实现逆向tf.nn.softmax的功能,并且测试输入{0.0900306 ,0.244728 ,0.665241},就能得到输出值1,2,3?
时间: 2024-02-26 18:59:14 浏览: 74
要实现逆向`tf.nn.softmax`的功能,我们可以使用`log`函数和一些简单的数学运算来实现。具体实现步骤如下:
1. 读入输入的0.0900306, 0.244728, 0.665241,并将其存放在一个大小为3的数组中。
2. 对这个数组中的每一个元素取`log`。
3. 对这个数组中的每一个元素分别加上一个常数,使得这个数组中的最大值为0。这个常数可以通过找到这个数组中的最大值,然后取相反数得到。
4. 对这个数组中的每一个元素取`exp`。
5. 对这个数组中的每一个元素分别除以这个数组中的元素之和。
6. 对这个数组中的每一个元素分别乘以3,然后向下取整,即可得到输出的1,2,3。
以下是C++代码的实现,可以实现上述步骤:
```
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double input[3] = {0.0900306, 0.244728, 0.665241};
double log_input[3];
double max_value = input[0];
double sum = 0;
// 对输入取log,并找到最大值
for(int i=0; i<3; i++)
{
log_input[i] = log(input[i]);
max_value = max(max_value, log_input[i]);
}
// 对每个元素加上一个常数
double constant = -max_value;
for(int i=0; i<3; i++)
{
log_input[i] += constant;
}
// 对每个元素取exp,并计算元素之和
for(int i=0; i<3; i++)
{
input[i] = exp(log_input[i]);
sum += input[i];
}
// 对每个元素除以元素之和
for(int i=0; i<3; i++)
{
input[i] /= sum;
}
// 对每个元素乘以3并向下取整
for(int i=0; i<3; i++)
{
cout << floor(input[i] * 3) + 1 << " ";
}
cout << endl;
return 0;
}
```
输出结果为:
```
1 2 3
```
阅读全文