Comment dessiner des courbes de fonctions d'activation communes en utilisant Python ?

PHPz
Libérer: 2023-04-26 12:01:07
avant
1740 Les gens l'ont consulté

Travail de préparation : Téléchargez numpy, matplotlib, sympy

pip install numpy matplotlib sympy
Copier après la connexion

Trouver la documentation de la bibliothèque correspondante :

documentation numpy documentation matplotlib documentation sympy

Lors de l'écriture du code, j'ai constaté que vscode ne formaterait pas mon python ? Après vérification, il s'avère que flake8 et yapf doivent être installés. L'un est un outil de spécification de code et l'autre est un outil de formatage. Ensuite, configurez settings.json

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

Les préparatifs sont terminés.

La première étape Créez un nouveau fichier py

Écrivez d'abord l'expression de la fonction d'activation. Il existe deux façons de procéder Si vous obtenez simplement les résultats du calcul, il suffit d'utiliser numpy, mais. vous devez toujours trouver la dérivation vous-même, puis vous devez utiliser sympy pour écrire l'expression fonctionnelle.

La façon dont sympy exprime les fonctions est la suivante :

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,这也是表达式
Copier après la connexion

diff est la fonction de dérivation de sympy

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

Ensuite, nous définissons l'expression de la fonction d'activation

def sigmoid():
    """
    定义sigmoid函数
    """
    x = symbols('x')
    return 1. / (1 + exp(-x))
Copier après la connexion
def tanh():
    """
    定义tanh函数
    """
    x = symbols('x')
    return (exp(x) - exp(-x)) / (exp(x) + exp(-x))
Copier après la connexion
def relu():
    """
    定义ReLU函数
    """
    x = symbols('x')
    return Piecewise((0, x < 0), (x, x >= 0))
Copier après la connexion
def leakyRelu():
    """
    定义Leaky ReLu函数
    """
    x = symbols(&#39;x&#39;)
    return Piecewise((0.1 * x, x < 0), (x, x >= 0))
Copier après la connexion
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)
Copier après la connexion
def softmax_derivative(x):
    """
    定义SoftMax导数函数\n
    x - 输入x向量
    """
    s = softMax(x)
    return s * (1 - s)
Copier après la connexion

Ensuite, nous définissons une fonction de dérivation

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

Ici, nous en avons un question, pourquoi toutes les autres fonctions sont-elles une, mais la fonction softMax en a deux, l'une est la définition de la fonction softMax et l'autre est la définition de sa fonction dérivée ?

Regardons à quoi ressemble la fonction softMax

Comment dessiner des courbes de fonctions dactivation communes en utilisant Python ?

Le dénominateur de la fonction softMax doit écrire le processus d'accumulation. L'utilisation de numpy.sum ne peut pas être utilisée pour dériver la dérivation via sympy (quelqu'un peut, je ne le fais pas). Je ne sais pas pourquoi, peut-être qu'il est utilisé différemment, je sais que vous pouvez communiquer) et utiliser sympy.Sum ou sympy.summation ne peut s'accumuler de i à n qu'en unités de 1 à chaque fois

Par exemple : supposons qu'il y ait une expression m **x (m élevé à la puissance x) sympy. Sum(m**x, (x, 0, 100)), le résultat est m**100 + m**99 + m**98 + m*. *1, et le ndarray que j'ai défini est np.arange (-10, 10, 0,05), cela ne peut pas répondre aux exigences et la dérivation ne peut pas être effectuée.

J'ai donc écrit deux fonctions, l'une est la définition de la fonction originale et l'autre est la définition de la fonction dérivée. Et comme je l'ai déjà dit, s'il s'agit d'une évaluation, elle ne peut en fait être complétée qu'avec numpy.

À ce stade, toutes les fonctions et fonctions dérivées ont été définies par nous

La deuxième étape consiste à utiliser matplotlib pour dessiner des courbes

Tout d'abord, nous devons savoir ce que matplotlib a

matplotlib comprend principalement Figure, Axes, axe et artiste. Je comprends que la figure est la toile, et nous devons préparer la toile avant de dessiner la figure ; les axes et les axes sont tous deux traduits en axes, mais les axes doivent être l'axe de coordonnées, et l'axe est l'un des axes de coordonnées que l'artiste peut utiliser ; être ajouté un élément

Si vous souhaitez dessiner un graphique simple, vous pouvez le faire

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.
Copier après la connexion

Ensuite, nous sommes prêts à dessiner notre courbe de fonction

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

Après avoir ajouté laben, j'ai envisagé deux méthodes de dessin. L'une consiste à dessiner toutes les courbes. dans À l'intérieur d'une figure, elle est divisée en différents axes

À l'aide de la fonction subplot, vous pouvez diviser la figure en 2 lignes et 2 colonnes d'axes

plt.subplot(2, 2, 1, adjustable=&#39;box&#39;) # 1行1列
plt.subplot(2, 2, 2, adjustable=&#39;box&#39;) # 1行2列
Copier après la connexion

La seconde consiste à dessiner la fonction spécifiée en saisissant le nom de la fonction

do = input( &#39;input function expression what you want draw(sigmoid, tanh, relu, leakyRelu, softMax)\n&#39; )
Copier après la connexion

Après avoir reçu les commentaires

 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;
        )
Copier après la connexion

Ça y est, voici l'exposition d'un vendeur

Comment dessiner des courbes de fonctions dactivation communes en utilisant Python ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal