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

利用pytorch框架搭建VAE pytorch validation_人工智能

 

经典卷积神经网络

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 增加噪声