pytorch训练经典网络笔记

经典网络笔记(pytorch)

一. 深度学习基本知识

1.1 深度学习分类

深度学习分为监督学习,无监督学习,半监督学习和强化学习。其中监督学习是通过已有的训练样本去训练得到一个最优的模型,这个模型会将所有的输入映射为输出。无监督学习他与监督学习是完全不同的两个东西,它是在我们之前没有任何的训练样本,而直接对数据进行建模分类。半监督学习是在训练过程中结合了大量大量的未标记的数据和少量的标记数据,和使用了所有标签数据的模型相比使用。结合大量为标记和少量有标记的数据集训练时,训练结果更为准确。强化学习是?单独的一个学习,这是通过一个回报函数,通过这个函数来确定是否接近目标,类似于我们训练一些宠物。做错了就给予一些惩罚,做对了就继续加强。在这里我们只着重介绍监督学习。也就是输入x输出y的一个学习。

1.2线性回归

回归函数有两种。一种是线性回归,另外一种是非线性回归。这里我们先举一个很小的例子。比如我们使用线性回归输入x可以是一个标量,也可以是一个多维的向量。但是它与输出外的关系是一个线性的关系。下面我们用Pytorch代码来做一个详细的解释。

#####   注意,这里我们使用了一个新库叫 seaborn 如果报错找不到包的话请使用pip install seaborn 来进行安装
import torch
from torch.nn import Linear, Module, MSELoss
from torch.optim import SGD
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
torch.__version__
x = np.linspace(0,20,500)
y = 5*x + 7
plt.plot(x,y)
x = np.random.rand(256)
noise = np.random.randn(256) / 4
y = x * 5 + 7 + noise
df = pd.DataFrame()
df['x'] = x
df['y'] = y
sns.lmplot(x='x', y='y', data=df);

上面的代码我们构建了一个线性的函数,并且利用None of随机生成了一些数据。第一张图是一个线性的图像。,第二张图显示的是我们随机生成的数据。
在这里插入图片描述
下面我们利用pytorch定义一个模型,然后去训练它。

model=Linear(1, 1)
criterion = MSELoss()
optim = SGD(model.parameters(), lr = 0.01)
epochs = 3000
x_train = x.reshape(-1, 1).astype('float32')
y_train = y.reshape(-1, 1).astype('float32')
for i in range(epochs):
  # 整理输入和输出的数据,这里输入和输出一定要是torch的Tensor类型
  inputs = torch.from_numpy(x_train)
  labels = torch.from_numpy(y_train)
  #使用模型进行预测
  outputs = model(inputs)
  #梯度置0,否则会累加
  optim.zero_grad()
  # 计算损失
  loss = criterion(outputs, labels)
  # 反向传播
  loss.backward()
  # 使用优化器默认方法优化
  optim.step()
  if (i%100==0):
      #每 100次打印一下损失函数,看看效果
      print('epoch {}, loss {:1.4f}'.format(i,loss.data.item()))  

注意这里面的代码要和之前的代码结合起来。代码的第一行,我们首先定义了一个线性的层。,俺这个层的输入输出特征数量都是一。之后,我们使用了一个常用的损失函数,然后利用SGD优化器去优化这个模型的参数,学习率我们设置为0.01。之后我们进入了一个for循环,在这个for循环里面,我们将输入的数据转化为touch类型,然后将数据放入,启动这个模型的优化器。每100次训练我们就将它的损失函数打印出来。得出来如下图。可以看出,在经过了2900次训练之后,这个模型的精确度达到了非常高的水平。
在这里插入图片描述

1.3损失函数

