搜索
首页后端开发Python教程使用 Python 和 NumPy 为神经网络创建简单高效的遗传算法

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

这是有关 ML 进化算法课程的第一篇文章。

当你知道神经网络的参数,但不知道输出应该是什么时,就需要遗传算法,例如,这个算法可以用来玩 Google Dinosaur 或 Flappy Bird,因为你不知道输出应该是什么,但您有能力对最可行的选项进行排序,例如按时间,这称为适应度函数。

我一直没能找到这样一个有效、简单且可用的算法,所以我开始创建自己的轻量级、简单、完美运行的遗传算法。

我的目的不是拖拖拉拉地写这篇文章,也不是用它的篇幅来折磨读者,所以我们直接上代码吧。正如已经提到的,代码很简单,所以大部分内容不需要在整篇文章中描述。

首先我们需要导入模块:

import numpy as np
import random

然后我们添加Dataset及其答案,但不使用反向传播算法,而只是简单地统计正确答案的数量。然后你可以在其他变体上进行测试,这些变体现在已被注释掉

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

添加列表和激活函数。这些列表的含义稍后将会变得清晰。第一个激活函数是 sigmoid,第二个是阈值。

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]

接下来,我们需要创建两个类,第一个类用于创建初始群体,第二个类用于所有后续群体,因为第一次我们需要随机创建权重,然后仅交叉和使它们变异。 init() 函数用于创建或添加权重,predict() 是算法本身和计算最佳选项所必需的,Fredict() 函数的不同之处在于它返回答案和适应度函数来显示数字在屏幕上查看训练阶段。在输出层,首先使用 sigmoid 函数使答案更接近其中一个选项,然后才使用阈值函数。

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

第一个周期过去了,在这里以及随后的所有周期中,我们只给出了六个问题来检查它如何处理任务,而它还没有满足,也就是说,我们检查它是否临时抱佛脚,这种情况有时会发生。现在让我们更详细地讨论一下:根据它正确回答了多少个答案,我们将其分配给其中一个类,如果大量答案是正确的,那么我们必须支持这样的神经网络并增加其数量,以便随着随后的变异将会出现更多更聪明的人,要理解这一点,你可以想象100个人中有一个天才,但这对于每个人来说是不够的,这意味着他的天才将在下一代中消失,这意味着神经网络要么学习速度非常慢,要么根本不存在,为了避免这种情况,我们增加了循环中具有大量正确答案的神经网络的数量。最后,我们清空主 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]])

交叉和变异本身:我们从第一个亲本中取出一部分,从第二个中取出第二部分,进行变异,然后我们在 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 次(这是一个超参数,所以你可以自己选择 epoch 的数量,15 对我来说就足够了),我们在第一个 epoch 上显示答案,第 1000 个是最终版本(如果你有,例如,20,然后指定 20)。这里代码是重复的,所以我就不描述了,一切都很清楚了。

import numpy as np
import random

这就是神经网络应该找到的模式,这就是最终版本所依赖的数字(第一,第二,第三)并忽略其余的。例如,您可以执行逻辑运算(XOR、NOT、AND ...),仅在这种情况下,在网络类中将输入数据更改为 2,我还遵循隐藏层中的神经元等于输入的规则数据乘以二,它起作用了,但是你可以尝试你的选择,向神经网络提供相同数量的一些答案和其他答案也很重要,以便正确答案的数量,例如“a”,将等于“b”,否则神经网络将回答所有答案同样的方式,也就是说,如果有更多的 a,那么它会回答所有问题,但不会有任何结果,也在训练样本中给它完全不同的选项,以便它理解模式,例如,如果你一个XOR块,那么你必须添加一个带有两个1的选项,但是在逻辑运算的情况下,你必须给出所有选项,因为它们太少了,它不会理解任何东西。
就是这样!!!下一篇文章(必读!):很快……
代码:https://github.com/LanskoyKirill/GenNumPy.git

我的网站(可能正在重新设计):selfrobotics.space

