深度学习笔记(二十四)—— 深度学习总结与回顾

2019-08-02  本文已影响0人  Nino_Lau

本周是深度学习实验课的最后一次课,让我们回顾一下在这个学期中大家都学习到了哪些内容。在前面的课程中我们首先了解了神经网络的结构,如何去搭建神经网络,怎样去训练神经网络,以及神经网络的优化、微调。紧接着我们又学习了深度学习领域当前比较流行的几个大方向,例如分类、语义分割、目标检测、对抗神经网络、自然语言处理等等。接下来的内容是对我们所学的知识的一个总结和升华。

1.神经网络的基础内容

1.框架

当前训练神经网络的框架有许多,例如tensorflow, caffe, pytorch等等,由于pytorch上手简单,使用方便,所以本门课程选择的框架是pytorch.

2.神经网络的基础单元

在pytorch框架中,神经网络的最基本的单元是张量(tensor), 由于框架本身已经实现了反向传播的机制,所以我们在搭建网络的过程中只需将大部分精力放在正向传播上,不太需要关心反向传播(梯度消失,梯度爆炸问题除外)。

3.如何去搭建一个简单的神经网络

import torch
import torch.nn as nn
import torch.optim as optim

class Net(nn.Module):
    def __init__(self, *args):
        self.layer1 = nn.Conv2d(3,64,kernel_size=3, stride=1,padding=0, bias=True)
        self.avg_pool = nn.AvgPool2d(4)
        self.layer2 = nn.Linear(64,10)
        
    
    def forward(self, x):
        out = self.layer1(x)
        out = out.view(x.size(0), -1)
        out = self.layer2(out)
        return out

4.如何去训练一个神经网络

LR = 0.01
BATCH_SIZE = 32
EPOCH = 10

net = Net()

optimizer = optim.SGD(net.parameters(), lr=LR, momentum=0.9, weight_decay=5e-4)
criterion = nn.CrossEntropyLoss()

for i in range(EPOCH):
    for data in enumerate(dataloader):
        x, y = data
        x, y = x.cuda(), y.cuda()
        # 模型预测结果
        y_hat = net(x)
        # 计算loss值
        loss = criterion(y, y_hat)
        # 清空优化器,必须在反向传播前进行
        optimizer.zero_grad()
        # 反向传播
        loss[0].backward()
        # 更新网络参数
        optimizer.step()
        
    '''
    这部分根据个人需求添加自己的代码,可以实现打印当前epoch的loss值,
    在训练集上的准确率,在验证集上的准确率,绘图等等操作
    '''

在以上训练过程中,值得大家注意的是:
建议大家同时打印出模型在训练集和测试集上的准确率,有些同学只关注在测试集上的准确率,忽略了在训练集上的准确率,导致可能出现一种情况,在测试集上的准确率不够理想,就怀疑是模型或者是其他什么地方出了问题。这个时候我们应该看看在训练集上的准确率如何,如果模型在训练集上表现的结果都不是很好,说明模型根本就没有训练好,又怎么能期望它能够在测试集上表现得好呢?这个时候我们首先应该想办法让模型在训练集的准确率达到99%以上(分类网络一般都可以达到近乎100%)。这是初学者很容易犯的一个低级错误,希望能够引起大家的重视。

5.模型训练的基本技巧

以上内容基本上在14周课件中都有实现

6.训练的高级技巧

一个很具体的问题

第12次作业,数据预处理和decoder输出内容转换成文本的过程
网络输出是词向量,通过查询字典(embedding)可以转换成对应的index(整数),再查询预先定义的index和词的对应关系,可以找到原始对应的单词

上一篇 下一篇

猜你喜欢

热点阅读