ایجاد یک الگوریتم ژنتیک ساده و کارآمد برای شبکه عصبی با Python و NumPy

Summarize this content to 400 words in Persian Lang
این اولین مقاله از دوره آموزشی در مورد الگوریتم های تکامل در 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]])
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
لیست ها و عملکردهای فعال سازی را اضافه کنید. معنی لیست ها بعدا مشخص خواهد شد. اولین تابع فعال سازی سیگموئید و دومین تابع آستانه است.
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
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ما اولین پاسخ ها و متغیر خوب را که تابع تناسب است در اینجا خروجی می دهیم، سپس آن را برای شبکه عصبی بعدی تنظیم مجدد می کنیم، چاپ 'wait0' (شما می توانید هر چیزی را که می خواهید اینجا بنویسید) لازم است تا در مورد آن گیج نشوید. جایی که پاسخ شبکه های عصبی مختلف آغاز می شود.
s = Network()
print(s.Fpredict(x[0], y[0]))
print(s.Fpredict(x[1], y[1]))
print(s.Fpredict(x[2], y[2]))
print(s.Fpredict(x[3], y[3]))
print(“wait0”)
good = 0
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
چرخه اول می گذرد، در اینجا و در تمام چرخه های بعدی ما فقط شش سؤال می دهیم تا بررسی کنیم که چقدر با کار انجام نشده است، یعنی ما آن را برای جمع شدن بررسی می کنیم، و این گاهی اوقات اتفاق می افتد. و حالا بیایید وارد جزئیات بیشتری شویم: بسته به اینکه چند پاسخ درست پاسخ داده است، آن را به یکی از کلاس ها اختصاص می دهیم، اگر تعداد زیادی درست باشد، باید از چنین شبکه عصبی پشتیبانی کرده و تعداد آن را افزایش دهیم، به طوری که با جهش های بعدی جهش های باهوش تری خواهند داشت، برای درک این موضوع، می توانید تصور کنید که برای 100 نفر یک نابغه وجود دارد، اما برای همه کافی نیست، و این بدان معنی است که نبوغ او در آن محو خواهد شد. در نسلهای بعدی، این بدان معناست که یا شبکه عصبی خیلی آهسته یاد میگیرد یا اصلا وجود نخواهد داشت، برای جلوگیری از این امر، تعداد شبکههای عصبی را با تعداد زیادی پاسخ صحیح در چرخه افزایش میدهیم. در پایان، لیست اصلی listNet را خالی میکنیم، مقادیر جدیدی از لیستهای GoodNet را به ترتیب از بهترین به بدترین به آن اختصاص میدهیم، برای جهش بعدی برای 100 فرد برتر، برشی ایجاد میکنیم.
for s in range (1000):
s = Network()
good = 0
s.predict(x[0], y[0])
s.predict(x[1], y[1])
s.predict(x[2], y[2])
s.predict(x[3], y[3])
s.predict(x[4], y[4])
s.predict(x[5], y[5])
if good == 6:
GoodNet6.append(s)
for r in range(15):
GoodNet4.append(s)
elif good == 5:
GoodNet5.append(s)
for r in range(10):
GoodNet4.append(s)
elif good == 4:
GoodNet4.append(s)
for r in range(5):
GoodNet4.append(s)
elif good == 3:
GoodNet3.append(s)
elif good == 2:
GoodNet2.append(s)
elif good == 1:
GoodNet1.append(s)
elif good == 0:
GoodNet0.append(s)
good = 0
listNet = []
listNet.extend(GoodNet6)
listNet.extend(GoodNet5)
listNet.extend(GoodNet4)
listNet.extend(GoodNet3)
listNet.extend(GoodNet2)
listNet.extend(GoodNet1)
GoodNet1 = []
GoodNet2 = []
GoodNet3 = []
GoodNet4 = []
GoodNet5 = []
GoodNet6 = []
goodNET = listNet[:100]
listNet = goodNET
goodNET = []
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
خود تلاقی و جهش: یک قسمت را از والد اول می گیریم، قسمت دوم را از دومی، جهش می دهیم و یک فرزند در لیست NewNet می گیریم، بنابراین 1000 بار.
for g in range(1000):
parent1 = random.choice(listNet)
parent2 = random.choice(listNet)
ch1H = np.vstack((parent1.H1[:1], parent2.H1[1:])) * random.uniform(-0.2, 0.2)
ch1O = parent1.O1 * random.uniform(-0.2, 0.2)
g = Network1(ch1H, ch1O)
NewNet.append(g)
listNet = NewNet
NewNet = []
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
با شروع از قسمت قبلی کد، از Network1() استفاده می کنیم، زیرا اکنون در حال عبور و جهش هستیم، اما به صورت تصادفی ایجاد نمی کنیم. بنابراین باید 1000 بار تکرار کنیم (این یک فراپارامتر است، بنابراین شما می توانید تعداد دوره ها را خودتان انتخاب کنید، 15 دوره برای من کافی بود)، پاسخ ها را در دوره اول نشان می دهیم و 1000 نسخه نهایی است (اگر دارید، به عنوان مثال، 20، سپس 20 را مشخص کنید). در اینجا کد تکرار می شود، بنابراین من آن را توصیف نمی کنم، همه چیز در آنجا بسیار واضح است.
for i in range(1000):
good = 0
epoch += 1
for s in listNet:
good = 0
s.predict(x[0], y[0])
s.predict(x[1], y[1])
s.predict(x[2], y[2])
s.predict(x[3], y[3])
s.predict(x[4], y[4])
s.predict(x[5], y[5])
if good == 6:
GoodNet6.append(s)
for r in range(15):
GoodNet4.append(s)
elif good == 5:
GoodNet5.append(s)
for r in range(10):
GoodNet4.append(s)
elif good == 4:
GoodNet4.append(s)
for r in range(5):
GoodNet4.append(s)
elif good == 3:
GoodNet3.append(s)
elif good == 2:
GoodNet2.append(s)
elif good == 1:
GoodNet1.append(s)
elif good == 0:
GoodNet0.append(s)
good = 0
listNet = []
listNet.extend(GoodNet6)
listNet.extend(GoodNet5)
listNet.extend(GoodNet4)
listNet.extend(GoodNet3)
listNet.extend(GoodNet2)
listNet.extend(GoodNet1)
GoodNet1 = []
GoodNet2 = []
GoodNet3 = []
GoodNet4 = []
GoodNet5 = []
GoodNet6 = []
goodNET = listNet[:100]
listNet = goodNET
goodNET = []
if epoch == 1000:
print(listNet[0].Fpredict(x[0], y[0]))
print(listNet[0].Fpredict(x[1], y[1]))
print(listNet[0].Fpredict(x[2], y[2]))
print(listNet[0].Fpredict(x[3], y[3]))
print(listNet[0].Fpredict(x[4], y[4]))
print(listNet[0].Fpredict(x[5], y[5]))
print(listNet[0].Fpredict(x[6], y[6]))
print(listNet[0].Fpredict(x[7], y[7]))
print(listNet[0].Fpredict(x[8], y[8]))
good = 0
print(‘wait’)
elif epoch == 1:
good = 0
print(listNet[0].Fpredict(x[0], y[0]))
print(listNet[0].Fpredict(x[1], y[1]))
print(listNet[0].Fpredict(x[2], y[2]))
print(listNet[0].Fpredict(x[3], y[3]))
print(‘wait1’)
for g in range(1000):
parent1 = random.choice(listNet)
parent2 = random.choice(listNet)
ch1H = np.vstack((parent1.H1[:1], parent2.H1[1:])) * random.uniform(-2, 2)
ch1O = parent1.O1 * random.uniform(2, 2)
g = Network1(ch1H, ch1O)
NewNet.append(g)
listNet = NewNet
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این همه است، الگویی که شبکه عصبی باید پیدا کند، این همان چیزی است که نسخه نهایی به عدد (اول، دوم، سوم) وابسته است و بقیه را نادیده می گیرد. شما می توانید به عنوان مثال عملیات منطقی (XOR، NOT، AND …) را انجام دهید، فقط در این مورد در کلاس شبکه داده های ورودی را دو برابر تغییر دهید، من همچنین از قانون پیروی کردم که نورون ها در لایه پنهان برابر با ورودی هستند. داده ها در دو ضرب شد، کار کرد، اما می توانید گزینه های خود را امتحان کنید، همچنین بسیار مهم است که شبکه عصبی را با همان تعداد پاسخ و سایر پاسخ ها ارائه دهید، به طوری که تعداد پاسخ های صحیح، به عنوان مثال “a”، برابر خواهد بود به “b”، در غیر این صورت شبکه عصبی به همه پاسخ ها یکسان پاسخ می دهد، یعنی اگر a بیشتر باشد، به همه چیز پاسخ a را می دهد و چیزی از آن در نمی آید، همچنین در نمونه آموزشی گزینه های کاملاً متفاوتی به آن بدهید. به طوری که الگو را بفهمد، مثلاً اگر یک بلوک XOR بسازید، باید یک گزینه با دو گزینه اضافه کنید، اما در مورد عملیات منطقی، باید همه گزینه ها را بدهید، زیرا تعداد آنها بسیار کم است. آنها و هیچ چیز نمی فهمد. همین!!! مطلب بعدی (حتما بخوانید!): به زودی…کد: https://github.com/LanskoyKirill/GenNumPy.git
سایت من (ممکن است در حال بازسازی باشد): selfrobotics.space
این اولین مقاله از دوره آموزشی در مورد الگوریتم های تکامل در 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]])
لیست ها و عملکردهای فعال سازی را اضافه کنید. معنی لیست ها بعدا مشخص خواهد شد. اولین تابع فعال سازی سیگموئید و دومین تابع آستانه است.
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
ما اولین پاسخ ها و متغیر خوب را که تابع تناسب است در اینجا خروجی می دهیم، سپس آن را برای شبکه عصبی بعدی تنظیم مجدد می کنیم، چاپ 'wait0' (شما می توانید هر چیزی را که می خواهید اینجا بنویسید) لازم است تا در مورد آن گیج نشوید. جایی که پاسخ شبکه های عصبی مختلف آغاز می شود.
s = Network()
print(s.Fpredict(x[0], y[0]))
print(s.Fpredict(x[1], y[1]))
print(s.Fpredict(x[2], y[2]))
print(s.Fpredict(x[3], y[3]))
print("wait0")
good = 0
چرخه اول می گذرد، در اینجا و در تمام چرخه های بعدی ما فقط شش سؤال می دهیم تا بررسی کنیم که چقدر با کار انجام نشده است، یعنی ما آن را برای جمع شدن بررسی می کنیم، و این گاهی اوقات اتفاق می افتد. و حالا بیایید وارد جزئیات بیشتری شویم: بسته به اینکه چند پاسخ درست پاسخ داده است، آن را به یکی از کلاس ها اختصاص می دهیم، اگر تعداد زیادی درست باشد، باید از چنین شبکه عصبی پشتیبانی کرده و تعداد آن را افزایش دهیم، به طوری که با جهش های بعدی جهش های باهوش تری خواهند داشت، برای درک این موضوع، می توانید تصور کنید که برای 100 نفر یک نابغه وجود دارد، اما برای همه کافی نیست، و این بدان معنی است که نبوغ او در آن محو خواهد شد. در نسلهای بعدی، این بدان معناست که یا شبکه عصبی خیلی آهسته یاد میگیرد یا اصلا وجود نخواهد داشت، برای جلوگیری از این امر، تعداد شبکههای عصبی را با تعداد زیادی پاسخ صحیح در چرخه افزایش میدهیم. در پایان، لیست اصلی listNet را خالی میکنیم، مقادیر جدیدی از لیستهای GoodNet را به ترتیب از بهترین به بدترین به آن اختصاص میدهیم، برای جهش بعدی برای 100 فرد برتر، برشی ایجاد میکنیم.
for s in range (1000):
s = Network()
good = 0
s.predict(x[0], y[0])
s.predict(x[1], y[1])
s.predict(x[2], y[2])
s.predict(x[3], y[3])
s.predict(x[4], y[4])
s.predict(x[5], y[5])
if good == 6:
GoodNet6.append(s)
for r in range(15):
GoodNet4.append(s)
elif good == 5:
GoodNet5.append(s)
for r in range(10):
GoodNet4.append(s)
elif good == 4:
GoodNet4.append(s)
for r in range(5):
GoodNet4.append(s)
elif good == 3:
GoodNet3.append(s)
elif good == 2:
GoodNet2.append(s)
elif good == 1:
GoodNet1.append(s)
elif good == 0:
GoodNet0.append(s)
good = 0
listNet = []
listNet.extend(GoodNet6)
listNet.extend(GoodNet5)
listNet.extend(GoodNet4)
listNet.extend(GoodNet3)
listNet.extend(GoodNet2)
listNet.extend(GoodNet1)
GoodNet1 = []
GoodNet2 = []
GoodNet3 = []
GoodNet4 = []
GoodNet5 = []
GoodNet6 = []
goodNET = listNet[:100]
listNet = goodNET
goodNET = []
خود تلاقی و جهش: یک قسمت را از والد اول می گیریم، قسمت دوم را از دومی، جهش می دهیم و یک فرزند در لیست NewNet می گیریم، بنابراین 1000 بار.
for g in range(1000):
parent1 = random.choice(listNet)
parent2 = random.choice(listNet)
ch1H = np.vstack((parent1.H1[:1], parent2.H1[1:])) * random.uniform(-0.2, 0.2)
ch1O = parent1.O1 * random.uniform(-0.2, 0.2)
g = Network1(ch1H, ch1O)
NewNet.append(g)
listNet = NewNet
NewNet = []
با شروع از قسمت قبلی کد، از Network1() استفاده می کنیم، زیرا اکنون در حال عبور و جهش هستیم، اما به صورت تصادفی ایجاد نمی کنیم. بنابراین باید 1000 بار تکرار کنیم (این یک فراپارامتر است، بنابراین شما می توانید تعداد دوره ها را خودتان انتخاب کنید، 15 دوره برای من کافی بود)، پاسخ ها را در دوره اول نشان می دهیم و 1000 نسخه نهایی است (اگر دارید، به عنوان مثال، 20، سپس 20 را مشخص کنید). در اینجا کد تکرار می شود، بنابراین من آن را توصیف نمی کنم، همه چیز در آنجا بسیار واضح است.
for i in range(1000):
good = 0
epoch += 1
for s in listNet:
good = 0
s.predict(x[0], y[0])
s.predict(x[1], y[1])
s.predict(x[2], y[2])
s.predict(x[3], y[3])
s.predict(x[4], y[4])
s.predict(x[5], y[5])
if good == 6:
GoodNet6.append(s)
for r in range(15):
GoodNet4.append(s)
elif good == 5:
GoodNet5.append(s)
for r in range(10):
GoodNet4.append(s)
elif good == 4:
GoodNet4.append(s)
for r in range(5):
GoodNet4.append(s)
elif good == 3:
GoodNet3.append(s)
elif good == 2:
GoodNet2.append(s)
elif good == 1:
GoodNet1.append(s)
elif good == 0:
GoodNet0.append(s)
good = 0
listNet = []
listNet.extend(GoodNet6)
listNet.extend(GoodNet5)
listNet.extend(GoodNet4)
listNet.extend(GoodNet3)
listNet.extend(GoodNet2)
listNet.extend(GoodNet1)
GoodNet1 = []
GoodNet2 = []
GoodNet3 = []
GoodNet4 = []
GoodNet5 = []
GoodNet6 = []
goodNET = listNet[:100]
listNet = goodNET
goodNET = []
if epoch == 1000:
print(listNet[0].Fpredict(x[0], y[0]))
print(listNet[0].Fpredict(x[1], y[1]))
print(listNet[0].Fpredict(x[2], y[2]))
print(listNet[0].Fpredict(x[3], y[3]))
print(listNet[0].Fpredict(x[4], y[4]))
print(listNet[0].Fpredict(x[5], y[5]))
print(listNet[0].Fpredict(x[6], y[6]))
print(listNet[0].Fpredict(x[7], y[7]))
print(listNet[0].Fpredict(x[8], y[8]))
good = 0
print('wait')
elif epoch == 1:
good = 0
print(listNet[0].Fpredict(x[0], y[0]))
print(listNet[0].Fpredict(x[1], y[1]))
print(listNet[0].Fpredict(x[2], y[2]))
print(listNet[0].Fpredict(x[3], y[3]))
print('wait1')
for g in range(1000):
parent1 = random.choice(listNet)
parent2 = random.choice(listNet)
ch1H = np.vstack((parent1.H1[:1], parent2.H1[1:])) * random.uniform(-2, 2)
ch1O = parent1.O1 * random.uniform(2, 2)
g = Network1(ch1H, ch1O)
NewNet.append(g)
listNet = NewNet
این همه است، الگویی که شبکه عصبی باید پیدا کند، این همان چیزی است که نسخه نهایی به عدد (اول، دوم، سوم) وابسته است و بقیه را نادیده می گیرد. شما می توانید به عنوان مثال عملیات منطقی (XOR، NOT، AND …) را انجام دهید، فقط در این مورد در کلاس شبکه داده های ورودی را دو برابر تغییر دهید، من همچنین از قانون پیروی کردم که نورون ها در لایه پنهان برابر با ورودی هستند. داده ها در دو ضرب شد، کار کرد، اما می توانید گزینه های خود را امتحان کنید، همچنین بسیار مهم است که شبکه عصبی را با همان تعداد پاسخ و سایر پاسخ ها ارائه دهید، به طوری که تعداد پاسخ های صحیح، به عنوان مثال “a”، برابر خواهد بود به “b”، در غیر این صورت شبکه عصبی به همه پاسخ ها یکسان پاسخ می دهد، یعنی اگر a بیشتر باشد، به همه چیز پاسخ a را می دهد و چیزی از آن در نمی آید، همچنین در نمونه آموزشی گزینه های کاملاً متفاوتی به آن بدهید. به طوری که الگو را بفهمد، مثلاً اگر یک بلوک XOR بسازید، باید یک گزینه با دو گزینه اضافه کنید، اما در مورد عملیات منطقی، باید همه گزینه ها را بدهید، زیرا تعداد آنها بسیار کم است. آنها و هیچ چیز نمی فهمد.
همین!!! مطلب بعدی (حتما بخوانید!): به زودی…
کد: https://github.com/LanskoyKirill/GenNumPy.git
سایت من (ممکن است در حال بازسازی باشد): selfrobotics.space