欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 矩阵点乘 、 基于向量运算的 softmax实现

程序员文章站 2022-07-11 17:56:28
...

 

1、关于python中矩阵点乘(除)

只允许三种情况出现:

(1)两个矩阵维度相同,则对应元素相乘

(2)矩阵乘以一个向量:

    a:  矩阵与行向量 相乘(mxn * 1*n 形式), 此时行向量长度 必须等于矩阵的列数

    b:矩阵与列向量相乘(mxn  * mx1 形式) 此时 矩阵的行数必须与列向量的行数相同

举例如下:

    a = np.array([
        [1, 2],
        [4,5],
        [7,8]
    ])
    b = np.array([2,3])
    print(a*b) #即 行向量 每个元素乘以 矩阵的对应列
    c = np.array([2,3,4])
    #print(a*c)  不可以 3X2 * 1x3

    d = np.array([
        [2],
        [3],
        [4]
    ])
    print(a*d) # 即列向量的每个元素乘以对应行
    e = [
        [2,2],
        [3,4],
        [4,4]
    ]
    print(a*e) # 即当矩阵维度相同时 对应元素相乘

 

2 、softmax向量化实现

import numpy as np

'''
    (1) softmax(x) == softmax(x+c)
'''
def soft_max(x):
    if(len(x.shape) > 1):
        exp_minmax = lambda x:np.exp(x-np.max(x))
        x = np.apply_along_axis(exp_minmax,1,x)
        denom = lambda x:1.0/np.sum(x)
        denominator = np.apply_along_axis(denom,1,x)
        if(len(denominator.shape) == 1): # 转换为 n x 1 形式的矩阵
            denominator = denominator.reshape((denominator.shape[0],1))
        x = x*denominator
    else:
        x = np.exp(x-np.max(x))
        denominator = 1.0/np.sum(x)
        x = x.dot(denominator)

    return x

 

一篇讲解交叉熵很好的文章 : https://blog.csdn.net/red_stone1/article/details/80735068

相关标签: d