Yukyukuon / blog

博客的文章
1 stars 0 forks source link

Deep Learning with Python 2 #15

Open Yukyukuon opened 3 years ago

Yukyukuon commented 3 years ago

开始记录视频P7,书2.2节。。。

Tensors (张量)

Tensors

张量的维度(dimension)通常叫作(axis)
可以用 ndim 属性来查看一个 Numpy 张量的轴的个数

Scalars (0D tensors) :标量,纯量
Vector (1D tensors) :向量
Matrices (2D tensors) :矩阵
3D tensors and higher-dimensional:

##四维张量的例子
import numpy as np
x = np.random.randint(30, size=(3, 2, 2, 4))  ##第一个30为生成0-30的随机乱数
x.ndim  ##直接显示维度
x.shap
x
```Python ##显示训练图片 digit = train_images[4] import matplotlib.pyplot as plt plt.imshow(digit, cmap = plt.cm.binary) plt.show() ``` #### 张量的三个关键属性key attributes - 轴的个数(阶): ndim - 形状:表示张量沿每个轴的维度大小(元素个数)Shape - 数据类型:dtype ```Python from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.load_data() print(train_images.ndim) ##查看维度 print(train_images.shap) ##查看每个维度里面是有多少分量☆ print(train_images.dtype) ##查看资料形态(什么类型储存的) ## 想查看数据的图片 digit = train_images[4] import matplotlib.pyplot as plt ##引入一个画图的程式 plt.imshow(digit, cmap=plt,cm.binary) ##用黑白二元的方式来画 plt.show() ##看图片 digit ##看灰度数据矩阵图 ``` #### 数据批量的概念 深度学习模型不会同时处理整个数据集,而是将数据拆分成小批量 ```Python ## 批量大小为128 ## ☆数据切片,这里中括号里的第一个数字是启示数据的位置,第二个数字是开始不取数据的位置 ## ☆记录数据是从编号0开始 batch = train_image[ : 128] //这里从编号 0~127,但是图片是从第1张到128张,总共 128-0=128张 batch = train_image[128 : 256] //这里是从编号 128~255,图片是从第129张到256张,总共 256-128=128张 ... batch = train_image[128*n : 128*(n+1)] ```
## Manipulating tensors in Numpy **Broadcasting (广播)** :当两个shape不同的张量进行运算时,会将维度较小的张量以复制的方式扩充得与另一个张量shape相同,再进行计算 **Tensor reshaping** :在不增减,不改变原有数据的情况下,改变原张量的形状 **np.transpose** :将矩阵转置
## Gradient Descent (梯度优化) 上一节的神经网络示例中,每个神经层都用下述方法对输入数据进行变换: **output = relu(dot(W, input) + b)** 表达式中,W和b都是张量,均为该层的属性。它们被称为该层的 **权重(Weight)** 或 **可训练参数(trainable parameter)**,分别对应 kernel 和 bias 属性。 一开始,这些权重矩阵取较小的随机值,这一步叫 **随机初始化(random initialization)**。当然,W和b都是随机的,relu(dot(W, input) + b) 肯定不会得到任何有用的表示。虽然得到的表示没有任何意义的,但这是一个起点。下一步则是根据反馈信号逐渐调节这些权重。这个逐渐调节的过程叫作**训练**,也是机器学习中的学习。 上述过程发生在一个**训练循环(Trainning loop)**内,其具体过程如下: 1. 抽取训练样本 x 和对应目标 y 组成的数据批量。 2. 在 x 上运行网络【这一步叫作 **向前传播(forward pass)**】,得到预测值 y_pred。 3. 计算网络在这批数据上的损失,用于衡量 y_pred 和 y 之间的距离。 4. 更新网络的所有权重,使网络在这批数据上的损失略微下降。 最终,使得预测值y_pred和预测目标y之间的距离非常小。 神经网络的公式: 𝜎(𝑤3𝜎(𝑤2𝜎(𝑤1𝑥+𝑏1)+𝑏2)+𝑏3)..... 梯度训练的方法: - **SGD** : 每次只丢一条数据去训练,这样就需要更新样本量集的次数 - **minibatch-SGD** : 小量梯度下降算法 - **batch-SGD** : 全量梯度下降算法 (一次性丢完所有资料) #### 牛顿法 N=1的简单情况 基本思想:在现有极小点估计值的附近对 f(x) 做二阶泰勒展开,进而找到极小点的下一个估计值 设 **xk** 为当前极小点的估计值,则 表示 f(x) 在 xk 附近的二阶泰勒展开式(略去了关于x-xk的高阶项)由于求的是最值,由极值必要条件可知 从而得到 于是,给定初始值x0,则可以构造一下迭代格式 产生序列 {xk} 来逼近 f(x) 的极小点,在一定条件下,{xk} 可以收敛到 f(x) 的极小点。 **Rmsprop考虑梯度,Adam是加了加速度这个动量来求解梯度的** 可参考文章:An overview of gradient descent optimization algorithms