준비 작업: numpy, matplotlib, Sympy 다운로드
pip install numpy matplotlib sympy
해당 라이브러리의 문서 찾기:
numpy 문서 matplotlib 문서 Sympy 문서
코드를 작성할 때 vscode가 내 Python을 포맷하지 않는 것을 발견했습니다. 확인해 보니 flake8과 yapf가 설치되어 있어야 하는데 하나는 코드 지정 도구이고 다른 하나는 format.json을 구성하는 것입니다. 다음으로 준비가 완료되었습니다. code
첫 번째 단계 새 py 파일 만들기먼저 활성화 함수의 함수 표현식을 작성합니다. 단순히 계산 결과를 얻는다면 numpy를 사용하면 됩니다. 하지만 여전히 파생어를 직접 찾아야 합니다. 그러면 함수형 표현식을 작성하려면 Sympy를 사용해야 합니다.
sympy가 함수를 표현하는 방식은 다음과 같습니다:
"python.linting.flake8Enabled": true, // 规范检查工具 "python.formatting.provider": "yapf", // 格式化工具 "python.linting.flake8Args": ["--max-line-length=248"], // 设置单行最长字符限制 "python.linting.pylintEnabled": false, // 关闭pylint工具
diff는 Sympy의 파생 함수입니다
sympy.core.function.diff(f, *symbols, **kwargs)
그런 다음 활성화 함수의 표현을 정의합니다
from sympy import symbols, evalf, diff # 我们先要定义自变量是什么,这边按需求来,这是文档的例子有两个变量 x, y = symbols('x y') # 然后我们写出函数表达式 expr = x + 2*y # 输出看一下是什么东西 expr # x + 2*y # 接着就要用我们定义的函数了 expr.evalf(subs={x: 10, y: 20}) # 50.000000 # 再对我们的函数求导 diff(expr, x, 1) # 对x进行求导得出结果 1,这也是表达式
def sigmoid(): """ 定义sigmoid函数 """ x = symbols('x') return 1. / (1 + exp(-x))
def tanh(): """ 定义tanh函数 """ x = symbols('x') return (exp(x) - exp(-x)) / (exp(x) + exp(-x))
def relu(): """ 定义ReLU函数 """ x = symbols('x') return Piecewise((0, x < 0), (x, x >= 0))
def leakyRelu(): """ 定义Leaky ReLu函数 """ x = symbols('x') return Piecewise((0.1 * x, x < 0), (x, x >= 0))
def softMax(x: np.ndarray): """ 定义SoftMax函数\n """ exp_x = np.exp(x) print(exp_x, np.sum(exp_x)) return exp_x / np.sum(exp_x)
그런 다음 파생 함수를 정의합니다
def softmax_derivative(x): """ 定义SoftMax导数函数\n x - 输入x向量 """ s = softMax(x) return s * (1 - s)
여기서 가지고 있다 질문 하나, 왜 다른 함수는 모두 하나인데, SoftMax 함수는 2개인데, 하나는 SoftMax 함수의 정의이고, 다른 하나는 그 미분 함수의 정의인가요?
softMax 함수가 어떤 모습인지 살펴보겠습니다
softMax 함수의 분모는 누적 과정을 작성해야 합니다. numpy.sum을 사용하면 Sympy를 통해 파생을 도출할 수 없습니다. 왜인지는 모르겠지만 다르게 사용될 수도 있습니다. 통신할 수 있다는 것을 알고 있습니다.) 그리고 Sympy.Sum 또는 Sympy.summation을 사용하면 매번 1 단위로 i에서 n까지만 누적할 수 있습니다
예: m이라는 표현식이 있다고 가정합니다. **x (m의 x제곱) sumpy.m**x, (x, 0, 100)), 결과는 m**100 + m**99 + m**98 + m*입니다. *1, 그리고 내가 정의한 ndarray는 np.arange (-10, 10, 0.05)입니다. 이는 요구 사항을 충족할 수 없으며 파생을 수행할 수 없습니다.
그래서 두 개의 함수를 작성했는데, 하나는 원래 함수 정의이고 다른 하나는 파생 함수 정의입니다. 그리고 앞서 말했듯이 평가라면 실제로는 numpy로만 완성할 수 있습니다.
이제 모든 함수와 파생 함수는 우리가 정의했습니다
두 번째 단계는 matplotlib를 사용하여 곡선을 그리는 것입니다우선 matplotlib에 무엇이 있는지 알아야 합니다
matplotlib에는 주로 Figure, 축, 축 및 아티스트. 나는 그림이 캔버스이고 그림을 그리기 전에 캔버스를 준비해야 한다는 것을 이해합니다. 축과 축은 모두 축으로 변환되지만 축은 좌표 축이어야 하며 축은 아티스트가 할 수 있는 다른 축입니다. 요소 추가
간단한 그래프를 그리려면 이렇게 하면 됩니다
def derivate(formula, len, variate): """ 定义函数求导 formula:函数公式 len:求导次数 variate:自变量 """ return diff(formula, variate, len)
이제 함수 곡선을 그릴 준비가 되었습니다
x = np.linspace(0, 2, 100) # Sample data. # Note that even in the OO-style, we use `.pyplot.figure` to create the Figure. fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained') ax.plot(x, x, label='linear') # Plot some data on the axes. ax.plot(x, x**2, label='quadratic') # Plot more data on the axes... ax.plot(x, x**3, label='cubic') # ... and some more. ax.set_xlabel('x label') # Add an x-label to the axes. ax.set_ylabel('y label') # Add a y-label to the axes. ax.set_title("Simple Plot") # Add a title to the axes. ax.legend() # Add a legend.
라벤을 추가한 후 두 가지 그리기 방법을 고려했습니다. 하나는 모든 곡선을 그리는 것입니다. in 도형 내부에서는 서로 다른 축으로 나누어져 있습니다
서브플롯 기능을 사용하면 도형을 2행 2열의 축으로 나눌 수 있습니다
plt.xlabel('x label') // 两种方式加label,一种为ax.set_xlabel(面向对象),一种就是这种(面向函数) plt.ylabel('y label')
두 번째는 함수명을 입력하여 지정된 함수를 그리는 것입니다
plt.subplot(2, 2, 1, adjustable='box') # 1行1列 plt.subplot(2, 2, 2, adjustable='box') # 1行2列
입력을 받은 후
do = input( 'input function expression what you want draw(sigmoid, tanh, relu, leakyRelu, softMax)\n' )
이상입니다. 판매자의 쇼를 첨부합니다
위 내용은 Python을 사용하여 일반적인 활성화 함수 곡선을 그리는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!