ホームページ  >  記事  >  バックエンド開発  >  Python を使用して一般的な活性化関数曲線を描くにはどうすればよいですか?

Python を使用して一般的な活性化関数曲線を描くにはどうすればよいですか?

PHPz
PHPz転載
2023-04-26 12:01:071697ブラウズ

準備作業: numpy、matplotlib、sympy のダウンロード

pip install numpy matplotlib sympy

対応するライブラリのドキュメントを見つけます:

numpy ドキュメント matplotlib ドキュメント sympy ドキュメント

コードを書くとき、 vscode が機能していないことがわかりました。Python をフォーマットしますか?確認したところ、flake8とyapfをインストールする必要があることが分かりました。1つはコード指定ツール、もう1つは整形ツールです。そして、設定を行います。json

"python.linting.flake8Enabled": true, // 规范检查工具
"python.formatting.provider": "yapf", // 格式化工具
"python.linting.flake8Args": ["--max-line-length=248"], // 设置单行最长字符限制
"python.linting.pylintEnabled": false, // 关闭pylint工具

準備は完了です。次に、コードの書き方を参照してください

最初のステップは、新しい py ファイルを作成することです

#まず、活性化関数の関数式を書き出します。方法は 2 つあります。計算結果を取得するだけならnumpyを使えば十分ですが、導出を自分で求める必要がある場合はsympyを使って関数式を書く必要があります。

sympy が関数を表現する方法は次のとおりです。

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,这也是表达式

diff は sympy の導出関数です。

sympy.core.function.diff(f, *symbols) , **kwargs)

次に、活性化関数の式を定義します

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(&#39;x&#39;)
    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)

次に、導出関数を定義します

def derivate(formula, len, variate):
    """
    定义函数求导
      formula:函数公式
      len:求导次数
      variate:自变量
    """
    return diff(formula, variate, len)

ここで質問がありますが、なぜですか他の関数はすべて1つですが、softMax関数には2つあり、1つはsoftMax関数の定義、もう1つはその微分関数の定義ですか?

softMax 関数がどのようなものかを見てみましょう

Python を使用して一般的な活性化関数曲線を描くにはどうすればよいですか?

#softMax 関数の分母は累積プロセスを記述する必要があります。 sympy を介して導出を求めるために使用することはできません (誰かはできますが、理由はわかりません。使用方法が異なるためかもしれません。ご存知の場合は、私と連絡を取ることができます)。sympy.Sum または sympy.summation を使用する場合のみ可能です。毎回 1 単位で i から n まで累積します

例: m**x (m の x 乗) の式があると仮定します。 sympy.Sum(m**x, (x , 0, 100)) の場合、結果は m**100 m**99 m**98 … m**1 となり、定義した ndarray は np.arange(-10, 10, 0.05) になります。要件を満たしているため、導出を実行できません。

ということで、元の関数定義と派生関数定義の2つの関数を書きましたが、前述したように評価であれば実はnumpyだけで完結します。

この時点で、すべての関数と導関数は定義されています

2 番目のステップは、matplotlib を使用して曲線を描画することです

最初にmatplotlib とは何ですか?

matplotlib には主に Figure、Axes、Axis、Artist が含まれています。図はキャンバスであることを理解しています。図を描く前にキャンバスを準備する必要があります。軸と軸はどちらも軸として翻訳されますが、軸は座標軸である必要があり、軸は座標軸の 1 つです。アーティストは、それができる他のものです。要素

単純なグラフを描画したい場合は、これを行うことができます

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=&#39;constrained&#39;)
ax.plot(x, x, label=&#39;linear&#39;)  # Plot some data on the axes.
ax.plot(x, x**2, label=&#39;quadratic&#39;)  # Plot more data on the axes...
ax.plot(x, x**3, label=&#39;cubic&#39;)  # ... and some more.
ax.set_xlabel(&#39;x label&#39;)  # Add an x-label to the axes.
ax.set_ylabel(&#39;y label&#39;)  # Add a y-label to the axes.
ax.set_title("Simple Plot")  # Add a title to the axes.
ax.legend()  # Add a legend.

これで、関数曲線を描画する準備が整いました

plt.xlabel(&#39;x label&#39;) // 两种方式加label,一种为ax.set_xlabel(面向对象),一种就是这种(面向函数)
plt.ylabel(&#39;y label&#39;)

labenを追加した後、描画には 2 つの方法があります。1 つは、1 つの図にすべての曲線を描画し、それらを異なる軸に分割する方法です。

subplot 関数を使用して、図を 2 行 2 列の軸に分割します

plt.subplot(2, 2, 1, adjustable=&#39;box&#39;) # 1行1列
plt.subplot(2, 2, 2, adjustable=&#39;box&#39;) # 1行2列

2 つ目は、関数名を入力して指定された関数を描画します

do = input( &#39;input function expression what you want draw(sigmoid, tanh, relu, leakyRelu, softMax)\n&#39; )

入力を取得したら

 try:
        plt.xlabel(&#39;x label&#39;)
        plt.ylabel(&#39;y label&#39;)
        plt.title(do)
        if (do == &#39;softMax&#39;):
            plt.plot(num, softMax(num), label=&#39;Softmax&#39;)
            plt.plot(num, softmax_derivative(num), label=&#39;Softmax Derivative&#39;)
        else:
            plt.plot(
                num,
                [eval(f&#39;{do}()&#39;).evalf(subs={symbols("x"): i}) for i in num])
            plt.plot(num, [
                derivate(eval(f&#39;{do}()&#39;), 1, &#39;x&#39;).evalf(subs={symbols(&#39;x&#39;): i})
                for i in num
            ])

        plt.tight_layout()
        plt.show()
    except TypeError:
        print(
            &#39;input function expression is wrong or the funciton is not configured&#39;
        )

これで完了です。販売者のショーが添付されます

######

以上がPython を使用して一般的な活性化関数曲線を描くにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。