pytorch——全连接层,模型好坏的衡量,过拟合欠拟合及解决方法,动量,卷积开头

全连接层

import torch
#构建全连接层的写法
class zqh_layer(torch.nn.Module): #定义一个自己想的类,继承于torch.nn.Module
    def __init__(self):   #以下两行固定写法
        super(zqh_layer, self).__init__()
#以下为设计三个层级的写法(从下往上,总共的是10,784)
        self.model=torch.nn.Sequential(
            torch.nn.Linear(784,200),
            torch.nn.ReLU(inplace=True),
            torch.nn.Linear(200, 200),
            torch.nn.ReLU(inplace=True),
            torch.nn.Linear(200, 10),
            torch.nn.ReLU(inplace=True),
        )
#重写forward,x是输入,输入进来直接走全连接层
    def forward(self,x):
        x=self.model(x)
        return x

net=zqh_layer() #net是继承于上面写的那个类名
optimizer=torch.optim.SGD(net.parameters(),lr=0.001) #由于类里面已经写了连接层
#所以可以直接写net.parameters()。权重和偏置不需要我们自己管的,包含在连接层内部

 

leaky relu

将relu的x<0且接近0的时候,并不完全等于0,使其有梯度

更加光滑的relu

模型好坏的衡量,如何计算精度

#精度的计算方法
import torch
import torch.nn.functional as F
logits=torch.rand(4,10)
print(logits)
pred=F.softmax(logits,dim=1)
print('将logits改成概率的形式',pred)
pred_label=pred.argmax(dim=1)
print('四行里面每一行的最大值是第几位',pred_label)

#假设原来的label是torch.tensor([9,8,9,8])
orin_label=torch.tensor([9,8,9,8])
print('原来的(正确的)label',orin_label)
correct=torch.eq(orin_label,pred_label)
print(correct)
print(correct.sum().float().item()/4)  #预测对的除以总的预测的

过拟合和欠拟合

所使用的模型的复杂度<实际真实的模型的复杂度——欠拟合(ax+b<a(bx+c)+d)

实际真实的模型的复杂度<所使用的模型的复杂度——过拟合

 

如何检测出到底是过拟合还是欠拟合:做测试的原因,检测是否有欠拟合或者过拟合找合适的神经网络模型的参数

 

k值法,把训练集分成k份,每次取ki份当验证集,ki-1份当数据集

如何解决过拟合

 

更多的数据,减少模型的复杂度

使用回归方法在运行过程中智能减少模型的复杂度

在末尾加上  入和θ的范数的累加。这样再求loss梯度更新参数的时候,θ的范数在更新的过程中也会逐渐的减小

加上weight_decay就加上了后面的1/2lambda二范数,0.01设置的是lambda的值

#加l2-regularization的方法
optimizer=torch.optim.SGD(net.parameters(),lr=0.001,weight_decay=0.01)
#加l1_regularization方法
regularization_loss=0
for param in model.parameters(): #循环网络里面的所有的参数
    regularization_loss+=torch.sum(torch.abs(param)) #计算一范数的和
class_loss=criteon(logits,target) #计算loss
loss=class_loss +0.01*regularization_loss  #loss+lambda*一范数的和

要寻找全局最小解,可以增加动量momentum

原来的更新方式

 

加上动量后的更新方式

 

更新时不仅仅只考虑梯度方向,还考虑了历史方向

#要使用动量moment,直接在sgd中加入momentum,值是公式中的β
optimizer=torch.optim.SGD(model.parameters(),lr=0.001,momentum=0.078)

 早期停止

 

在训练集的准确度上升的时候,验证集的精准度也会先上升再下降,就要找到那中间的一个最高点,选择的参数设置就是中间那个最高点的

可是由于后面的不需要,我们为了节省时间可以在最高点处设置出停止

dropout(用于减少过拟合)

就是所有的w权值的路线,都设置一个probility,每一次这条路线都是概率连通

 

只需要在层之间加入torch.nn.Dropout(概率),即可

 

 self.model=torch.nn.Sequential(
            torch.nn.Linear(784,200),
            torch.nn.Dropout(0.5),
            torch.nn.ReLU(inplace=True),
            torch.nn.Linear(200, 200),
            torch.nn.ReLU(inplace=True),
            torch.nn.Linear(200, 10),
            torch.nn.ReLU(inplace=True),
        )

验证集验证的时候,需要关掉这个概率的,可以加入net_dropped.eval()

图片

 

局部视野,局部相关性

由于神经网络中的点一多,线就会特别多,引起硬件需求变高。此时提出了局部相关性(卷积),只使用上一部分的某几个通过权值到达下一层的一个节点,减少线

 

 

卷积

红色的是h(t),蓝色的是x(t),卷积代表的是在h(t)移动的过程中与x(t)的重合量,重合的多重叠时达到最大。

 

posted @ 2021-01-27 00:01  克莱比-Kirby  阅读(630)  评论(0)    收藏  举报