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,并且利用它实现手写体字母的识别.训练数据采用经典的 ...
随机推荐
- 2、hystrix原理
hystrix熔断机制 1.隔离机制 线程隔离: Hystrix在用户请求和服务之间加入了线程池. Hystrix为每个依赖调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队.加速 ...
- B. Ela's Fitness and the Luxury Number
思路: \[能想到平方是比较特殊的,因为x*x一定是x的倍数也就是说\sqrt[2]{x*x} = {x} \] \[所以需要考虑平法之间的数手模一下样例可以发现 [x^2 ,(x+1)^2)之间是x ...
- spirmmvc框架整合手抄版示例,供基础搭建代码对照
注明所有文档和图片完整对照,辟免笔记出错,不能复习 package com.ithm.config; import com.alibaba.druid.pool.DruidDataSource; ...
- Abp.Zero 手机号免密登录验证与号码绑定功能的实现(三):Vue网页端开发
前端代码的框架采用vue.js + elementUI 这套较为简单的方式实现,以及typescript语法更方便阅读. 首先来编写发送验证码函数, 登录,绑定,解绑的业务都需要发送验证码功能,通过c ...
- BES2300方案设计开发阶段总结
前记 从事BES芯片的方案设计已经快三年了 ,这三年,伴随着和BES的一起共同成长,我们做了不少业内大的客户.从去年年初开始接触2300方案开发,到目前为止,已经做出了不少产品.这里就说一下心得体 ...
- 【Atcoder D - Circumferences】并查集
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...
- NJUPT第一次积分赛
NJUPT第一次积分赛 最近在忙第二次积分赛以及一些很复杂的队友关系(人际关系好复杂,好想电赛出个单机模式),但最后结果还是很满意的. 突然想起来第一次积分赛写的屎山,遂拿出来给大火闻闻 没啥很新颖的 ...
- 地理探测器R语言实现:geodetector
本文介绍基于R语言中的geodetector包,依据多张栅格图像数据,实现地理探测器(Geodetector)操作的详细方法. 需要说明的是,在R语言中进行地理探测器操作,可以分别通过geod ...
- Openlayers 加载ArcGIS Server切片服务(自定义切片方案)
背景 最近遇到一个需求,要使用OpenLayer加载ArcGIS Server发布的服务.如果直接拷贝OpenLayer提供的在线官方Demo,然后修改下地图服务地址是跑不通的,这是因为OpenLay ...
- 鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
一.RelativeContainer 1.概述 ArkUI组件中的RelativeContainer是一个相对定位的容器,可以用来将子组件按照相对位置布局. 在RelativeContainer中, ...