1.numpy和pytorch实现梯度下降法

 import numpy as np

 # N is batch size;
N, D_in, H, D_out = 64, 1000, 100, 10 # 输入输出数据的随机初始化
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 t in range(500):
# 前向传播
h = x.dot(w1)
h_relu = np.maximum(h, 0)
y_pred = h_relu.dot(w2) # 计算并打印损失
loss = np.square(y_pred-y).sum()
print(t, 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

torch

 import torch

 dtype = torch.float
device = torch.device("cpu")
# device = touch.device("cuda:0") #当运行在GPU时,要加上这行代码 # N是batch size;D_in是输入的维度
# H是隐藏层的维度;D_out是输出的维度
N, D_in, H, D_out = 64, 1000, 100, 10 # 构造随机生成的输入和输出数据
# 设置requires_grad=False,表明在后向传播时,我们不需要计算关于这些张量的梯度
x = torch.randn(N, D_in, device=device, dtype=dtype)
y = torch.randn(H, D_out, device=device, dtype=dtype) # 网络权重随机初始化
# 设置requires_grad=True,表明在后向传播时,我们需要计算关于这些张量的梯度
w1 = torch.randn(D_in, H, device=device, dtype=dtype, requires_grad=True)
w2 = torch.randn(H, D_out, device=device, dtype=dtype, requires_grad=True) # 学习率
learing_rate = 1e-6
for t in range(500):
# 前向传播:这些与我们使用tensors计算正向传播的操作完全相同,但是我们不需要
# 保留对中间值的引用,因为我们没有手动实现反向传播。
y_pred = x.mm(w1).clamp(min=0).mm(w2) # 使用tensor操作计算并打印损失
# 现在loss是一个shape(1,)类型的张量
# loss.item()可以获取loss中保存的标量值
loss = (y_pred - y).pow(2).sum()
print(t, loss.item()) # 使用autograd来计算后向传播;这个调用将计算相对于所有requires_grad=True的
# 张量的损失的梯度。
# After this call w1.grad and w2.grad will be Tensors holding the gradient
# of the loss with respect to w1 and w2 respectively.
loss.backward() # 使用梯度下降手动更新权重。之所以封装于torch.no_grad(),是因为权重的
# requires_grad=True,而我们在自动微分中没有必要跟踪这些;
# 另一种可选择的操作是operate on weight.data and weight.grad.data.
# You can also use torch.optim.SGD to achieve this.
with torch.no_grad():
w1 -= learning_rate * w1.grad
w2 -= learning_rate * w2.grad # 更新权重之后,手动将梯度设置为0
w1.grad.zero_()
w2.grad.zero_()

2.设定初始值

神经网络的权重初始化方法对模型的收敛速度和性能有着至关重要的影响。主要有四种权重初始化方法:

把w初始化为0

  在线性回归,logistics回归中,基本上把参数初始化为0,模型也能很好的工作。但是在神经网络中,这种方法是不可行的。如果把w初始化为0,那么每一层的神经元学到的东西都是一样的。

对w随机初始化

  对w进行随机初始化时,要初始化到一个相对较小的值,因为如果X很大的话,W又相对较大,会导致Z非常大,这样如果激活函数是sigmoid,就会导致sigmoid的输出值1或者0,然后会导致一系列问题。但是随机初始化也有缺点,np.random.randn()其实是一个均值为0,方差为1的高斯分布中采样。当神经网络的层数增多时,会发现越往后面的层的激活函数(使用tanH)的输出值几乎都接近于0 。

Xavier initialization

  Xavier initialization是 Glorot 等人为了解决随机初始化的问题提出来的另一种初始化方法,他们的思想倒也简单,就是尽可能的让输入和输出服从相同的分布,这样就能够避免后面层的激活函数的输出值趋向于0。虽然Xavier initialization能够很好的 tanH 激活函数,但是对于目前神经网络中最常用的ReLU激活函数,还是无能为力。

He initialization

  为了解决上面的问题,我们的何恺明大神提出了一种针对ReLU的初始化方法,一般称作 He initialization。

现在神经网络中,隐藏层常使用ReLU,权重初始化常用He initialization这种方法。

3.求取梯度

 import torch
from torch.autograd import Variable
x = Variable(torch.Tensor([1]),requires_grad=True)
w = Variable(torch.Tensor([2]),requires_grad=True)
b = Variable(torch.Tensor([3]),requires_grad=True) y = w*x+b
y.backward()
print(x.grad)
print(w.grad)
print(b.grad) tensor([2.])
tensor([1.])
tensor([1.])

4.在梯度方向上进行参数的更新

见下面的回归吧
5.numpy和pytorch实现线性回归

numpy

 import numpy as np

 x_data = np.array([1, 2, 3])
y_data = np.array([2, 4, 6]) epochs = 10
lr = 0.1
w = 0
cost = [] for epoch in range(epochs):
yhat = x_data * w
loss = np.average((yhat - y_data) ** 2)
cost.append(loss)
dw = -2 * (y_data - yhat) @ x_data.T / (x_data.shape[0])
w = w - lr * dw
print(w)

pytorch

 import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
%matplotlib qt5
%matplotlib inline torch.manual_seed(1)
x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y = x.pow(2) + 0.2*torch.rand(x.size()) plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
class Net(torch.nn.Module):
def __init__(self,n_feature,n_hidden,n_output):
super(Net,self).__init__()
self.hidden = torch.nn.Linear(n_feature,n_hidden)
self.predict = torch.nn.Linear(n_hidden,n_output) def forward(self,x):
x = F.relu(self.hidden(x))
x = self.predict(x)
return x
net = Net(n_feature=1,n_hidden=10,n_output=1)
print(net)
optimizer = torch.optim.SGD(net.parameters(),lr=0.2)
loss_func = torch.nn.MSELoss()
plt.ion()
plt.show()
for t in range(100):
prediction = net(x)
loss = loss_func(prediction,y) optimizer.zero_grad()
loss.backward()
optimizer.step()
if t%10 == 0:
plt.cla()
plt.scatter(x.data.numpy(),y.data.numpy())
plt.plot(x.data.numpy(),prediction.data.numpy(),'r-',lw=5)
plt.text(0.5,0,'Loss=%.4f'%loss.data.numpy(),fontdict={'size':20,'color':'red'})
plt.show()
plt.pause(0.1)
plt.ioff()

6.pytorch实现一个简单的神经网络

 import torch
from torch.autogtad import Variable torch.manual_seed(2)
x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0]]))
y_data = Variable(torch.Tensor([[2.0], [4.0], [6.0]])) class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear = torch.nn.Linear(1, 1, bias=False) def forward(self, x):
y_pred = self.linear(x)
return y_pred model = Model() criterion = torch.nn.MSELoss(size_average=False) optimizer = torch.optim.SGD(model.parameters(), lr=0.01) epochs = 20
cost = []
for epoch in range(epochs):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
cost.append(loss.data[0])
optimizer.zero_grad()
loss.backward()
optimizer.step() list(model.parameters())

