محاسبه تابع softmax - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

محاسبه تابع softmax

0 امتیاز
سلام.

من کدی در c++ نوشتم قصد دارم تابع softmax را روی یک وکتور اعشاری اجرا کنم چطور اینکار را انجام بدم؟
سوال شده مرداد 15, 1402  بوسیله ی Lori3 (امتیاز 857)   11 36 105

2 پاسخ

+1 امتیاز
 
بهترین پاسخ

 این پیاده سازی PyTorch تابع Softmax است:

def softmax(x):
    """این تابع به یک تنسور ورودی n بعدی تابع Softmax را اعمال می کند."""

    max_x = torch.max(x, dim=-1, keepdim=True)
    exp_x = torch.exp(x - max_x)
    sum_exp_x = torch.sum(exp_x, dim=-1, keepdim=True)
    probs = exp_x / sum_exp_x
    return probs

تابع Softmax یک تنسور ورودی n بعدی را می گیرد و فرمول زیر را برای هر عنصر اعمال می کند:

prob = exp(x - max(x)) / sum(exp(x - max(x)))

این فرمول تضمین می کند که خروجی تابع Softmax یک توزیع احتمال است که مجموع همه احتمالات 1 است.

عبارت های max_x و sum_exp_x برای جلوگیری از خطاهای سرریز استفاده می شوند که می توانند رخ دهند زمانی که تنسور ورودی حاوی مقادیر بسیار بزرگ است. پرچم keepdim=True تضمین می کند که تنسور خروجی دارای همان شکل تنسور ورودی است.

در ضمن شما به تابع argmax هم نیاز دارید.در زیر پیاده سازی هر دو تابع را به صورت جنریک قرار دادم.

#include <algorithm>
#include <vector>

// Function to compute the argmax of a given input vector
template <typename T>
size_t argmax(const std::vector<T>& input) {
    return std::distance(input.begin(), std::max_element(input.begin(), input.end()));
}

// Function to compute the softmax of a given input vector
template <typename T>
void softmax(std::vector<T>& input) {
    T rowmax = *std::max_element(input.begin(), input.end());
    T sum = 0;
    for (auto& val : input) {
        val = std::exp(val - rowmax);
        sum += val;
    }
    for (auto& val : input) {
        val /= sum;
    }
}

 

 

پاسخ داده شده مرداد 15, 1402 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
ویرایش شده مرداد 30, 1402 بوسیله ی مصطفی ساتکی
+1 امتیاز

پیاده سازیش در پایتون :

def softmax(x):
    """Compute the softmax of vector x."""
    exp_x = np.exp(x - np.max(x))
    return exp_x / np.sum(exp_x)

 

پاسخ داده شده مرداد 16, 1402 بوسیله ی عباس مولایی (امتیاز 2,754)   1 5 13
...