PyTorch-深度学习 笔记

常见机器学习方法

  • 监督学习
    已有训练样本,去训练得到一个最优模型,再利用这个模型将所有的输入映射为相应的输出。
  • 无监督学习
    事先没有任何训练样本。需要直接对数据进行建模。
  • 半监督学习
    有大量未标记的数据和少量标记的数据。
  • 强化学习
    设定一个回报函数,通过这个函数来确认是否越来越接近目标。

线性回归

线性回归来确定两种或两种以上变量间相互依赖的定量关系。线性回归对于输入x和输出y有一个映射(类似ax+b),而我们是训练a、b这两个参数。
以下代码使用PyTorch建立一个线性的模型来对其进行拟合,即训练过程。

def linear_ex():
    x = np.random.rand(256)
    noise = np.random.randn(256) / 4
    y = 5 * x + 7 + noise
    # 以下使用PyTorch建立一个线性的模型来对其进行拟合,即训练
    # (1,1)代表输入输出的特征数量是1,y=w*x+b,其中w代表权重,b代表偏置
    model = Linear(1, 1)
    # 损失函数
    criterion = MSELoss()
    # 优化器
    optim = SGD(model.parameters(), lr=0.01)
    # 训练次数
    epochs = 3000
    #  x_train, y_train 的形状是 (256, 1), 代表 mini-batch 大小为256, feature 为1。astype('float32') 是为了下一步可以直接转换为 torch.float。
    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)
        # 梯度归零,以免累加
        optim.zero_grad()
        # 损失
        loss = criterion(outputs, labels)
        # 反向传播
        loss.backward()
        # 优化。相当于更新
        optim.step()
        if i % 100 == 0:
            print('epoch {},loss {:1.4f}'.format(i, loss.data.item()))

    # 训练结束,提取最后的模型参数。
    [w, b] = model.parameters()
    print(w.item(), b.item())

    # 可视化模型,查看训练数据
    predicted = model.forward(torch.from_numpy(x_train)).data.numpy()
    plt.plot(x_train, y_train, 'go', label='data', alpha=0.3)
    plt.plot(x_train, predicted, label='predicted', alpha=1)
    plt.legend()
    plt.show()

损失函数

pytorch内置损失函数:

  • nn.L1Loss:输入x和目标y之间差的绝对值。(要求维度一致)
  • nn.NLLLoss:用于多分类的负对数似然损失函数。
  • nn.MSELoss:输入x和目标y之间均方差。
  • nn.CrossEntropyLoss:多分类用的交叉熵损失函数。(一般多分类的情况会使用这个损失函数)
  • nn.BCELoss:计算 x 与 y 之间的二进制交叉熵。

梯度下降

梯度下降是一个使损失函数越来越小的优化算法。在约束优化问题时(无求解机器学习算法的模型参数),梯度下降是最常用的方法之一。

梯度

  • 微积分中,对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来。就是梯度
  • 几何中,梯度是函数变化增加最快的地方。沿着梯度向量的方向,易找到最大值,反之,易找到最小值

梯度下降法:求解当前位置的梯度,然后沿着梯度的负方向,走下一步。

Mini-batch的梯度下降法

每一步梯度下降法需要对整个训练集进行一次处理,但是如果数据集很大,处理速度很慢,并且不能一次性加载到内存或显存。因此,将数据集划分为小数据集,这种小数据集成为Mini-batch。这种梯度下降法,一个epoch可以进行Mini-batch的个数次梯度下降。
Mini-batch size的计算规则如下,在内存允许的最大情况下使用2的N次方个size

随机梯度下降算法。

# lr参数为学习率,对于SGD来说一般选择0.1 0.01 0.001。
# 如果设置了momentum,就是带有动量的SGD,可以不设置
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

RMSprop是一种可以加快梯度下降的算法,利用此算法,可减小某些维度梯度更新波动较大的情况,使其梯度下降的速度更快。

optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.09)

Adam 优化算法的基本思想就是将 Momentum 和 RMSprop 结合起来形成的一种适用于不同深度学习结构的优化算法。

optimizer = torch.optim.Adam(model.parameters(), lr=0.01, betas=(0.9, 0.999), eps=1e-08)

方差、偏差

  • 偏差:度量了学习算法的期望预测与真实结果的偏离程序。拟合能力
  • 方差:度量了同样大小的训练集的变动,导致学习性能的变化。泛化能力

高偏差即欠拟合,拟合度不够,通过增加网络结构、增加训练时间、寻找合适的网络架构解决;高方差即过拟合,失去泛化能力,通过使用更多数据、正则化、寻找合适的网络结构解决。

# 计算偏差
print(5 - w.data.item(), 7 - b.data.item())

正则化:

  • L1正则化
    损失函数的基础上,加上权重参数的绝对值。
    在这里插入图片描述
  • L2正则化
    损失函数的基础上,加上权重参数的平方和。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值