假设某公司有4个工厂,每个工厂都有3种产品,销量数据如下:
工厂 | P1 | P2 | P3 |
---|---|---|---|
甲 | 5 | 2 | 4 |
乙 | 3 | 8 | 2 |
丙 | 6 | 0 | 4 |
丁 | 0 | 1 | 6 |
每种产品的成本利润如下:
产品 | 成本 | 利润 |
---|---|---|
P1 | 2 | 4 |
P2 | 1 | 3 |
P3 | 3 | 2 |
则这个公司各个工厂的总成本和总利润为:
甲:成本=5x2+2x1+4x3=24 利润=5x4+2x3+4x2=34
乙:成本=3x2+8x1+2x3=20 利润=3x4+8x3+2x2=40
丙:成本=6x2+0x1+4x3=24 利润=6x4+0x3+4x2=32
丁:成本=0x2+1x1+6x3=19 利润=0x4+1x3+6x2=15
工厂产品销量、产品成本利润,分别可以用两个矩阵表示,矩阵相乘即为工厂的总成本和总利润
Numpy 中的矩阵相乘函数
import numpy as np
A = np.array([[5,2,4], [3,8,2], [6,0,4], [0,1,6]])
array([[5, 2, 4],
[3, 8, 2],
[6, 0, 4],
[0, 1, 6]])
B = np.array([[2,4], [1,3], [3,2]])
array([[2, 4],
[1, 3],
[3, 2]])
C = np.matmul(A, B)
array([[24, 34],
[20, 40],
[24, 32],
[19, 15]])
深度学习框架 TensorFlow 和 PyTorch 中的矩阵相乘函数如下
import tensorflow as tf
C = tf.matmul(A, B)
[[24 34]
[20 40]
[24 32]
[19 15]]
import torch
A = torch.from_numpy(A)
B = torch.from_numpy(B)
C = torch.matmul(A, B) # 或者 torch.mm(A, B)
tensor([[24, 34],
[20, 40],
[24, 32],
[19, 15]])
矩阵A的形状是 [4, 3]
矩阵B的形状是 [3, 2]
矩阵C的形状是 [4, 2]
发现什么了吗?
在进行深度学习计算时,有时候需要注意下矩阵维度是否正确,否则就报错了
a = np.array([1,2,3])
array([1, 2, 3])
b = a.reshape(-1,1)
array([[1],
[2],
[3]])
# numpy
np.matmul(a, b)
array([14])
# tensorflow
sess.run(tf.matmul(a, b))
ValueError: Shape must be rank 2 but is rank 1 for 'MatMul_14' (op: 'MatMul') with input shapes: [3], [3,1].
# 报错: 张量应该是2阶,但是其中一个为1阶
# pytorch
torch.matmul(torch.from_numpy(a), torch.from_numpy(b))
tensor([14]) # 正常输出
torch.mm(torch.from_numpy(a), torch.from_numpy(b))
RuntimeError: matrices expected, got 1D, 2D tensors at /Users/administrator/nightlies/pytorch-1.0.0/wheel_build_dirs/wheel_3.5/pytorch/aten/src/TH/generic/THTensorMath.cpp:935
# 报错: a张量是1D(1维),b张量是2D(2维),无法进行计算
# 修正
a = a.reshape(-1, 3)