算法工程师修仙之路:Python深度学习(五)

深度学习基础

神经网络的数学基础


神经网络的数据表示

  • 数据存储在多维 Numpy 数组中,也叫张量(tensor)。一般来说,当前所有机器学习系统都使用张量作为基本数据结构。

  • 张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。矩阵是二维张量,张量是矩阵向任意维度的推广,张量的维度(dimension)通常叫作轴(axis)。

标量(0D 张量)

  • 仅包含一个数字的张量叫作标量(scalar,也叫标量张量、零维张量、0D 张量)。

  • 在 Numpy中,一个 float32 或 float64 的数字就是一个标量张量(或标量数组)。

  • 你可以用 ndim 属性来查看一个 Numpy 张量的轴的个数,标量张量有0个轴(ndim == 0),张量轴的个数也叫作阶(rank)。

    >>> import numpy as np
    >>> x = np.array(12)
    >>> x
    array(12)
    >>> x.ndim
    0
    

向量(1D 张量)

  • 数字组成的数组叫作向量(vector)或一维张量(1D 张量),一维张量只有一个轴。

    >>> x = np.array([12, 3, 6, 14, 7])
    >>> x
    array([12, 3, 6, 14, 7])
    >>> x.ndim
    1
    
    • 这个向量有 5 个元素,所以被称为 5D 向量
    • 5D 向量只有一个轴,沿着轴有5个维度,而 5D 张量有5个轴(沿着每个轴可能有任意个维度);
    • 维度(dimensionality)可以表示沿着某个轴上的元素个数(比如 5D 向量),也可以表示张量中轴的个数(比如 5D 张量)。 对于后一种情况,技术上更准确的说法是 5 阶张量(张量的阶数即轴的个数),但 5D 张量这种模糊的写法更常见。

矩阵(2D 张量)

  • 向量组成的数组叫作矩阵(matrix)或二维张量( 2D 张量),矩阵有2个轴(通常叫作行和列)。

    >>> x = np.array([[5, 78, 2, 34, 0],
    				  [6, 79, 3, 35, 1],
    				  [7, 80, 4, 36, 2]])
    >>> x.ndim
    2
    
    • 第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column);
    • [5, 78, 2, 34, 0] 是 x 的第一行, [5, 6, 7] 是第一列。

3D 张量与更高维张量

  • 将多个矩阵组合成一个新的数组,可以得到一个 3D 张量。

    >>> x = np.array([[[5, 78, 2, 34, 0],
    				   [6, 79, 3, 35, 1],
    				   [7, 80, 4, 36, 2]],
    				  [[5, 78, 2, 34, 0],
    				   [6, 79, 3, 35, 1],
    				   [7, 80, 4, 36, 2]],
    				  [[5, 78, 2, 34, 0],
    				   [6, 79, 3, 35, 1],
    				   [7, 80, 4, 36, 2]]])
    >>> x.ndim
    3
    
  • 将多个 3D 张量组合成一个数组,可以创建一个 4D 张量,以此类推。深度学习处理的一般是 0D 到 4D 的张量,但处理视频数据时可能会遇到 5D 张量。

关键属性

  • 张量是由以下三个关键属性来定义的:

    • 轴的个数(阶)
      • 例如,3D 张量有3个轴,矩阵有2个轴。
      • 这在 Numpy 等 Python 库中也叫张量的 ndim。
    • 形状
      • 这是一个整数元组,表示张量沿每个轴的维度大小(元素个数)。
      • 例如,矩阵示例的形状为 (3, 5), 3D 张量示例的形状为 (3, 3, 5)。
      • 向量的形状只包含一个元素,比如 (5, ),而标量的形状为空,即 ()。
    • 数据类型
      • 在 Python 库中通常叫作 dtype。
      • 这是张量中所包含数据的类型。
      • 例如,张量的类型可以是 float32、 uint8、 float64 等。
      • 在极少数情况下,你可能会遇到字符(char)张量。
      • Numpy(以及大多数其他库)中不存在字符串张量,因为张量存储在预先分配的连续内存段中,而字符串的长度是可变的,无法用这种方式存储。
  • 为了具体说明,使用 MNIST 例子中处理的数据。

    • 首先加载 MNIST 数据集:

      from keras.datasets import mnist
      (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
      
    • 接下来,我们给出张量 train_images 的轴的个数,即 ndim 属性:

      >>> print(train_images.ndim)
      3
      
    • 下面是它的形状:

      >>> print(train_images.shape)
      (60000, 28, 28)
      
    • 下面是它的数据类型,即 dtype 属性:

      >>> print(train_images.dtype)
      uint8
      
    • 所以,这里 train_images 是一个由8位整数组成的 3D 张量。更确切地说,它是60000个矩阵组成的数组,每个矩阵由28×28个整数组成。每个这样的矩阵都是一张灰度图像,元素取值范围为0~255。

    • 我们用 Matplotlib 库来显示这个 3D 张量中的第4个数字(数据集中的第4个样本):
      在这里插入图片描述

      # 显示第 4 个数字
      digit = train_images[4]
      
      import matplotlib.pyplot as plt
      plt.imshow(digit, cmap=plt.cm.binary)
      plt.show()
      

猜你喜欢

转载自blog.csdn.net/faker1895/article/details/87516219
今日推荐