AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

深度学习入门(三):多维数组的运算

  • 2020-03-29
  • 本文字数:4023 字

    阅读完需:约 13 分钟

深度学习入门(三):多维数组的运算

编者按:本文节选自图灵程序设计丛书 《深度学习入门》一书中的部分章节。


如果掌握了 NumPy 多维数组的运算,就可以高效地实现神经网络。因此,本节将介绍 NumPy 多维数组的运算,然后再进行神经网络的实现。

多维数组

简单地讲,多维数组就是“数字的集合”,数字排成一列的集合、排成长方形的集合、排成三维状或者(更加一般化的) 维状的集合都称为多维数组。下面我们就用 NumPy 来生成多维数组,先从前面介绍过的一维数组开始。


>>> <b>import numpy as np</b>>>> <b>A = np.array([1, 2, 3, 4])</b>>>> <b>print(A)</b>[1 2 3 4]>>> <b>np.ndim(A)</b>1>>> <b>A.shape</b>## 4,>>> <b>A.shape[0]</b>4
复制代码


如上所示,数组的维数可以通过 np.dim() 函数获得。此外,数组的形状可以通过实例变量 shape 获得。在上面的例子中,A 是一维数组,由 4 个元素构成。注意,这里的 A.shape 的结果是个元组(tuple)。这是因为一维数组的情况下也要返回和多维数组的情况下一致的结果。例如,二维数组时返回的是元组 (4,3),三维数组时返回的是元组 (4,3,2),因此一维数组时也同样以元组的形式返回结果。下面我们来生成一个二维数组。



>>> <b>B = np.array([[1,2], [3,4], [5,6]])</b>>>> <b>print(B)</b>[[1 2] [3 4] [5 6]]>>> <b>np.ndim(B)</b>2>>> <b>B.shape</b>## 3, 2
复制代码


这里生成了一个 3 × 2 的数组 B。3 × 2 的数组表示第一个维度有 3 个元素,第二个维度有 2 个元素。另外,第一个维度对应第 0 维,第二个维度对应第 1 维(Python 的索引从 0 开始)。二维数组也称为 矩阵 (matrix)。如图 1 所示,数组的横向排列称为 (row),纵向排列称为 (column)。



图 1 横向排列称为行,纵向排列称为列

矩阵乘法

下面,我们来介绍矩阵(二维数组)的乘积。比如 2 × 2 的矩阵,其乘积可以像图 2 这样进行计算(按图中顺序进行计算是规定好了的)。



图 2 矩阵的乘积的计算方法


如本例所示,矩阵的乘积是通过左边矩阵的行(横向)和右边矩阵的列(纵向)以对应元素的方式相乘后再求和而得到的。并且,运算的结果保存为新的多维数组的元素。比如, 的第 1 行和 的第 1 列的乘积结果是新数组的第 1 行第 1 列的元素, 的第 2 行和 的第 1 列的结果是新数组的第 2 行第 1 列的元素。另外,在本书的数学标记中,矩阵将用黑斜体表示(比如,矩阵 ),以区别于单个元素的标量(比如,)。这个运算在 Python 中可以用如下代码实现。



>>> <b>A = np.array([[1,2], [3,4]])</b>>>> <b>A.shape</b>## 2, 2>>> <b>B = np.array([[5,6], [7,8]])</b>>>> <b>B.shape</b>## 2, 2>>> <b>np.dot(A, B)</b>array([[19, 22], [43, 50]])
复制代码


这里, 都是 2 × 2 的矩阵,它们的乘积可以通过 NumPy 的 np.dot() 函数计算(乘积也称为点积)。np.dot() 接收两个 NumPy 数组作为参数,并返回数组的乘积。这里要注意的是,np.dot(A, B)np.dot(B, A) 的值可能不一样。和一般的运算(+* 等)不同,矩阵的乘积运算中,操作数(AB)的顺序不同,结果也会不同。


这里介绍的是计算 2 × 2 形状的矩阵的乘积的例子,其他形状的矩阵的乘积也可以用相同的方法来计算。比如,2 × 3 的矩阵和 3 × 2 的矩阵的乘积可按如下形式用 Python 来实现。



>>> <b>A = np.array([[1,2,3], [4,5,6]])</b>>>> <b>A.shape</b>## 2, 3>>> <b>B = np.array([[1,2], [3,4], [5,6]])</b>>>> <b>B.shape</b>## 3, 2>>> <b>np.dot(A, B)</b>array([[22, 28], [49, 64]])
复制代码


2 × 3 的矩阵 和 3 × 2 的矩阵 的乘积可按以上方式实现。这里需要注意的是矩阵的形状(shape)。具体地讲,矩阵 的第 1 维的元素个数(列数)必须和矩阵 的第 0 维的元素个数(行数)相等。在上面的例子中,矩阵 的形状是 2 × 3,矩阵 的形状是 3 × 2,矩阵 的第 1 维的元素个数(3)和矩阵 的第 0 维的元素个数(3)相等。如果这两个值不相等,则无法计算矩阵的乘积。比如,如果用 Python 计算 2 × 3 的矩阵 和 2 × 2 的矩阵 的乘积,则会输出如下错误。



>>> <b>C = np.array([[1,2], [3,4]])</b>>>> <b>C.shape</b>## 2, 2>>> <b>A.shape</b>## 2, 3>>> <b>np.dot(A, C)</b>Traceback (most recent call last): File "<stdin>", line 1, in <module>ValueError: shapes (2,3) and (2,2) not aligned: 3 (dim 1) != 2 (dim 0)
复制代码


这个错误的意思是,矩阵 的第 1 维和矩阵 的第 0 维的元素个数不一致(维度的索引从 0 开始)。也就是说,在多维数组的乘积运算中,必须使两个矩阵中的对应维度的元素个数一致,这一点很重要。我们通过图 3 再来确认一下。



