大家好,又见面了,我是你们的朋友全栈君。
Python实现softmax函数 :
PS:为了避免求exp(x)出现溢出的情况,一般需要减去最大值。
# -*-coding: utf-8 -*-
import tensorflow as tf
import numpy as np
def softmax(x, axis=1):
# 计算每行的最大值
row_max = x.max(axis=axis)
# 每行元素都需要减去对应的最大值,否则求exp(x)会溢出,导致inf情况
row_max=row_max.reshape(-1, 1)
x = x - row_max
# 计算e的指数次幂
x_exp = np.exp(x)
x_sum = np.sum(x_exp, axis=axis, keepdims=True)
s = x_exp / x_sum
return s
A = [[1, 1, 5, 3],
[0.2, 0.2, 0.5, 0.1]]
A= np.array(A)
axis = 1 # 默认计算最后一维
# [1]使用自定义softmax
s1 = softmax(A, axis=axis)
print("s1:{}".format(s1))
#[2]使用TF的softmax
with tf.Session() as sess:
tf_s2=tf.nn.softmax(A, axis=axis)
s2=sess.run(tf_s2)
print("s2:{}".format(s2))
C++实现Softmax函数
template<typename _Tp>
int softmax(const _Tp* src, _Tp* dst, int length)
{
// double max = 0.0;
// double sum = 0.0;
//
// for (int i = 0; i<k; i++) if (max < x[i]) max = x[i];
// for (int i = 0; i<k; i++) {
// x[i] = exp(x[i] - max);
// sum += x[i];
// }
// for (int i = 0; i<k; i++) x[i] /= sum;
//为了避免溢出,需要减去最大值
const _Tp max_value = *std::max_element(src, src + length);
_Tp denominator{ 0 };
for (int i = 0; i < length; ++i) {
dst[i] = std::exp(src[i] - max_value);
denominator += dst[i];
}
for (int i = 0; i < length; ++i) {
dst[i] /= denominator;
}
return 0;
}
std::vector<float> output_vector;
std::vector<float> preds;
softmax(output_vector.data(), preds.data(),output_vector.size());
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129556.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...