1. 神经网络与深度学习基础:从理论到实践
在深度学习领域,理解基础概念和掌握实际应用同样重要。作为一名从业多年的AI工程师,我经常遇到初学者在矩阵运算和模型构建上的困惑。本文将从一个典型的神经网络练习题出发,逐步深入到完整的图像分类项目实现,分享我在实际工作中的经验和技巧。
1.1 矩阵运算的两种形式:理论vs实践
在吴恩达深度学习课程的第二周测验中,有一道关于矩阵乘法的题目特别值得关注:
python复制a = np.random.randn(3, 3)
b = np.random.randn(3, 1)
c = a * b
很多学习者会困惑c的维度是多少。按照线性代数知识,矩阵乘法要求前者的列数等于后者的行数,但实际运行结果却与预期不同。这揭示了Python中矩阵运算的两种重要形式:
- Hadamard积(逐元素积):使用
*运算符 - 内积(矩阵乘法):使用
@运算符
让我们通过实际代码演示这两种运算的区别:
python复制import numpy as np
a = np.array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
b = np.array([[1],
[2],
[3]])
# Hadamard积
c_hadamard = a * b
print("Hadamard积结果:\n", c_hadamard)
print("维度:", c_hadamard.shape)
# 矩阵乘法
c_dot = a @ b
print("\n矩阵乘法结果:\n", c_dot)
print("维度:", c_dot.shape)
关键区别:
- Hadamard积要求两个矩阵形状相同或可广播,结果保持原维度
- 矩阵乘法遵循线性代数规则,会改变输出维度
实际经验:在深度学习框架中,这两种运算都很常见。卷积层常使用Hadamard积,而全连接层使用矩阵乘法。理解这个区别可以避免很多维度不匹配的错误。
1.2 广播机制详解
Python的广播机制是让Hadamard积能够工作的关键。当两个数组形状不同时,NumPy会自动将较小的数组"广播"到较大数组的形状。具体到上面的例子:
- 原始形状:a是(3,3),b是(3,1)
- 广播后:b沿第二维复制,变为(3,3)
- 最终按元素相乘
广播遵循严格的规则:
- 从最后一个维度开始比较
- 维度大小相等或其中一个为1
- 缺失的维度被视为1
实际应用技巧:
- 使用
np.broadcast_to()可以显式查看广播结果 - 调试维度问题时,先打印各变量的shape
- 在自定义层时,要特别注意广播可能带来的意外行为
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
