ホームページ > バックエンド開発 > Python チュートリアル > Python と NumPy を使用してニューラル ネットワーク用のシンプルで効率的な遺伝的アルゴリズムを作成する

Python と NumPy を使用してニューラル ネットワーク用のシンプルで効率的な遺伝的アルゴリズムを作成する

Susan Sarandon
リリース: 2024-12-13 00:50:10
オリジナル
785 人が閲覧しました

Creating a simple and efficient genetic algorithm for a neural network with Python and NumPy

これは、ML の進化アルゴリズムに関するコースの最初の記事です。

遺伝的アルゴリズムは、ニューラル ネットワークのパラメーターはわかっているが、出力がどのようなものであるかわからない場合に必要です。たとえば、このアルゴリズムは、Google 恐竜や Flappy Bird をプレイするために使用できます。出力がどうあるべきかはわかりませんが、最も実行可能なオプションを時間などで並べ替えることができます。これはフィットネス関数と呼ばれます。

私はこれまで機能し、シンプルで使いやすいアルゴリズムを見つけることができなかったので、軽量でシンプルで完璧に機能する独自の遺伝的アルゴリズムを作成し始めました。

私の目標は、この記事の執筆を長引かせ、その長さで読者を苦しめることではないので、すぐにコードに進みましょう。すでに述べたように、コードは単純なので、そのほとんどをエッセイ全体で説明する必要はありません。

まずモジュールをインポートする必要があります:

import numpy as np
import random
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、データセットとその回答を追加します。ただし、バックプロパゲーション アルゴリズムは使用せず、単に正解の数をカウントするためです。その後、コメントアウトされた他のバリアントでテストできます

x = np.array([[1, 1, 0], [0, 0, 1], [1, 0, 1], [0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0], [0, 1, 1], [1, 1, 1]])
y = np.array([[0],[1],[1], [0], [0], [0], [0], [1], [1]])

#x = np.array([[0, 1, 1], [0, 0, 1], [1, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 0], [0, 0, 0], [1, 1, 0], [1, 1, 1]])
#y = np.array([[1],[0], [0], [1], [0], [1], [0], [1], [1]])

#x = np.array([[1, 1, 0], [0, 0, 1], [1, 0, 1], [0, 1, 0], [1, 0, 0], [0, 0, 0], [1, 1, 0], [0, 1, 1], [1, 1, 1]])
#y = np.array([[1],[0],[1], [0], [1], [0], [1], [0], [1]])

ログイン後にコピー
ログイン後にコピー

リストとアクティベーション関数を追加します。リストの意味は後で明らかになります。最初の活性化関数はシグモイドで、2 番目はしきい値です。

listNet = []
NewNet = []
goodNET = []
GoodNet0 = []
GoodNet1 = []
GoodNet2 = []
GoodNet3 = []
GoodNet4 = []
GoodNet5 = []
GoodNet6 = []
good = 0
epoch = 0

good = 0
epoch = 0

def sigmoid(x):
    return 1/(1 + np.exp(-x)) 
def finfunc(x):
    if x[0] >= 0.5:
        x[0] = 1
        return x[0]

    else:
        x[0] = 0
        return x[0]
ログイン後にコピー
ログイン後にコピー

次に、2 つのクラスを作成する必要があります。最初のクラスは初期母集団の作成に必要で、2 番目のクラスは後続のすべてのクラスに必要です。初回はランダムに重みを作成し、次に交差と交差のみを行う必要があるためです。それらを変異させます。 init() 関数は重みの作成または追加に使用され、predict() 関数はアルゴリズム自体と最適なオプションの計算に必要です。Fredict() 関数は、答えと数値を表示するための適合関数を返す点で異なります。画面上でトレーニングの段階を確認してください。出力層では、最初にシグモイド関数を使用して答えを選択肢の 1 つに近づけ、次にしきい値関数を使用します。

class Network():
    def __init__(self):
        self.H1 = np.random.randn(3, 6)
        self.O1 = np.random.randn(6, 1)

    def predict(self, x, y):
        t1 = x @ self.H1
        t1 = sigmoid(t1)
        t2 = t1 @ self.O1
        t2 = sigmoid(t2)
        t2 = finfunc(t2)
        if t2 == y[0]:
            global good
            good += 1

    def Fpredict(self, x, y):
        t1 = x @ self.H1
        t1 = sigmoid(t1)
        t2 = t1 @ self.O1
        t2 = sigmoid(t2)
        t2 = finfunc(t2)
        if t2 == y[0]:
            global good
            good += 1
        return t2, good
class Network1():
    def __init__(self, H1, O1):
        self.H1 = H1
        self.O1 = O1


    def predict(self, x, y):
        t1 = x @ self.H1
        t1 = sigmoid(t1)
        t2 = t1 @ self.O1
        t2 = sigmoid(t2)
        t2 = finfunc(t2)
        if t2 == y[0]:
            global good
            good += 1
    def Fpredict(self, x, y):
        t1 = x @ self.H1
        t1 = sigmoid(t1)
        t2 = t1 @ self.O1
        t2 = sigmoid(t2)
        t2 = finfunc(t2)
        if t2 == y[0]:
            global good
            good += 1
        return t2, good
