张量是矩阵向任意维度的推广,是N维数组,能张能缩的变量。
张量的三个关键属性
1)维度、轴的个数、阶, ndim
2)形状, shape。
3)数据类型,dtype
通常,只有数字张量,没有字符张量,因为张量存储在预先分配的连续内存段中,而字符串的长度是可变的,无法用这种方式存储
>>> import numpy as np
>>> x = np.array(13)
>>> x
array(13)
>>> x.ndim
0
>>> x = np.array([12, 3, 6, 14, 7])
>>> x
array([12, 3, 6, 14, 7])
>>> x.ndim
1
>>> x = np.array([[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]])
>>> x.ndim
2
向量数据: 2D 张量,形状为 (samples, features)
比如,人口统计数据集,其中包括每个人的年龄、邮编和收入。每个人可以表示为包含 3 个值的向量,而整个数据集包含 100000 个人,因此可以存储在形状为 (100000, 3) 的 2D张量中
>>> 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 张量,形状为 (samples, timesteps, features)
比如,股票价格数据集,每一分钟,我们将股票的当前价格、前一分钟的最高价格、最低价格保存为一个 3D 向量,整个交易日的数据为 (390, 3) 的 2D 张量(一个交易日有 390 分钟),250 天的数据则可以保存为 (250, 390, 3) 的 3D 张量
4D 张量
形状为 (samples, height, width, channels) 或 (samples, channels, height, width)
比如,128张照片(256*256px)的彩色照片可以表示为(128, 256, 256, 3);
5D 张量
形状为 (samples, frames, height, width, channels) 或 (samples, frames, channels, height, width)
比如,一个以每秒 4 帧采样的 60 秒 YouTube 视频片段,视频尺寸为 144× 256,共有 240 帧, 4 个这样的视频片段组成的批量将保存在形状为 (4, 240, 144, 256, 3)的张量中
有哪些数据可用? 你想要预测什么? 你是否需要收集更多数据或雇人为数据集手动添加标签?
对于简单任务,可以用预测精度,但很多情况都需要与领域相关的复杂指标
训练集、验证集和测试集是必须定义的。验证集和测试集的标签不应该泄漏到训练数据中
方法是将数据转换为向量并预处理,使其更容易被神经网络所处理(数据标准化等)
它要打败基于常识的简单基准方法,从而表明机器学习能够解决你的问题。事实上并非总是如此!
仅根据模型在验证集(不是测试集或训练集)上的性能来进行更改。请记住,你应该先让模型过拟合(从而找到比你的需求更大的模型容量),然后才开始添加正则化或降低模型尺寸
超参数可能会过于针对验证集而优化。我们保留一个单独的测试集,正是为了避免这个问题!
想象有两张彩纸:一张红色,一张蓝色,将其中一张纸放在另一张上,揉成小球。这个皱巴巴的纸球就是你的输入数据,每张纸对应于分类问题中的一个类别。深度学习,就是通过一序列的的变换来一点点展开小球。
(1) 抽取训练样本 x 和对应目标y组成的数据批量
(2) 在x上运行网络,得到预测值y_pred
(3) 计算网络在这批数据上的损失,用于衡量y_pred和y之间的距离
(4) 计算损失相对于网络参数的梯度[一次反向传播(backward pass)]
(5) 将参数沿着梯度的反方向移动一点,比如 W -= step * gradient,从而使这批数据上的损失减小一点
多个层组合成网络(或模型),常用的层有:
多层组成的网络结构可分为:
用于学习的反馈信号,衡量在训练数据上的性能,在训练过程中需要将其最小化。它能够衡量当前任务是否已成功完成。
决定学习过程如何进行,决定如何基于损失函数对网络进行更新,它执行的是随机梯度下降( SGD)的某个变体。
y_pred = dot(W, x)
loss_value = loss(y_pred, y)
//如果输入数据x和y保持不变,那么这可以看作将W映射到损失值的函数
loss_value = f(W)
gradient(f)(W0)是函数f(W)在W0的导数
对于张量的函数 f(W),你可以通过将W向梯度的反方向移动来减小f(W),
比如 W1 = W0 - step * gradient(f)(W0),其中 step 是一个很小的比例因子。(注意,比例因子step是必需的,因为gradient(f)(W0) 只是W0附近曲率的近似值,不能离W0太远)于是还会有W2、W3、、直至收敛
随机梯度下降可分为
每次迭代取小批量的数据 —— 小批量SGD
每次迭代取一个数据 —— 真SGD
每一次迭代都在所有数据上运行 —— 批量SGD
SGD 还有多种变体
优化点在于计算下一次权重更新时还考虑了上一次的权重更新,比如带动量的SGD、 Adagrad、RMSProp等变体。这些变体被称为优化方法( optimization method)或优化器( optimizer)。
动量的概念源自物理学,动量解决了 SGD 的两个问题:收敛速度和局部极小点。动量方法的实现过程是每一步移动小球,不仅要考虑当前的斜率值(加速度),还要考虑当前的速度(来自于之前的加速度)。在实践中指的是,更新参数 w 不仅要考虑当前的梯度值,还要考虑上一次的梯度值
反向传播( backpropagation,有时也叫反式微分, reverse-mode differentiation)
将链式法则应用于神经网络梯度值的计算,得到的算法叫作反向传播。反向传播从最终损失值开始,从最顶层反向作用至最底层,利用链式法则计算每个参数对损失值的贡献大小
在训练和测试过程中需要监控的指标,常见的指标,比如准确率
Accuracy metrics
Probabilistic metrics
Regression metrics
Classification metrics based on True/False positives & negatives
Image segmentation metrics
Hinge metrics for "maximum-margin"ification
Keras 是一个模型级( model-level)的Python深度学习框架
keras可以方便地定义和训练几乎所有类型的深度学习模型,具有以下重要特性:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qvacvrkd-1669885429458)(…/pic/deep-learning/keras.png)]
from keras import models
from keras import layers
from keras import optimizers
# 创建方式1
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(784,)))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer=optimizers.RMSprop(lr=0.001),
loss='mse',
metrics=['accuracy'])
model.fit(input_tensor, target_tensor, batch_size=128, epochs=10)
# 创建方式2
# 下面是用函数式 API 定义的相同模型。
input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32, activation='relu')(input_tensor)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = models.Model(inputs=input_tensor, outputs=output_tensor)
Case场景 | 数据 | 数据结构(x.shape, y.shape) | 网络结构 | 优化器 | 损失函数 | 监控指标 |
---|---|---|---|---|---|---|
多分类 | MNIST手写字识别 | train: (60000, 28, 28) (60000,) test: (10000, 28, 28) (10000,) | (512, activation=‘relu’, input_shape=(28 * 28,)) (10, activation=‘softmax’) | rmsprop | categorical_crossentropy | accuracy |
二分类 | 电影评论IMDB | train: (25000,) (25000,) test: (25000,) (25000,) | (16, activation=‘relu’, input_shape=(10000,)) (16, activation=‘relu’) (1, activation=‘sigmoid’) | rmsprop | 二元交叉熵binary_crossentropy | accuracy |
多分类 | 新闻分类 | train: (8982,) (8982,) test: (2246,) (2246,) | (64, activation=‘relu’, input_shape=(10000,)) (64, activation=‘relu’) (46, activation=‘softmax’) | rmsprop | 分类交叉熵categorical_crossentropy | accuracy |
回归问题 | 房价预测 | train: (404, 13) (404,) test: (102, 13) (102,) | (64, activation=‘relu’, input_shape=(13,) (64, activation=‘relu’) (1) | rmsprop | 均方误差mse | mae |
参考文章&图书
Keras文档
Keras中文文档
TensorFlow中文官网
《Python深度学习》
系列文章
Keras深度学习入门(一)
Keras计算机视觉(二)
Keras文本和序列(三)
Keras深度学习高级(四)
Keras生成式学习(五)
@ 学必求其心得,业必贵其专精