图 3 在矩阵的乘积运算中,对应维度的元素个数要保持一致


图 3 中,3 × 2 的矩阵 和 2 × 4 的矩阵 的乘积运算生成了 3 × 4 的矩阵 。如图所示,矩阵 和矩阵 的对应维度的元素个数必须保持一致。此外,还有一点很重要,就是运算结果的矩阵 的形状是由矩阵 的行数和矩阵 的列数构成的。


另外,当 是二维矩阵、 是一维数组时,如图 4 所示,对应维度的元素个数要保持一致的原则依然成立。


可按如下方式用 Python 实现图 4 的例子。



>>> <b>A = np.array([[1,2], [3, 4], [5,6]])</b>>>> <b>A.shape</b>## 3, 2>>> <b>B = np.array([7,8])</b>>>> <b>B.shape</b>## 2,>>> np.dot(A, B)array([23, 53, 83])
复制代码



图 4  是二维矩阵、 是一维数组时,也要保持对应维度的元素个数一致

神经网络的内积

下面我们使用 NumPy 矩阵来实现神经网络。这里我们以图 5 中的简单神经网络为对象。这个神经网络省略了偏置和激活函数,只有权重。



图 5 通过矩阵的乘积进行神经网络的运算


实现该神经网络时,要注意 的形状,特别是 的对应维度的元素个数是否一致,这一点很重要。



>>> <b>X = np.array([1, 2])</b>>>> <b>X.shape</b>## 2,>>> <b>W = np.array([[1, 3, 5], [2, 4, 6]])</b>>>> <b>print(W)</b>[[1 3 5] [2 4 6]]>>> <b>W.shape</b>## 2, 3>>> <b>Y = np.dot(X, W)</b>>>> <b>print(Y)</b>[ 5 11 17]
复制代码


如上所示,使用 np.dot(多维数组的点积),可以一次性计算出 的结果。这意味着,即便 的元素个数为 1001000,也可以通过一次运算就计算出结果!如果不使用 np.dot,就必须单独计算 的每一个元素(或者说必须使用 for 语句),非常麻烦。因此,通过矩阵的乘积一次性完成计算的技巧,在实现的层面上可以说是非常重要的。


图书简介https://www.ituring.com.cn/book/1921



相关阅读


深度学习入门(一):神经网络


深度学习入门(二):激活函数


2020-03-29 19:251774

评论

发布
暂无评论
发现更多内容

可能是第十好的Android 开源 日历 Calendar 仿小米,安卓移动开发实验报告

android 程序员 移动开发

响应式编程在Android 中的一些探索,android三种开发模式

android 程序员 移动开发

回忆2020年的美团Android岗的面试之旅,这面试官太会问了

android 程序员 移动开发

哔哩哔哩我来了,see goodbye 马总!(1),安卓内存优化管理器

android 程序员 移动开发

四月字节客户端面经,七月内推请找我,kotlin类型转换

android 程序员 移动开发

回眸重探锁机制,高级android工程师

android 程序员 移动开发

只需5分钟看完这篇-HTTPS,去阿里面试和面试官扯皮就没问题了!

android 程序员 移动开发

吃死这份333页的Android-性能优化PDF宝典,三大核心内容,我把阿里面试官给怼回去了

android 程序员 移动开发

后端转-Android-我该从何处下手,现在学习-android-晚吗?

android 程序员 移动开发

命令模式,腾讯后台开发

android 程序员 移动开发

四年Android,终于咸鱼翻身!8K到25K全靠这份高级面试题

android 程序员 移动开发

2021 年美东地区 IoT 公司的一次失败面试

HoneyMoose

linux之我常用的20条命令(之一)

入门小站

Linux

同事逆袭面进阿里P7-年薪60W+,临别留下一张Android开发重点技术路线图---(1)

android 程序员 移动开发

哔哩哔哩我来了,see goodbye 马总!,app架构图

android 程序员 移动开发

同事逆袭面进阿里P7-年薪60W+,临别留下一张Android开发重点技术路线图---

android 程序员 移动开发

吊打安卓?鸿蒙OS 2,android面试2020

android 程序员 移动开发

文本重复工具

入门小站

工具

四年Android面试遇到的问题整理,Android培训那里好

android 程序员 移动开发

回眸重探锁机制(1),零基础android

android 程序员 移动开发

双非渣本小Android四年磨一剑,秋招大厂(字节,嵌入式音视频方向

android 程序员 移动开发

发现不一样的Kotlin多方位处理协程的异常,2021国内知名大厂Android岗面经

android 程序员 移动开发

史上最详Android版kotlin协程入门进阶实战(四),架构师必备

android 程序员 移动开发

号外!号外!全网第一手Android P刘海屏适配大揭秘,android屏幕适配终极解决方案

android 程序员 移动开发

可怕!RxHttp2,95%Android开发者已收藏的十大开源库

android 程序员 移动开发

吃一堑长一智,作为程序员的我们记住这几点,三级缓存框架问题你都了解了吗

android 程序员 移动开发

发现不一样的Kotlin多方位处理协程的异常(1),音视频时代你还不会NDK开发

android 程序员 移动开发

只要进程我复活的足够快,系统它就杀不死我!Android最强保活黑科技的最强技术实现

android 程序员 移动开发

史上最详Android版kotlin协程入门进阶实战(一),androidwifi开发教程下载

android 程序员 移动开发

回忆一次美团Android校招,居然被算法给难到了!(1),给2021的Android一些建议

android 程序员 移动开发

一次比较奇葩的 AWS 面试

HoneyMoose

深度学习入门(三):多维数组的运算_AI&大模型_斋藤康毅_InfoQ精选文章