如何繪製任意函式的一階導數影象
阿新 • • 發佈:2021-06-23
1,思路
- 根據定義
而為了使得上式在計算機中可計算,就體現出了泰勒展開的重要性
- 使用pytorch的自動求導功能(結合nn.Parameter以及backward()自動求導)
2,例子
'''使用pytorch''' import torch import torch.nn as nn import numpy as np from matplotlib import pyplot as plt aList = np.arange(-10, 10, 0.01) resList = [] gradList = [] func = torch.sin for a in aList: a = nn.Parameter(torch.tensor(a)) b = func(a) resList.append(b.item()) b.backward() gradList.append(a.grad.item()) plt.plot(aList, resList, label='sin') plt.plot(aList, gradList, label='grad') plt.plot(aList, [np.cos(i) for i in aList], '-.', label='cos') plt.legend() plt.savefig('求導.jpg') plt.show()
'''使用定義''' import torch import torch.nn as nn import numpy as np from matplotlib import pyplot as plt aList = np.arange(-10, 10, 0.01) resList = [np.sin(i) for i in aList] gradList = [(torch.sin(torch.tensor(i+0.01, dtype=torch.float64))-torch.sin(torch.tensor(i, dtype=torch.float64))).item()/0.01 for i in resList] plt.plot(aList, resList, label='sin') plt.plot(aList, gradList, label='grad') plt.plot(aList, [np.cos(i) for i in aList], '-.', label='cos') plt.legend() plt.savefig('求導.jpg') plt.show()
3,問題
那麼問題來了,根據定義就算是將tensor轉為torch.float64依舊因為計算的近似導致結果的不準確,那麼pytorch的底層使用什麼方法做到精確求導的呢?