损失函数是我们来估量模型的预测值与真实值不一致的程度,它是一个非负的函数,损失函数越小,证明模型的鲁棒性越高。我们在训练过程中就是通过不断地迭代计算,使用梯度下降了优化算法让损失函数越来越小。这里面需要注意,我们使用的这个框架是使用。批处理来计算的,所以损失函数计算出来的结果是一个平均的损失函数。那么常见的损失函数在touch框架里面。有以下几个:

  1. nn.L1Loss:
    输入x和目标y之间差的绝对值,要求 x 和 y 的维度要一样(可以是向量或者矩阵),得到的 loss 维度也是对应一样的
    loss(x,y)=1/n∑|xi−yi|
  2. nn.MSELoss:
    均方损失函数 ,输入x和目标y之间均方差
    loss(x,y)=1/n∑(xi−yi)2
  3. nn.CrossEntropyLoss:
    多分类用的交叉熵损失函数,LogSoftMax和NLLLoss集成到一个类中,会调用nn.NLLLoss函数,我们可以理解为CrossEntropyLoss()=log_softmax() + NLLLoss()
    loss(x,class)=−logexp(x[class])∑jexp(x[j])) =−x[class]+log(∑jexp(x[j]))
    因为使用了NLLLoss,所以也可以传入weight参数,这时loss的计算公式变为:
    loss(x,class)=weights[class]∗(−x[class]+log(∑jexp(x[j])))
    所以一般多分类的情况会使用这个损失函数。

1.3梯度下降

梯度下降就是寻找一个局部最优解的过程。我们常用的下降算法有随机梯度下降法,动量梯度下降法。RMSPROP,ADam。这几个方法中越往后下降速度越快。
### 1.3方差/偏差与正则化

  1. 方差是测量了模型的泛化能力,偏差。是测量了算法期望与真实结果的偏离程度。在训练过程中,如果,偏差过高的话,一般我们认为这个模型欠拟合。如果方差过高的话就认为这是过拟合的。那么如何解决这两种问题呢?在欠拟合的现象中,我们要增加网络的结构,并且训练更长的时间,增加epoch的次数,寻找合适的网络架构。过拟合的时候就需要使用更多的数据。或者对它进行正则化。
  2. 正则化是我们在损失函数的基础上加上权重参数的绝对值,还有一个正则化的方法,是在损失函数的基础上加上权重参数的平方和。需要注意的是前面那种更常用一些。

二. 神经网络

2.1 基本神经网络

神经网络是模拟人的大脑进行的一个学习过程,在我看来,他最重要的一点就是采用了非线性的激活函数。我们常用的激活函数有

  1. sigmoid函数,这个函数因为是将数据分为零到负一的。所以数据会出现一个分散的状况。我们很少使用这个激活函数了,一般我们都使用RELU。
  2. 修正线性单元是通过二分类函数将小于零的数据全部变为零。俺大于零的数据保持不变。那么这个函数经常会被用作激活函数。有一个缺点就是如果输入的时候是负数的话,那么这个函数是完全不会被激活了。
  3. 接下来我们需要理解一下正向传播和反向传播。正向传播就是指对于一个神经网络来说,我们把输入的特征作为x放入第一层,并计算第一层的激活函数。那么在以此类推。在学习过程中,我们会保存每一层的w和b。并最终得到y,之后我们利用反向传播。通过歪曲以及最后一层的输入到每一层的梯度进行更新参数w和B。

2.12卷积神经网络

卷积神经网络我们通常是通过多个卷积层和全链接层组成的。他经常用在图像识别中,在图像识别中通过卷积和能够更有效地提取图像中的局部特征。而且如果我们只是将图像展开呈单一的矩阵,那么这个计算量是非常大的,我们通过卷积层的卷积核来提取特征。从俺大大降低了数据的运算量。
  1. ,首先介绍一下卷积计算的步骤。卷积计算就是利用一个卷积核,然后通过调整卷积核的大小。以及图像的边填充和步长来得出下一个层的数据量大小。在每个卷积层中我们都会设置多个和每个和代表着不同的特征,这些特征就是我们需要传递到下一层的输出。On,我们训练的过程就是训练这些不同的核。在卷积层中我们使用的激活函数大都是经典的erlu激活函数。
  2. 池化层是卷积层的。一个重要组成部分,池化层是有平均池化层和最大池化层。它可以大量的减少运算的复杂度。
  3. 随机失活层是我们为了防止过拟合I.制作的。他是为了增强模型的泛化能力,通俗的来讲我们就会使用这个层随机的将一部分网络进行。失活。全连接层就是一个经典的line层,之前我们已经讲过了。

三. 技巧

  1. 微调,迁移学习
  2. 使用GPU
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值