ログイン後にコピー

最初の答えと変数 Good (ここでは適応度関数) を出力し、それを次のニューラル ネットワーク用にリセットします。印刷 'wait0' (ここには何を書いても構いません) が必要です。さまざまなニューラル ネットワークの答えがどこから始まるのか混乱してしまいます。

import numpy as np
import random
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

最初のサイクルが終了します。こことその後のすべてのサイクルでは、タスクが満たされていないタスクにどの程度うまく対処できるかをチェックするために 6 つの質問だけを与えます。つまり、詰め込みをチェックします。これは時々起こります。それでは、さらに詳しく見てみましょう。正解した答えの数に応じて、クラスの 1 つに割り当てます。正解数が多ければ、そのようなニューラル ネットワークをサポートし、その数を増やす必要があります。これを理解するには、100 人に 1 人の天才がいると想像してください。しかし、それはすべての人にとって十分ではありません。これは、彼の天才が次世代で消えていくことを意味します。これは、次のことを意味します。ニューラルネットワークが非常に学習するか、これを避けるために、サイクル内で多数の正解を持つニューラル ネットワークの数を増やします。最後に、メインの listNet リストを空にし、GoodNet リストの新しい値を最良から最悪の順に割り当て、その後の突然変異のために最良の 100 個の個体を切り出します。

x = np.array([[1, 1, 0], [0, 0, 1], [1, 0, 1], [0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0], [0, 1, 1], [1, 1, 1]])
y = np.array([[0],[1],[1], [0], [0], [0], [0], [1], [1]])

#x = np.array([[0, 1, 1], [0, 0, 1], [1, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 0], [0, 0, 0], [1, 1, 0], [1, 1, 1]])
#y = np.array([[1],[0], [0], [1], [0], [1], [0], [1], [1]])

#x = np.array([[1, 1, 0], [0, 0, 1], [1, 0, 1], [0, 1, 0], [1, 0, 0], [0, 0, 0], [1, 1, 0], [0, 1, 1], [1, 1, 1]])
#y = np.array([[1],[0],[1], [0], [1], [0], [1], [0], [1]])

ログイン後にコピー
ログイン後にコピー

交配と突然変異自体: 最初の親から 1 つの部分を取得し、2 番目の親から 2 番目の部分を取得して突然変異し、NewNet リストに子を取得します。つまり 1000 回です。

listNet = []
NewNet = []
goodNET = []
GoodNet0 = []
GoodNet1 = []
GoodNet2 = []
GoodNet3 = []
GoodNet4 = []
GoodNet5 = []
GoodNet6 = []
good = 0
epoch = 0

good = 0
epoch = 0

def sigmoid(x):
    return 1/(1 + np.exp(-x)) 
def finfunc(x):
    if x[0] >= 0.5:
        x[0] = 1
        return x[0]

    else:
        x[0] = 0
        return x[0]
ログイン後にコピー
ログイン後にコピー

コードの前の部分から始めて、Network1() を使用します。これは、交差と変更を行っていますが、ランダムに作成しているわけではないためです。したがって、1000 回繰り返す必要があります (これはハイパーパラメータなので、エポック数を自分で選択できます。私には 15 で十分でした)。最初のエポックで答えを表示し、1000 番目が最終バージョンになります (たとえば、20 の場合は 20 を指定します)。ここではコードが繰り返されているので説明しませんが、すべてが非常に明確です。

import numpy as np
import random
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ニューラル ネットワークが見つける必要があるパターンはこれだけです。これは、最終バージョンが依存する番号 (1 番目、2 番目、3 番目) であり、残りは無視します。たとえば、論理演算 (XOR、NOT、AND ...) を実行できます。この場合のみ、ネットワーク クラスで入力データを 2 だけ変更します。また、隠れ層のニューロンは入力データと等しいというルールに従いました。データを 2 倍するとうまくいきましたが、オプションを試すこともできます。ニューラル ネットワークに同じ数のいくつかの答えと他の答えを提供することも非常に重要です。そうすることで、正解の数 (たとえば「a」)、は「b」に等しくなります。それ以外の場合、ニューラルネットワークはすべての答えに同じように答えます。つまり、さらに a がある場合は、すべてに対して a と答えますが、そこからは何も生まれません。また、パターンを理解できるように、トレーニング サンプルでまったく異なるオプションを与えます。たとえば、XOR ブロックを作成する場合は、2 つのオプションを追加する必要がありますが、論理演算の場合は、オプションが少なすぎて何も理解できないため、すべてのオプションを指定する必要があります。
それでおしまい!!!次の記事 (必読!): もうすぐ…
コード: https://github.com/LanskoyKirill/GenNumPy.git

私のサイト (手直し中の可能性があります): selfrobotics.space

以上がPython と NumPy を使用してニューラル ネットワーク用のシンプルで効率的な遺伝的アルゴリズムを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート