【keras入门】神经网络的数据表示

一、神经网络的数据表示

       数据存储在多维 Numpy数组中,也叫张量tensor。一般来说,当前所 有机器学习系统都使用张量作为基本数据结构。张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它 是数字的容器。你可能对矩阵很熟悉,它是二维张量。张量是矩阵向任意维度的推广[注意,张量的维度(dimension)通常叫作轴(axis)]。

1.标量(0D张量)

       仅包含一个数字的张量叫作标量scalar,也叫标量张量、零维张量、0D 张量)。在 Numpy 中,一个 float32 float64 的数字就是一个标量张量(或标量数组)。可以用 ndim 属性来查看一个 Numpy 张量的轴的个数。标量张量有 0 个轴(ndim == 0)。张量轴的个数也叫作 阶(rank)。下面是一个 Numpy 标量

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

2.向量(1D张量)

       数字组成的数组叫作向量(vector一维张量(1D 张量)。一维张量只有一个轴。下面是 一个 Numpy 向量。

>>> x = np.array([12, 3, 6, 14, 7])
>>> x
array([12, 3, 6, 14, 7])
>>> x.ndim
1

这个向量有 5 个元素,所以被称为 5D 向量。但不要把 5D向量和 5D张量弄混! 5D 向量只 有一个轴,沿着轴有 5 个维度,而 5D 张量有 5 个轴(沿着每个轴可能有任意个维度)。维度 (dimensionality)可以表示沿着某个轴上的元素个数(比如 5D 向量),也可以表示张量中轴的个数(比如 5D 张量)

3.矩阵(2D张量)

       向量组成的数组叫作矩阵matrix二维张量(2D 张量)。矩阵有 2 个轴(通常叫作和 列)。你可以将矩阵直观地理解为数字组成的矩形网格。下面是一个 Numpy 矩阵。

>>> x = np.array([[5, 78, 2, 34, 0],
 [6, 79, 3, 35, 1],
 [7, 80, 4, 36, 2]])
>>> x.ndim
2

4.3D张量与更高维张量

       将多个矩阵组合成一个新的数组,可以得到一个 3D 张量,你可以将其直观地理解为数字 组成的立方体。下面是一个 Numpy 的 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)。这是张量中所包含数据的类型,例如,张 量的类型可以是 float32uint8float64 等。在极少数情况下,你可能会遇到字符 (char)张量。注意,Numpy(以及大多数其他库)中不存在字符串张量,因为张量存 储在预先分配的连续内存段中,而字符串的长度是可变的,无法用这种方式存储。

 

三、在Numpy中操作张量

 

       使用语法 train_images[i] 选择沿着第一个轴的特定数字。选 择张量的特定元素叫作张量切片。

选择第 10~100 个数字(这里的数字是指数据集中手写数字图片的张量表示)(不包括第 100 个),并将其放在形状为 (90, 28, 28) 的数组中。

>>> my_slice = train_images[10:100]
>>> print(my_slice.shape)
(90, 28, 28)

上面的写法等价于下面的两种写法:

给出了切片沿着每个张量轴的起始索引和结束索引。“ : ”等同于选择整个轴。

>>> my_slice = train_images[10:100, :, :] 
>>> my_slice.shape
(90, 28, 28)
>>> my_slice = train_images[10:100, 0:28, 0:28] 
>>> my_slice.shape
(90, 28, 28)

 

也可以沿着每个张量轴在任意两个索引之间进行选择。例如,你可以在所有图像的右下角选出 14 像素×14 像素的区域:

my_slice = train_images[:, 14:, 14:]

也可以使用负数索引。与 Python 列表中的负数索引类似,它表示与当前轴终点的相对位置。

你可以在图像中心裁剪出 14 像素×14 像素的区域:

my_slice = train_images[:, 7:-7, 7:-7]

 四、数据批量的概念

       深度学习模型不会同时处理整个数据集,而是将数据拆分成小批量。具体来看,下 面是 MNIST 数据集的一个批量,批量大小为 128

batch = train_images[:128]

然后是下一个批量。

batch = train_images[128:256]

 然后是第 n 个批量。

batch = train_images[128 * n:128 * (n + 1)]

对于这种批量张量,第一个轴(0 轴)叫作批量轴批量维度

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值