1. 数据处理
输入数据标准化:把不同级别的数据全都变到-1~1之间(或者0 ~1之间)。
目标函数正则化:加入复杂度惩罚,防止过拟合。
gram matrix:舍弃空间信息,对于一个CxHxW的特征图,令F=Cx(HW),gram matrix=
F
∗
F
T
F*F^T
F∗FT
用visdom观察训练进度
数据初始化:
# 利用nn.init初始化
from torch.nn import init
linear = nn.Linear(3, 4)
t.manual_seed(1)
# 等价于 linear.weight.data.normal_(0, std)
init.xavier_normal_(linear.weight)
常用的几个图像处理:
import os
from PIL import Image
import numpy as np
from torchvision import transforms as T
transform = T.Compose([
T.Resize(224), # 缩放图片(Image),保持长宽比不变,最短边为224像素
T.CenterCrop(224), # 从图片中间切出224*224的图片
T.ToTensor(), # 将图片(Image)转成Tensor,归一化至[0, 1]
T.Normalize(mean=[.5, .5, .5], std=[.5, .5, .5]) # 标准化至[-1, 1],规定均值和标准差
])
2. CNN
参数是卷积核,每个通道可以有一个。
首先是1个通道上的3*3的卷积核
然后是加权求和。
3. 激活和池化
这两个层都没有参数。
激活函数将线性函数转化为非线性,这样可以表达任意的函数。
池化:压缩特征,增强泛化能力。
4. flatten层和softmax
flatten没有参数,softmax参数巨多。
将长宽和channel统统压成1维数组,左边显示数值,右边显示参数。可以看到,参数量巨大无比。
5. BN层
softmax对大部分数据极为不敏感,如下图,红色区域之外的值非常不敏感。
BN对输入的batch数据做normalization,避免大量的数据消失。下图上面两行是输入数据,下面两行是softmax之后的值。
6. 全连接层
任意两个节点之间都有参数,计算量巨大。
7. RNN层
由于梯度消失或梯度爆炸问题,一般用LSTM或GRU(简化版的LSTM)。LSTM 和普通 RNN 相比, 多出了三个控制器. (输入控制, 输出控制, 忘记控制). 现在, LSTM有条主线控制全局的记忆, 我们用粗线代替. 为了方便理解, 我们把粗线想象成电影或游戏当中的 主线剧情. 而原本的 RNN 体系就是 分线剧情. 三个控制器都是在原始的 RNN 体系上, 我们先看输入方面 , 如果此时的分线剧情对于剧终结果十分重要, 输入控制就会将这个分线剧情按重要程度写入主线剧情进行分析. 再看忘记方面, 如果此时的分线剧情更改了我们对之前剧情的想法, 那么忘记控制就会将之前的某些主线剧情忘记, 按比例替换成现在的新剧情. 所以主线剧情的更新就取决于输入和忘记控制. 最后的输出方面, 输出控制会基于目前的主线剧情和分线剧情判断要输出的到底是什么.基于这些控制机制, LSTM 就像延缓记忆衰退的良药, 可以带来更好的结果.
下面是标准图,可以看出:
主干输入输出贯彻始终,此外
- 输入包含两方面:标准输入、上轮迭代分线输出
- 输出包含两方面:标准输出、本轮迭代分线输出
中间过程包含三个门。 - 左边输入门:两个输入一起更新主干信息
- 中间遗忘门:两个输入一起替换部分主干信息。
- 右边输出门:两个输入一起更新分线输出,并给出标准输出。
8. 自编码层
本质是一个隐层的全连接层,输入和输出一样。输入->隐层称为编码,隐层->输出称为编码。
9. GAN网络
在GAN中,有两个神经网络,一个generator,接收随机数,致力于最小化与目标的差距;一个discirminator,接收generator产生的数据,并致力于最大化与目标的差距。
10. dropout
训练时随机丢弃掉一部分神经元,注意要将剩下的数值按比例缩放。
11. embedding
词向量一般用one-hot方式进行编码。
embedding将上述编码映射为特征向量