# coding: utf-8 import sys, os sys.path.append(os.pardir) # 为了导入父目录的文件而进行的设定 import numpy as np import matplotlib.pyplot as plt from collections import OrderedDict from common.optimizer import * def f(x, y): return x**2 / 20.0 + y**2 def df(x, y): return x / 10.0, 2.0*y init_pos = (-7.0, 2.0) params = {} params['x'], params['y'] = init_pos[0], init_pos[1] grads = {} grads['x'], grads['y'] = 0, 0 optimizers = OrderedDict() optimizers["SGD"] = SGD(lr=0.95) optimizers["Momentum"] = Momentum(lr=0.1) optimizers["AdaGrad"] = AdaGrad(lr=1.5) optimizers["Adam"] = Adam(lr=0.3) idx = 1 for key in optimizers: optimizer = optimizers[key] x_history = [] y_history = [] params['x'], params['y'] = init_pos[0], init_pos[1] for i in range(30): x_history.append(params['x']) y_history.append(params['y']) grads['x'], grads['y'] = df(params['x'], params['y']) optimizer.update(params, grads) x = np.arange(-10, 10, 0.01) y = np.arange(-5, 5, 0.01) X, Y = np.meshgrid(x, y) Z = f(X, Y) # for simple contour line mask = Z > 7 Z[mask] = 0 # plot plt.subplot(2, 2, idx) idx += 1 plt.plot(x_history, y_history, 'o-', color="red") plt.contour(X, Y, Z) plt.ylim(-10, 10) plt.xlim(-10, 10) plt.plot(0, 0, '+') #colorbar() #spring() plt.title(key) plt.xlabel("x") plt.ylabel("y") plt.show()
时间: 2024-01-03 10:06:03 浏览: 110
这段代码实现了一个二次函数的优化问题,并比较了不同优化算法的效果。主要实现过程如下:
1. 定义了目标函数 f(x,y) 和其梯度函数 df(x,y)。
2. 初始化优化参数 params 和梯度 grads。
3. 定义了四个优化算法:SGD、Momentum、AdaGrad、Adam。
4. 对于每个优化算法,进行 30 次迭代,记录每一次的参数值,并更新参数。
5. 绘制等高线图,分别展示不同优化算法的优化效果。
在每次迭代中,优化算法根据当前的梯度和学习率,计算出下一步的参数值,并进行更新。不同优化算法的核心区别在于如何计算下一步的参数值以及如何调整学习率。
通过绘制等高线图,我们可以直观地比较不同优化算法的优化效果。图像中每个点的颜色表示该点的目标函数值,我们希望通过调整参数,找到最小值的位置。从图像中可以看出,不同的优化算法在寻找最小值的过程中表现出不同的效果。在本例中,Momentum 和 Adam 算法找到最小值的速度较快,而 SGD 和 AdaGrad 算法则需要更多的迭代次数。
因此,在实际应用中,需要根据具体问题选择合适的优化算法,并调整其参数来获得更好的优化效果。
相关问题
# coding: utf-8 import sys, os from catdog.deep_convnet import DeepConvNet sys.path.append(os.pardir) # 为了导入父目录而进行的设定 import numpy as np import matplotlib.pyplot as plt from input_data import load_data
这段代码是一个 Python 脚本的开头部分,主要包括导入必要的库和模块,以及设置导入路径。具体来说,该脚本导入了 sys、os、numpy、matplotlib.pyplot 和 load_data 函数。其中,sys 和 os 模块用于设置导入路径,numpy 用于处理数组数据,matplotlib.pyplot 用于绘制图表。另外,该脚本还导入了一个 DeepConvNet 类,用于创建深度卷积神经网络模型。该类定义在 catdog.deep_convnet 模块中,因此需要将该模块所在的路径添加到导入路径中。最后,该脚本调用了 load_data 函数,用于加载训练集和测试集数据。
阅读全文