model capacity
depth越大 更能抽象出更多特征,模型表达能力越强
case 1 estimated < ground-truth under-fitting
case 2 estimated > ground-truth over-fitting
over fitting 现象更多
如何检测和减少overfitting
TrainSet Val Set TestSet
valset 挑选模型参数
划分数据集 train 参数 True or False
torch.utils.data.random_split(train_db,[50000,10000]) 将train_db 划分一部分出来作为val_db
K-fold cross validation 60k数据划分为K份,每次取一份来做validation,其他数据做train
减轻overfitting
1\more data
2\constraint model complexity
shallow model
regulaization
3\Dropout
4\ data argumentation
5\early stopping
Regularization 损失函数增加一项 L1正则化或者L2正则化 使用L1范数 L2范数
也叫做weight decay
optim.SGD(net.parameters(), lr = learning_rate, weight_decay=0.01) # 正则化参数0.01
L1正则化
regularization_loss = 0
for param in model.parameters():
regularization_loss += torch.sum(torch.abs(param))
classify_loss = critreon(logits, target)
loss = classify_loss + 0.01 * regularization_loss
optimizer.zero_grad()
loss.backward()
optimizer.step()
动量 momentum
梯度下降的动量 torch.optim.SGD 有momentum参数
learning rate decay 慢慢衰减,从0.1到0.0001
ReduceLROnPlateau
StepLR
如何定义自己的网络:
需要继承nn.Module类,并实现forward方法。继承nn.Module类之后,在构造函数中要调用Module的构造函数, super(Linear, self).init()
一般把网络中具有可学习参数的层放在构造函数__init__()中。
不具有可学习参数的层(如ReLU)可放在构造函数中,也可不放在构造函数中(而在forward中使用nn.functional来代替)。可学习参数放在构造函数中,并且通过nn.Parameter()使参数以parameters(一种tensor,默认是自动求导)的形式存在Module中,并且通过parameters()或者named_parameters()以迭代器的方式返回可学习参数。
只要在nn.Module中定义了forward函数,backward函数就会被自动实现(利用Autograd)。而且一般不是显式的调用forward(layer.forward), 而是layer(input), 会自执行forward().
在forward中可以使用任何Variable支持的函数,毕竟在整个pytorch构建的图中,是Varible在流动。还可以使用if, for, print, log等python语法。
卷积
feature maps
weight sharing 权值共享 卷积核
通过局部相关性促成了权值共享
图像通过卷积核得到feature map 对应位置元素相乘再累加得到feature map上的一个值
多个kernels
input_channels 输入的图片 灰度图1 彩色图3
kernel_channels 卷积核数量
kernel_size 3*3 卷积核大小
stride =1 卷积计算移动的步长
padding: 周围加0
layer = nn.Conv2d(inputchannel,kernelnumbers,kernel_size,stide,padding)
x = torch.rand(1,1,28,28)
out = layer.forward(x)
还可以直接使用 out=layer(x) # 默认调用了__call__ hooks 完成了一些pytorch自带的方法
kernel: layer.weight
layer.bias
F.conv2d 函数式接口
pooling 池化层 max pooling 选取一个窗口中最大的值;avg pooling 计算窗口中值的平均数
也是完成了一个降维的过程
subsampling 下采样 lenet-5 隔行采样
x = out
layer = nn.MaxPllo2d(2,stride=2)
out = layer(x) => torch.Size([1,16,7,7])
upsample 上采样
F.interpolate 放大倍数 参数选择插值方式
conv2d - BN- pooling - ReLU
ReLU 把负的相应给去掉 使图片更加平滑
layer = nn.ReLU(inplace=True)
out = layer(x) # x 是输入图像
F.relu(x) 也可以
Batch-Norm 不只是用在cnn rnn其他也用到
梯度接近0 梯度弥散 无法backward
把数值控制在一个范围内 做norm变换 权值缩放
normalize = transforms.Normailize(mean=,std=)
batch-norm 一个batch生成相同通道所有图片元素数值的统计数据计算norm,使得数据逼近正态分布
x = torch.rand(100,16,784) # 16个channel
layer = nn.BatchNorm1d(16)
out = layer(x)
layer.running_mean # 得到tensor16个数
layer.tunning_var
nn.BatchNorm2d(16)
affine参数 是否自动学习改变均值方差 一般为True
经典卷积神经网络
LENET-5
AlexNet 5 conv +3 使用maxpooling 和ReLU
VGG 更小的卷积核心 19layers
GooLeNet 22layers 同一层可以使用多个不同类型的卷积核 1*1conv 3*3conv 5*5conv 3*3 max pooling 信息再做一个聚合
深度残差网络 ResNet
中间找到一个unit 做短路 2-3层成为一个unit比较合适
residual 残差 shortcut
DenseNet
nn.Module 基本的类 所有网络层的父类
主要功能:
container nn.Sequential 容器
parameters 管理参数
modules
to(device) 转到GPU下运算
save and load 保存一个中间转改 load_state_dict()
train/test 切换状态 net.train() net.eval()
implement own layer class 才能写到nn.sequential里面去,自己定义
数据增强方法:
flip rotate randommove & crop
GAN
flip : 图片翻转
rotate : 图片旋转
transforms.Compose nn.sequential 类似 transforms 是torchvision里面的 专门给视觉来用
transforms.Compose([transforms.RandomHotizontaFlip()...
scale 图片缩放 使用transforms.Resize
Crop Part 裁剪部分 随机裁剪 随机旋转平移 transforms.RandomCrop
noise 增加噪声