我是靠谱客的博主 笨笨白开水,这篇文章主要介绍绘图过程中对tensor类型变量的操纵,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import numpy as np import plotly.graph_objects as go import pandas as pd import torch def Rosenbrock(x): f = ((x[1] - x[0] ** 2) ** 2) * 100 + (1 - x[0]) ** 2 return f x = np.arange(-2, 2, 0.05) y = np.arange(-1, 3, 0.05) X, Y = np.meshgrid(x, y) Z = Rosenbrock([X, Y]) z_min = Z.min() x = torch.tensor([-1.2, 2], requires_grad=True) f = Rosenbrock(x) optimizer = torch.optim.Adam([x,]) delta_x = torch.tensor([1.]) opt_step = 0 x_trajectory = [] y_trajectory = [] f_trajectory = [] while f > 0.001 + z_min: x_temp = x.detach().numpy().copy() if opt_step % 1000 == 0: x_trajectory.append(x_temp[0]) y_trajectory.append(x_temp[1]) f_trajectory.append(f.detach().numpy().copy()) optimizer.zero_grad() f.backward() optimizer.step() f = Rosenbrock(x) opt_step = opt_step + 1 Z_df = pd.DataFrame(Z) fig = go.Figure(data=[go.Surface(z=Z_df, x=X, y=Y)]) fig.update_traces(contours_z=dict(show=True, usecolormap=True, highlightcolor="limegreen", project_z=True, start=0, end=2500, size=100)) fig.update_layout(title='Rosenbrock function surface', autosize=True) fig.add_traces(data=go.Scatter3d( x=np.array(x_trajectory), y=np.array(y_trajectory), z=np.array(f_trajectory), marker=dict( size=4, color=np.array(f_trajectory), colorscale='reds' ), line=dict( color='red', width=2 ) )) fig.show()

如图所示

结果图

难点:

  1. 绘图过程中第三方包只对array和list类型变量操作,所以要把tensor变量转换成array变量,转换方法是np.array(x)
  2. tensor类型变量进行赋值时,给别人的都是地址,因此使用append函数构造序列,序列中只有一个值,这个值就是最后一位。解决方案可以是,用copy()函数将tensor类型变量中的值赋给一个新的变量,然后再append。 传递地址≠传递值,很有意思的点。

最后

以上就是笨笨白开水最近收集整理的关于绘图过程中对tensor类型变量的操纵的全部内容,更多相关绘图过程中对tensor类型变量内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部