龙空技术网

softmax函数矩阵计算的实现-为什么使用矩阵转置的方式

壹剑仙 32

前言:

此刻咱们对“矩阵转置计算公式”大约比较关怀,我们都想要分析一些“矩阵转置计算公式”的相关文章。那么小编在网摘上网罗了一些有关“矩阵转置计算公式””的相关文章,希望大家能喜欢,看官们快快来学习一下吧!

在了解清楚softmax函数的功能以及数学表达式的前提下,使用python对softmax函数实现如下:

def softmax(x):    if x.ndim == 2:        x = x.T        # np.max(x, axis=0) 获取每列的最大值        x = x - np.max(x, axis=0)        # np.sum(np.exp(x), axis=0) 计算每一列的和        y = np.exp(x) / np.sum(np.exp(x), axis=0)        return y.T     x = x - np.max(x)  # 溢出对策    return np.exp(x) / np.sum(np.exp(x))

当你读到这里的时候,如果你此时没弄清楚为什么要使用装置的方式来实现,本文后面的叙述可以解答你的困扰。

一般人实现softmax函数可能会写出如下代码:

def softmax(x):    x = x - np.max(x)  # 溢出处理    return np.exp(x) / np.sum(np.exp(x))

上面的代码只适合当x是一维的时候,当数据是二维或者其它的时候,更本不能实现。

然后你针对上面的问题,可能写出如下代码:

def s1(x):    y = x - np.max(x, axis=1)    return np.exp(y)/np.sum(np.exp(y), axis=1)

但这样的实现是错误的,更本不能正常运行。接下来解释原因:

if x.ndim == 2:    x = x.T    # np.max(x, axis=0) 获取每列的最大值    x = x - np.max(x, axis=0)    # np.sum(np.exp(x), axis=0) 计算每一列的和    y = np.exp(x) / np.sum(np.exp(x), axis=0)    return y.T       # 为什么这里要这样实现? 使用转置的方式   # 假设不用转置的方式实现,输入数据为n行m列的矩阵   # 对每一行进行溢出处理,需要使用如下方法   # max = np.max(x, axis=1)   # c = x - max,表示对x的每一行减去行最大值   # 此时 x 的形状为n行m列,max的形状为n个元素的一维   # 所以 x - max 不能进行运算      # 使用如上转置方式,同样分析   # x 为n行m列, 则y 为m行n列   # 此时再求 max = np.max(y, axis=0) 就要按照列求最大值   # 因为此时一列才是原来的一个样本数据   # 此时max 的形状为有n个元素的一维   # y - max 可以计算   # 最后结果转置即为原来的结果  

标签: #矩阵转置计算公式