Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menarik lengkung fungsi pengaktifan biasa menggunakan Python?

Bagaimana untuk menarik lengkung fungsi pengaktifan biasa menggunakan Python?

PHPz
PHPzke hadapan
2023-04-26 12:01:071735semak imbas

Kerja penyediaan: Muat turun numpy, matplotlib, sympy

pip install numpy matplotlib sympy

Cari dokumentasi untuk perpustakaan yang sepadan:

numpy dokumentasi matplotlib dokumentasi sympy dokumentasi

Diketahui semasa menulis kod vscode tidak akan memformat python saya? Selepas menyemak, ternyata flake8 dan yapf perlu dipasang satu alat spesifikasi kod dan satu lagi ialah alat pemformatan.json

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

, mari lihat cara menulis kod

Langkah pertama ialah mencipta fail py baharu

Pertama tuliskan ungkapan fungsi fungsi pengaktifan cara. Jika anda hanya mendapat hasil pengiraan secara ringkas, sebenarnya, menggunakan numpy sudah cukup, tetapi jika anda perlu mencari terbitan sendiri, anda perlu menggunakan sympy untuk menulis ungkapan berfungsi.

Cara sympy menyatakan fungsi adalah seperti ini:

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 ialah fungsi terbitan sympy

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

Kemudian kami mentakrifkan pengaktifan Ungkapan fungsi

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)

dan kemudian mentakrifkan fungsi terbitan

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

Terdapat masalah di sini, Mengapakah fungsi lain satu, tetapi fungsi softMax mempunyai dua, satu ialah takrifan fungsi softMax, dan satu lagi ialah takrifan fungsi terbitannya?

Mari kita lihat rupa fungsi softMax

Bagaimana untuk menarik lengkung fungsi pengaktifan biasa menggunakan Python?

Penyebut fungsi softMax perlu menulis proses pengumpulan menggunakan numpy.sum tidak boleh digunakan untuk memperoleh terbitan melalui sympy (seseorang boleh, saya tidak tahu mengapa, ia mungkin disebabkan oleh kaedah penggunaan yang berbeza. Jika anda tahu, anda boleh menukarnya.) Dan menggunakan sympy.Sum atau sympy.summation hanya boleh terkumpul daripada i kepada n dalam unit 1 setiap kali

Contohnya: Andaikan Terdapat ungkapan untuk m**x (m dinaikkan kepada kuasa x) sympy.Jumlah(m**x, (x, 0, 100)), maka hasilnya ialah m**100 + m**99 + m**98 … yang tidak dapat memenuhi keperluan dan derivasi tidak dapat dilakukan.

Jadi saya menulis dua fungsi, satu adalah definisi fungsi asal, dan satu lagi adalah definisi fungsi terbitan Seperti yang dinyatakan sebelum ini, jika ia adalah penilaian, ia sebenarnya boleh diselesaikan hanya menggunakan numpy.

Pada ketika ini, semua fungsi dan fungsi terbitan telah ditakrifkan oleh kami

Langkah kedua ialah menggunakan matplotlib untuk melukis lengkung

Pertama , kita perlu tahu matplotlib Apa yang ada

matplotlib terutamanya termasuk Figure, Axes, Axis dan Artist. Saya faham bahawa rajah ialah kanvas, dan kita mesti menyediakan kanvas sebelum melukis rajah itu, kedua-duanya diterjemahkan sebagai paksi, tetapi paksi harus menjadi paksi koordinat, dan paksi ialah salah satu paksi koordinat yang boleh ditambah Elemen

Jika anda ingin melukis graf mudah, anda boleh melakukannya

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.

Kemudian kami bersedia untuk melukis lengkung fungsi kami

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

Selepas menambah laben, saya mempertimbangkan dua kaedah lukisan Satu ialah melukis semua lengkung dalam satu rajah, tetapi bahagikannya kepada paksi yang berbeza

Menggunakan fungsi subplot, rajah boleh dibahagikan kepada 2 baris dan 2 lajur paksi.

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

Yang kedua ialah melukis fungsi yang ditentukan dengan memasukkan nama fungsi

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

Selepas mendapat input

 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;
        )

Itu sahaja persembahan penjual

Bagaimana untuk menarik lengkung fungsi pengaktifan biasa menggunakan Python?

Atas ialah kandungan terperinci Bagaimana untuk menarik lengkung fungsi pengaktifan biasa menggunakan Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam