《Python深度学习》第二章读书笔记

Posted Paul-Huang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Python深度学习》第二章读书笔记相关的知识,希望对你有一定的参考价值。

2. 神经网络的数学基础

2.1. 初试神经网络

  • MNIST 数据集
    包含60 000 张训练图像和10 000 张测试图像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即MNIST 中的NIST)在20 世纪80 年代收集得到黑白图像。

  • 类和标签
    在机器学习中,分类问题中的某个类别叫作类(class)。数据点叫作样本(sample)。某
    个样本对应的类叫作标签(label)。

from keras.datasets import mnist
from keras import models
from keras import layers
from tensorflow.keras.utils import to_categorical 
# 由于版本原因,这个地方很容易报错,需要加上tensorflow.
import numpy as np

def load_data():
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
 
    train_images = train_images.reshape((60000, 28 * 28))
    train_images = train_images.astype(np.float32) / 255
 
    test_images = test_images.reshape((10000, 28 * 28))
    test_images = test_images.astype(np.float32) / 255
 
    train_labels = to_categorical(train_labels)
 
    test_labels = to_categorical(test_labels)
 
    return (train_images, train_labels), (test_images, test_labels)
 
 
(x_train, y_train), (x_test, y_test) = load_data()
 
network = models.Sequential()
network.add(layers.Dense(units=512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(units=10, activation='softmax'))
 
network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
 
network.fit(x=x_train, y=y_train, batch_size=128, epochs=5)
 
test_loss, test_acc = network.evaluate(x=x_test, y=y_test)
 
print(network.summary())
print('test_acc:', test_acc)
print('test_loss:', test_loss)

2. 2 张量

2.2.1 定义

  • 张量是机器学习程序中的数字容器,本质上就是各种不同维度的数组,我们把张量的维度称为 轴 \\color{red}轴 (axis),轴的个数称为 阶 \\color{red}阶 (rank)(也就是俗称的维度,但是为了把张量的维度和每个阶的具体维度区分开,Numpy中把轴的维度叫做数组的秩)

  • 张量的形状(shape)就是 张 量 的 阶 \\color{red}张量的阶

  • 张量都可以通过Numpy来定义、操作。因此把Numpy数学函数库里面的数组用好,就可以搞定机器学习里面的数据结构。

    • 仅包含一个 数 字 的 张 量 叫 做 标 量 \\color{red}数字的张量叫做标量 (scalar),既0阶张量或0D张量。标量的功能主要在于程序流程控制、设置参数值等。
    • 由一组数字组成的数组叫做 向 量 \\color{red}向量 (vector),也就是 一 阶 张 量 \\color{red}一阶张量 ,或称1D张量。 一 阶 张 量 只 有 一 个 轴 \\color{red}一阶张量只有一个轴
    • 二 阶 张 量 有 两 个 轴 \\color{red}二阶张量有两个轴 ,例如:向量组成的矩阵。以此类推。
      Tip:
      N u m p y 中 , 不 管 是 阶 的 索 引 , 还 是 数 组 的 索 引 , 永 远 是 从 0 开 始 的 。 \\color{red}Numpy中,不管是阶的索引,还是数组的索引,永远是从0开始的。 Numpy0

2.2.2 关键属性

  1. 轴的个数(阶)。例如,3D 张量有 3 个轴,矩阵有 2 个轴。这在 Numpy 等 Python 库中
    也叫张量的 ndim
  2. 形状。这是一个整数元组,表示张量沿每个轴的维度大小(元素个数)。shape
  3. 数据类型(在 Python 库中通常叫作 dtype )。这是张量中所包含数据的类型,例如,张
    量的类型可以是 float32 、 uint8 、 float64 等。

2.2.3 张量的操作

  1. 切片
    选择张量的特定元素叫作张量切片(tensor slicing)。
  2. 数据批量
    • 深度学习中所有数据张量的第一个轴(0 轴,因为索引从 0 开始)都是样本轴(samples axis,有时也叫样本维度)。例如:
      batch = train_images[128 * n:128 * (n + 1)]
      
    第一个轴(0 轴)叫作批量轴(batch axis)或批量维度(batch dimension)
  3. 现实世界中的数据张量
    • 向量数据:2D 张量,形状为 (samples, features) 。
    • 时间序列数据或序列数据:3D 张量,形状为 (samples, timesteps, features) 。
    • 图像:4D张量,形状为 (samples, height, width, channels) 或 (samples, channels,height, width) 。
    • 视频:5D张量,形状为 (samples, frames, height, width, channels) 或 (samples,frames, channels, height, width) 。

2.2.4 张量的运算

  1. 逐元素(element-wise)的运算
  2. 广播

    如果没有歧义的话,较小的张量会被广播(broadcast),以匹配较大张量的形状。广播包含以下两步:
    (1) 向较小的张量添加轴(叫作广播轴),使其 ndim 与较大的张量相同。
    (2) 将较小的张量沿着新轴重复,使其形状与较大的张量相同。

    def naive_add_matrix_and_vector(x, y):
    	assert len(x.shape) == 2
    	assert len(y.shape) == 1
    	assert x.shape[1] == y.shape[0]
    	x = x.copy()
    	for i in range(x.shape[0]):
    		for j in range(x.shape[1]):
    			x[i, j] += y[j]
    	return x
    
  3. 张量点积
  4. 张量变形
    • reshape,转置用transpose()

2.2.5 深度学习的几何解释

前面讲过,神经网络完全由一系列张量运算组成,而这些张量运算都只是输入数据的几何变换。因此,你可以将神经网络解释为高维空间中非常复杂的几何变换,这种变换可以通过许多简单的步骤来实现。
对于三维的情况,下面这个思维图像是很有用的。想象有两张彩纸:一张红色,一张蓝色。

将其中一张纸放在另一张上。现在将两张纸一起揉成小球。这个皱巴巴的纸球就是你的输入数据,每张纸对应于分类问题中的一个类别。神经网络(或者任何机器学习模型)要做的就是找到可以让纸球恢复平整的变换,从而能够再次让两个类别明确可分。通过深度学习,这一过程可以用三维空间中一系列简单的变换来实现,比如你用手指对纸球做的变换,每次做一个动作,如图2-9 所示。
在这里插入图片描述

2.3 神经网络的“引擎”:基于梯度的优化

  1. 随机梯度下降法
    (1) 抽取训练样本 x 和对应目标 y 组成的数据批量。
    (2) 在 x 上运行网络,得到预测值 y_pred
    (3) 计算网络在这批数据上的损失,用于衡量 y_predy 之间的距离。
    (4) 计算损失相对于网络参数的梯度[一次反向传播(backward pass)]。
    (5) 将参数沿着梯度的反方向移动一点,比如 W -= step * gradient ,从而使这批数据上的损失减小一点。

以上是关于《Python深度学习》第二章读书笔记的主要内容,如果未能解决你的问题,请参考以下文章

《Python深度学习》第一章读书笔记

Python深度学习:Python数据处理及可视化(读书笔记)

《Python深度学习》第五章-6(可视化类激活图)读书笔记

《Python深度学习》第五章-1(CNN简介)读书笔记

读书笔记2|深度学习入门——基于python的理论与实现

读书笔记2|深度学习入门——基于python的理论与实现