以上是使用 Python 和 NumPy 为神经网络创建简单高效的遗传算法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python是否列表动态阵列或引擎盖下的链接列表?Python是否列表动态阵列或引擎盖下的链接列表?May 07, 2025 am 12:16 AM

pythonlistsareimplementedasdynamicarrays,notlinkedlists.1)他们areStoredIncoNtiguulMemoryBlocks,mayrequireRealLealLocationWhenAppendingItems,EmpactingPerformance.2)LinkesedlistSwoldOfferefeRefeRefeRefeRefficeInsertions/DeletionsButslowerIndexeDexedAccess,Lestpypytypypytypypytypy

如何从python列表中删除元素?如何从python列表中删除元素?May 07, 2025 am 12:15 AM

pythonoffersFourmainMethodStoreMoveElement Fromalist:1)删除(值)emovesthefirstoccurrenceofavalue,2)pop(index)emovesanderturnsanelementataSpecifiedIndex,3)delstatementremoveselemsbybybyselementbybyindexorslicebybyindexorslice,and 4)

试图运行脚本时,应该检查是否会遇到'权限拒绝”错误?试图运行脚本时,应该检查是否会遇到'权限拒绝”错误?May 07, 2025 am 12:12 AM

toresolvea“ dermissionded”错误Whenrunningascript,跟随台词:1)CheckAndAdjustTheScript'Spermissions ofchmod xmyscript.shtomakeitexecutable.2)nesureThEseRethEserethescriptistriptocriptibationalocatiforecationAdirectorywherewhereyOuhaveWritePerMissionsyOuhaveWritePermissionsyYouHaveWritePermissions,susteSyAsyOURHomeRecretectory。

与Python的图像处理中如何使用阵列?与Python的图像处理中如何使用阵列?May 07, 2025 am 12:04 AM

ArraysarecrucialinPythonimageprocessingastheyenableefficientmanipulationandanalysisofimagedata.1)ImagesareconvertedtoNumPyarrays,withgrayscaleimagesas2Darraysandcolorimagesas3Darrays.2)Arraysallowforvectorizedoperations,enablingfastadjustmentslikebri

对于哪些类型的操作,阵列比列表要快得多?对于哪些类型的操作,阵列比列表要快得多?May 07, 2025 am 12:01 AM

ArraySaresificatificallyfasterthanlistsForoperationsBenefiting fromDirectMemoryAcccccccCesandFixed-Sizestructures.1)conscessingElements:arraysprovideconstant-timeaccessduetocontoconcotigunmorystorage.2)iteration:araysleveragececacelocality.3)

说明列表和数组之间元素操作的性能差异。说明列表和数组之间元素操作的性能差异。May 06, 2025 am 12:15 AM

ArraySareBetterForlement-WiseOperationsDuetofasterAccessCessCessCessCessCessAndOptimizedImplementations.1)ArrayshaveContiguucuulmemoryfordirectAccesscess.2)列出sareflexible butslible dueTopotentEnallymideNamicizing.3)forlarargedAtaTasetsetsetsetsetsetsetsetsetsetsetlib

如何有效地对整个Numpy阵列进行数学操作?如何有效地对整个Numpy阵列进行数学操作?May 06, 2025 am 12:15 AM

在NumPy中进行整个数组的数学运算可以通过向量化操作高效实现。 1)使用简单运算符如加法(arr 2)可对数组进行运算。 2)NumPy使用C语言底层库,提升了运算速度。 3)可以进行乘法、除法、指数等复杂运算。 4)需注意广播操作,确保数组形状兼容。 5)使用NumPy函数如np.sum()能显着提高性能。

您如何将元素插入python数组中?您如何将元素插入python数组中?May 06, 2025 am 12:14 AM

在Python中,向列表插入元素有两种主要方法:1)使用insert(index,value)方法,可以在指定索引处插入元素,但在大列表开头插入效率低;2)使用append(value)方法,在列表末尾添加元素,效率高。对于大列表,建议使用append()或考虑使用deque或NumPy数组来优化性能。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。