7.参考资料:PyTorch 中文文档 https://pytorch.apachecn.org/docs/1.0/

https://blog.csdn.net/MainTain_/article/details/90216379

Task2.设立计算图并自动计算的更多相关文章

  1. 2018年排名前20的数据科学Python库

    Python 在解决数据科学任务和挑战方面继续处于领先地位.业已证明最有帮助的Python库,我们选择 20 多个库,因为其中一些库是相互替代的,可以解决相同的问题.因此,我们将它们放在同一个分组. ...

  2. 数据科学20个最好的Python库

    Python 在解决数据科学任务和挑战方面继续处于领先地位.去年,我们曾发表一篇博客文章 Top 15 Python Libraries for Data Science in 2017,概述了当时业 ...

  3. 20个最有用的Python数据科学库

    核心库与统计 1. NumPy(提交:17911,贡献者:641) 一般我们会将科学领域的库作为清单打头,NumPy 是该领域的主要软件库之一.它旨在处理大型的多维数组和矩阵,并提供了很多高级的数学函 ...

  4. 深度学习与CV教程(8) | 常见深度学习框架介绍

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  5. pytorch(05)计算图

    张量的一系列操作,增多,导致可能出现多个操作之间的串行并行,协同不同的底层之间的协作,避免操作的冗余.计算图就是为了解决这些问题产生的. 计算图与动态图机制 1. 计算图 计算图用来描述运算的有向无环 ...

  6. ios label 自动计算行高详解

    在OC当中自动计算行高主要调用系统的 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff } span ...

  7. poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算

    /** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @C ...

  8. BPM实例分享——日期自动计算

    日期自动计算 在请假流程中通常我们需要获得请假开始到请假结束时间的天数,那么请假天数(可结合工作日历)是怎么实现系统计算呢?下面我们来看下配置的方法.  1.  首选建立业务服务BPMService, ...

  9. Xcode8+和iOS10+使用Masonry自动计算行高

    说起tableView的自动计算行高,真的是不想再提了,写了不知道几百遍了.可就是这麽一个小玩意儿,把我给难的不行不行的,眼看都要没头发了. 1.设置tableView的预估行高和行高为自动计算 // ...

随机推荐

  1. jt获取鼠标指针的位置

    屏幕 screenX和screenY属性表示鼠标在整个显示屏的位置,从屏幕(而不是浏览器)的左上角开始计算的. 页面 pageX和pageY属性表示鼠标指针在这个页面的位置.页面的顶部可能在可见区域之 ...

  2. MySQL Cluster 与 MongoDB 复制群集分片设计及原理

    分布式数据库计算涉及到分布式事务.数据分布.数据收敛计算等等要求 分布式数据库能实现高安全.高性能.高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Clus ...

  3. EditPlus配色方案

    找到配置文件:editplus_u.ini配置文件 [Options] Placement=2C00000002000000030000000083FFFF0083FFFFFFFFFFFFFFFFFF ...

  4. 【SD系列】SAP 查看销售订单时,报了一个错误消息,“项目不符合计划行(程序错误)”

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 查看销售订单时,报了一个错误 ...

  5. OO第四单元单元总结

    目录 1.本单元两次作业的架构设计 2.四个单元中架构设计及OO方法理解的演进 3.测试理解与实践的演进 4.课程收获 5.给课程的改进建议 1.本单元两次作业的架构设计 第四单元的两次作业,我的表现 ...

  6. 创建DSN

    DSN:ata Source Name (DSN)的PDO命名惯例为:PDO驱动程序的名称,后面为一个冒号,再后面是可选的驱动程序连接数据库变量信息,如主机名.端口和数据库名. 有三种类型的DSN,三 ...

  7. python基础-5.2装饰器

    1.了解装饰器前准备 #### 第一波 #### def foo(): print 'foo' foo #表示是函数,仅指向了函数的地址,为执行 foo() #表示执行foo函数 #### 第二波 # ...

  8. 第四周实验报告&实验总结

    试验报告2 写一个名为Rectangle的类表示矩形.其属性包括宽width.高height和颜色color,width和height都是double型的,而color则是String类型的.要求该类 ...

  9. 创建Maven项目时,出现系列的错误提示的修改方法

    1.创建Maven项目成功之后,需要修改一些配置, (1).java版本改为“本系统中java的版本号” 问题一:(2).Dynamic Web Module的version要改为2.5以上,然而本人 ...

  10. JAVA总结--java基本语法

    static :静态的~ static :静态变量.静态方法: 被修饰的成员变量或者方法独立于该类的任何对象,只要该类被加载,被修饰的成员变量或者方法就存在并可以使用.  用public修饰的stat ...