在嵌入式设备上运行神经网络推理时,由于硬件资源有限,通常需要将浮点参数压缩为低比特整数表示,以减少存储开销和加速计算。 本题要求你实现一种对称INT8量化方案,分别对激活矩阵 A 和参数矩阵 B 进行量化,然后在整数域完成矩阵乘法,最后还原为浮点结果并输出。 具体规则如下: 1. 原始矩阵 激活矩阵 A 的维度为 M*K,其中每一行代表一个样本向量。参数矩阵 B 的维度为 K*N,其中每一列代表一个输出通道。 2. 量化过程 (1) 对激活矩阵 A 按行量化(per-sample) 对第 i 行,先计算缩放因子: 再对每个元素量化: (2) 对参数矩阵 B 按列量化(per-channel) 对第 j 列,先计算缩放因子: 再对每个元素量化: 注意: round 采用 Python round() 的逻辑,即银行家舍入(四舍六入五取偶)。 非 0.5 的情况遵循常规四舍五入;恰好 0.5 时舍入到最接近的偶数。 - clip(x, -127, 127) 将 x 限制在 [-127, 127] 范围内。 3. 量化矩阵乘法 先在整数域计算乘积(结果为INT32): 然后乘以对应的缩放因子还原为浮点数:
输入描述:
从标准输入读取,依次给出矩阵 A 和矩阵 B。对于每个矩阵,第一行为两个整数表示行数和列数,随后若干行为矩阵元素(浮点数),同一行内元素以空格分隔。
输出描述:
输出还原后的浮点结果矩阵,每个元素四舍五入保留两位小数(建议使用 Python 的 format(num, '.2f') 处理)。同一行内元素以单个空格分隔,行首行尾不要有多余空格。
示例1
输入
1 3
2.0 -1.0 3.0
3 1
1.0
-2.0
0.5
说明
激活矩阵 A 为 1*3 矩阵 [2.0, -1.0, 3.0],参数矩阵 B 为 3*1 矩阵 [[1.0], [-2.0], [0.5]]。
对 A 按行量化:该行绝对值最大为 3.0,缩放因子 s_A = 3.0/127。量化后 Q_A = [round(84.67), round(-42.33), round(127.0)] = [85, -42, 127]。
对 B 按列量化:该列绝对值最大为 2.0,缩放因子 s_B = 2.0/127。量化后 Q_B = [round(63.5), round(-127.0), round(31.75)] = [64, -127, 32]。注意 round(63.5) = 64(银行家舍入,取偶数)。
整数域乘法:Y_int32 = 85*64 + (-42)*(-127) + 127*32 = 5440 + 5334 + 4064 = 14838。
还原:Y_fp32 = 14838 * (3.0/127) * (2.0/127) = 5.52(四舍五入到两位小数)。
示例2
输入
3 2
10.0 -5.0
0.0 8.0
-3.0 -3.0
2 2
4.0 -6.0
2.0 7.0
输出
29.84 -95.35
16.13 56.00
-18.05 -2.98
说明
A 有3个样本向量,B 有2个输出通道。对 A 逐行、对 B 逐列分别计算缩放因子和量化值,在整数域完成矩阵乘法后,乘以对应的行缩放因子和列缩放因子还原为浮点数。
备注:
本题由牛友@Charles 整理上传
加载中...