91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么實現softmax函數

發布時間:2022-05-18 15:47:09 來源:億速云 閱讀:844 作者:iii 欄目:開發技術

本篇內容主要講解“C++怎么實現softmax函數”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++怎么實現softmax函數”吧!

    背景

    今天面試字節算法崗時被問到的問題,讓我用C++實現一個softmax函數。softmax是邏輯回歸在多分類問題上的推廣。大概的公式如下:

    C++怎么實現softmax函數

    即判斷該變量在總體變量中的占比。

    第一次實現

    實現

    我們用vector來封裝輸入和輸出,簡單的按公式復現。

    vector<double> softmax(vector<double> input)
    {
    	double total=0;
    	for(auto x:input)
    	{
    		total+=exp(x);
    	}
    	vector<double> result;
    	for(auto x:input)
    	{
    		result.push_back(exp(x)/total);
    	}
    	return result;
    }

    測試

    test 1
    • 測試用例1: {1, 2, 3, 4, 5}

    • 測試輸出1: {0.0116562, 0.0316849, 0.0861285, 0.234122, 0.636409}

    經過簡單測試是正常的。

    C++怎么實現softmax函數

    test 2

    但是這時面試官提出了一個問題,即如果有較大輸入變量時會怎么樣?

    • 測試用例2: {1, 2, 3, 4, 5, 1000}

    • 測試輸出2: {0, 0, 0, 0, 0, nan}

    由于 e^1000已經溢出了雙精度浮點(double)所能表示的范圍,所以變成了NaN(not a number)。

    C++怎么實現softmax函數

    第二次實現(改進)

    改進原理

    我們注意觀察softmax的公式:

    C++怎么實現softmax函數

    如果我們給上下同時乘以一個很小的數,最后答案的值是不變的。

    那我們可以給每一個輸入 x i 都減去一個值 a ,防止爆精度。

    大致表示如下:

    C++怎么實現softmax函數

    實現

    vector<double> softmax(vector<double> input)
    {
    	double total=0;
    	double MAX=input[0];
    	for(auto x:input)
    	{
    		MAX=max(x,MAX);
    	}
    	for(auto x:input)
    	{
    		total+=exp(x-MAX);
    	}
    	vector<double> result;
    	for(auto x:input)
    	{
    		result.push_back(exp(x-MAX)/total);
    	}
    	return result;
    }

    測試

    test 1
    • 測試用例1: {1, 2, 3, 4, 5, 1000}

    • 測試輸出1: {0, 0, 0, 0, 0, 1}

    C++怎么實現softmax函數

    test 2
    • 測試用例1: {0, 19260817, 19260817}

    • 測試輸出1: {0, 0.5, 0.5}

    C++怎么實現softmax函數

    我們發現結果正常了。

    完整代碼

    #include <iostream>
    #include <vector>
    #include <math.h>
    using namespace std;
    vector<double> softmax(vector<double> input)
    {
    	double total=0;
    	double MAX=input[0];
    	for(auto x:input)
    	{
    		MAX=max(x,MAX);
    	}
    	for(auto x:input)
    	{
    		total+=exp(x-MAX);
    	}
    	vector<double> result;
    	for(auto x:input)
    	{
    		result.push_back(exp(x-MAX)/total);
    	}
    	return result;
    }
    int main(int argc, char *argv[])
    {
    	int n;
    	cin>>n;
    	vector<double> input;
    	while(n--)
    	{
    		double x;
    		cin>>x;
    		input.push_back(x);
    	}
    	for(auto y:softmax(input))
    	{
    		cout<<y<<' ';
    	}
    }

    到此,相信大家對“C++怎么實現softmax函數”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    个旧市| 新营市| 蒙山县| 沅江市| 寻甸| 壤塘县| 馆陶县| 故城县| 久治县| 宜川县| 阳谷县| 廊坊市| 日喀则市| 宁津县| 玛多县| 莒南县| 米脂县| 宜昌市| 读书| 锡林郭勒盟| 贡觉县| 邯郸市| 苍梧县| 江永县| 花垣县| 翁源县| 南雄市| 玉环县| 星子县| 新沂市| 手游| 玉龙| 若尔盖县| 万盛区| 盖州市| 宝清县| 阿城市| 清苑县| 古蔺县| 镇沅| 孟津县|