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. ORACLE DG添加redo日志成员

    ORACLE DG在线日志添加日志成员 SQL>select SEQUENCE#,first_time,next_time,APPLIED, THREAD# from v$archived_lo ...

  2. 带有ir的单词

    hire thirty thirteen third sir birthday shirt stir circle dirty skirt affirm affirmation affirmable ...

  3. Vue实现音乐播放器(六):jsonp的应用+抓取轮播图数据

    用jsonp来获取数据   通过封装方法来获取 在src文件夹下的api文件夹里面去封装一些获取相关部分组件的数据的方法 在api文件夹下的recommend.js中 配置一下公共参数 请求的真实的u ...

  4. centos输入正确的账号和密码登陆不进去

    vm下启动centos,输入正确的账号和密码,依然登陆不进去,一直处于这个界面: 暂时的解决方法是:先等待一段时间.重启,然后再输入密码,然后,ctrl+c 不停地ctrl+c,然后就登陆进去了.什么 ...

  5. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_10_字节输入流一次读取一个字节的原理

    原理解析 创建一个字节流,指向读取文件的第一个字节.  read找jvm,jvm找os.os去读取硬盘.,读取后指正向后移动一位

  6. jmeter之分布式压测

    很多性能大牛说一台机器的压测其实不准确,于是搜索网上的分布式压测练习了一番 目录 1.环境准备 2.控制机和压测机配置 3.执行分布式压测 1.环境准备 1.1准备一台windows作为控制机(mas ...

  7. AlertManager警报通知 E-mail 微信 模板

    # AlertManager警报通知 E-mail 微信 模板 #AlertManager配置 #alertmanager.yml # 全局配置项 global: resolve_timeout: 5 ...

  8. 自翻唱龙珠超OP2【限界突破X幸存者】

    娱乐向:自翻唱龙珠超OP2[限界突破X幸存者] 翻唱度盘下载>> MP4: http://video.yingtu.co/0/e20dad3b-14d1-47a4-ad26-196a961 ...

  9. 20191105 《Spring5高级编程》笔记-第16章

    第16章 Web应用程序 16.3 MVC和Spring MVC介绍 16.3.3 Spring MVC WebApplicationContext层次结构 在Spring MVC中,Dispatch ...

  10. java二周的学习总结

    一转眼二周就过去了,个人觉得虽然java和C语言有差异,但差别并不大,因为语法语句方面都是差不多的,因为我上个学期并没有很认真的学好C语言,所以我这个学期更希望学好java,java方面还是挺有趣的, ...