Pytorch学习笔记 Task2.1 numpy和pytorch实现梯度下降法

2.1 numpy 实现梯度下降法

import numpy as np

# N是批次的大小,D_in为输入维度,H为隐藏层维度,D_out为输出层维度
N, D_in, H, D_out = 64, 1000, 100, 5

# 产生随机输入和输出数据
np.random.seed(2019)
# np.random.randn() --> 生成指定维度的服从标准正态分布的随机数,输入参数为维度
x = np.random.randn(N, D_in)
y = np.random.randn(N, D_out)

# 随机初始化权重
w1 = np.random.randn(D_in, H)
w2 = np.random.randn(H, D_out)

# 设定梯度下降的学习率
learning_rate = 1e-6

for i in range(300):
    # 前向传播:计算y值
    h = x.dot(w1)
    # 使用relu函数进行非线性变换
    h_relu = np.maximum(h, 0)
    # 输出最后一层结果
    y_pred = h_relu.dot(w2)

    # 计算loss
    loss = np.square(y_pred - y).sum()
    print("第{}次loss为{}".format(i, loss))

    # 反向传播,计算w1、w2对loss的梯度
    grad_y_pred = 2.0 * (y_pred - y)
    grad_w2 = h_relu.T.dot(grad_y_pred)
    grad_h_relu = grad_y_pred.dot(w2.T)
    grad_h = grad_h_relu.copy()
    grad_h[h < 0] = 0
    grad_w1 = x.T.dot(grad_h)

    # 更新权重
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2


2.2 pytorch 实现梯度下降法

import torch
from torch.autograd import Variable

"""
PyTorch中,所有神经网络的核心是 autograd 包。先简单介绍一下这个包,然后训练我们的第一个的神经网络。
autograd 包为张量上的所有操作提供了自动求导机制。它是一个在运行时定义(define-by-run)的框架,
这意味着反向传播是根据代码如何运行来决定的,并且每次迭代可以是不同的.

Variable讲解 
https://www.cnblogs.com/hellcat/p/8449031.html
"""
x = torch.Tensor([1])
# 建立一个张量  tensor([1.], requires_grad=True)
x = Variable(x, requires_grad=True)
# requires_grad: 标记变量是否已经由一个需要调用到此变量的子图创建的bool值。只能在叶子变量上进行修改。
print('grad', x.grad, 'data', x.data)
# data: 任意类型的封装好的张量。
# grad: 保存与data类型和位置相匹配的梯度,此属性难以分配并且不能重新分配。
learning_rate = 0.1
epochs = 20

for epoch in range(epochs):
    y = x ** 2 - 1
    y.backward()
    # .backward()  根Variable的方法会反向求解叶Variable的梯度
    print('grad', x.grad.data)
    # 参数更新
    x.data = x.data - learning_rate * x.grad.data
    x.grad.data.zero_()
    # 在grad更新时,将上一次的梯度记录清空

print(x.data)
print(y)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值