Pytorch-实战之对Himmelblau函数的优化
1.Himmelblau函数
Himmelblau函数:
F(x,y)=(x²+y-11)²+(x+y²-7)²
:具体优化的是,寻找一个最合适的坐标(x,y)使得F(x,y)的值最小。
函数的具体图像,如下图所示:
实现代码
import numpy as np
from matplotlib import pyplot as plt
import torch
# 定义函数
def himmelblau(x_y):
return (x_y[0] ** 2 + x_y[1] - 11) ** 2 + (x_y[0] + x_y[1] ** 2 - 7) ** 2
# 生成x轴数据列表
x = np.arange(-6, 6, 0.1)
# 生成y轴数据列表
y = np.arange(-6, 6, 0.1)
print('x,y range:', x.shape, y.shape)
# 对x,y数据进行网格化,
X, Y = np.meshgrid(x, y)
print('X,Y maps:', X.shape, Y.shape)
# 计算Z轴数据
Z = himmelblau([X, Y])
fig = plt.figure('himmelblau')
ax = fig.gca(projection='3d')
# 绘制3D图形
ax.plot_surface(X, Y, Z)
ax.view_init(60, -30)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()
if __name__ == '__main__':
# [1., 0.], [-4, 0.], [4, 0.]
# x_y存储的是坐标值(x,y),目的就是求解一个最优的x_y。
x_y = torch.tensor([0., 0.], requires_grad=True)
# 定义优化器,优化器的目标就是x_y,学习速率learningrate是0.001
optimizer = torch.optim.Adam([x_y], lr=1e-3)
for step in range(20000):
# 输入坐标,得到预测值
pred = himmelblau(x_y)
# 当网络参量进行反馈时,梯度是被积累的而不是被替换掉,所以把梯度信息清零
optimizer.zero_grad()
# 获取x坐标和y坐标的梯度信息
pred.backward()
# 调用一次.step(),就会优化一次x坐标 x'=x-learningrate*▽x
# 调用一次.step(),就会优化一次y坐标 y'=y-learningrate*▽y
optimizer.step()
if step % 2000 == 0:
print ('step {}: x_y = {}, f(x) = {}'
.format(step, x_y.tolist(), pred.item()))
输出结果
x,y range: (120,) (120,)
X,Y maps: (120, 120) (120, 120)
step 0: x_y = [0.0009999999310821295, 0.0009999999310821295], f(x) = 170.0
step 2000: x_y = [2.3331806659698486, 1.9540694952011108], f(x) = 13.730916023254395
step 4000: x_y = [2.9820079803466797, 2.0270984172821045], f(x) = 0.014858869835734367
step 6000: x_y = [2.999983549118042, 2.0000221729278564], f(x) = 1.1074007488787174e-08
step 8000: x_y = [2.9999938011169434, 2.0000083446502686], f(x) = 1.5572823031106964e-09
step 10000: x_y = [2.999997854232788, 2.000002861022949], f(x) = 1.8189894035458565e-10
step 12000: x_y = [2.9999992847442627, 2.0000009536743164], f(x) = 1.6370904631912708e-11
step 14000: x_y = [2.999999761581421, 2.000000238418579], f(x) = 1.8189894035458565e-12
step 16000: x_y = [3.0, 2.0], f(x) = 0.0
step 18000: x_y = [3.0, 2.0], f(x) = 0.0
Pytorch-实战之对Himmelblau函数的优化的更多相关文章
- 深度学习之PyTorch实战(1)——基础学习及搭建环境
最近在学习PyTorch框架,买了一本<深度学习之PyTorch实战计算机视觉>,从学习开始,小编会整理学习笔记,并博客记录,希望自己好好学完这本书,最后能熟练应用此框架. PyTorch ...
- PyTorch 实战:计算 Wasserstein 距离
PyTorch 实战:计算 Wasserstein 距离 2019-09-23 18:42:56 This blog is copied from: https://mp.weixin.qq.com/ ...
- SQL Server 聚合函数算法优化技巧
Sql server聚合函数在实际工作中应对各种需求使用的还是很广泛的,对于聚合函数的优化自然也就成为了一个重点,一个程序优化的好不好直接决定了这个程序的声明周期.Sql server聚合函数对一组值 ...
- 利用函数索引优化<>
SQL> select count(*),ID from test_2 group by id; COUNT(*) ID ---------- ---------- 131072 1 11796 ...
- 参考《深度学习之PyTorch实战计算机视觉》PDF
计算机视觉.自然语言处理和语音识别是目前深度学习领域很热门的三大应用方向. 计算机视觉学习,推荐阅读<深度学习之PyTorch实战计算机视觉>.学到人工智能的基础概念及Python 编程技 ...
- Pytorch中randn和rand函数的用法
Pytorch中randn和rand函数的用法 randn torch.randn(*sizes, out=None) → Tensor 返回一个包含了从标准正态分布中抽取的一组随机数的张量 size ...
- 深度学习之PyTorch实战(2)——神经网络模型搭建和参数优化
上一篇博客先搭建了基础环境,并熟悉了基础知识,本节基于此,再进行深一步的学习. 接下来看看如何基于PyTorch深度学习框架用简单快捷的方式搭建出复杂的神经网络模型,同时让模型参数的优化方法趋于高效. ...
- 深度学习之PyTorch实战(3)——实战手写数字识别
上一节,我们已经学会了基于PyTorch深度学习框架高效,快捷的搭建一个神经网络,并对模型进行训练和对参数进行优化的方法,接下来让我们牛刀小试,基于PyTorch框架使用神经网络来解决一个关于手写数字 ...
- pytorch中的学习率调整函数
参考:https://pytorch.org/docs/master/optim.html#how-to-adjust-learning-rate torch.optim.lr_scheduler提供 ...
- PyTorch实战:经典模型LeNet5实现手写体识别
在上一篇博客CNN核心概念理解中,我们以LeNet为例介绍了CNN的重要概念.在这篇博客中,我们将利用著名深度学习框架PyTorch实现LeNet5,并且利用它实现手写体字母的识别.训练数据采用经典的 ...
随机推荐
- 使用Kubernetes搭建带有ik分词的Elasticsearch集群
创建好带有Ik分词的es镜像,并上传到镜像仓库中,创建镜像可参考链接中的文档 https://www.cnblogs.com/hi-lijq/p/16895206.html 编写es_cluster- ...
- .Net下的简易Http请求调用(Post与Get)
http请求调用是开发中经常会用到的功能.在内,调用自有项目的Web Api等形式接口时会用到:在外,调用一些第三方功能接口时,也会用到,因为,这些第三方功能往往是通过http地址的形式提供的,比如: ...
- pandas plot函数:数据可视化的快捷通道
一般来说,我们先用pandas分析数据,然后用matplotlib之类的可视化库来显示分析结果.而pandas库中有一个强大的工具--plot函数,可以使数据可视化变得简单而高效. 1. plot 函 ...
- 浅谈IT系统性能优化
一个刚上线的IT系统,往往负载压力不大,所以不会存在什么性能问题.这时,人们大多只关心系统的功能性和用户体验.但是,随着时间推移,用户量和数据量都比刚上线的时候要多很多,高并发和大数据场景下,系统遇到 ...
- chrome 快速执行 snippets 1. F12 2. Ctrl+Shift+P 3. show snippets 4. 上下选择 5. Ctrl + Enter
chrome 快速执行 snippets F12 Ctrl+Shift+P show snippets 上下选择 Ctrl + Enter
- 玉蟾宫(悬线dp)
求最大子矩阵一般用采用悬线法 (包好用的牢底) 悬线法: [ 以这道题为例,我们将R称为障碍格子,将F称为非障碍格子] 我们选择任意一个非障碍格子,引出三条直线:左直 右直 上直 随后从这个点出发,分 ...
- 使用JdbcTemplate
1.使用JdbcTemplate的execute()方法执行SQL语句 Java代码 收藏代码 jdbcTemplate.execute("CREATE TABLE USER (user_ ...
- LinuxDNS分析从入门到放弃(记一次有趣的dns问题排查记录,ping 源码分析,getaddrinfo源码分析)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 ubuntu 18.04 前言 我们这里有一块 ...
- 【AtCoder Beginner Contest 330)】[E - Mex and Update ] 线段树+二分
本题可以用线段树+二分的方式实现.代码如下: import java.io.IOException; import java.io.InputStreamReader; import java.io. ...
- 可视化学习:WebGL实现缩放平移
前言 在上篇文章中,我们使用WebGL实现了网格背景,当时有提到说使用WebGL来实现的好处之一,是网格背景可以与画布上的其他元素更好地融合,比如一起缩放平移,那么在WebGL中怎么实现缩放和平移呢? ...