Evolyutsiyalashgan neyron qanday ishlaydi. Xo'sh, endi birinchi evolyutsiyadan keyin sun'iy neyronning ishi bo'yicha barcha xulosalarimizni sinab ko'rish vaqti keldi. Buni amalga oshirish uchun biz Pythondan foydalanishga murojaat qilamiz, lekin avval biz o'zimizning ro'yxatimizni barchasini boshlagan ma'lumotlar bilan ko'rsatamiz (13.2-jadval):
13.2-jadval
Agar biz koordinatalar bo'yicha tekislikdagi nuqtalarni chizadigan bo'lsak, unda ularning qiymatlari funksiya grafigi: y = 2 x + 2.5 qiymatlari yonida joylashganligini sezamiz.
Dastur
tasodifiy import
# Biz istalgan raqam bilan boshlaymiz w1 = A to'g'ri chiziqning qiyaligi
w1 = 0.4
w1_vis = w1 # Nishabning boshlang'ich qiymatini eslaymiz
# W2 = b parametrini ishga tushiring - Y o'qi orqali to'g'ri chiziqning o'tish nuqtasi uchun javobgardir
w2 = randov.uniform (-4, 4)
w2_vis = w2 # Parametrning boshlang'ich qiymatini eslaymiz
# Dastlabki qatorning ma'lumotlar chiqishi
print ('Boshlang'ich satr:', w1, '* X +', w2)
# O’qish tezligi
lr = 0,001
# Davrlar sonini o’rnatish
davrlar = 3000
# X1 kirish ma'lumotlari qatorini (kirish ma'lumotlari tanlanmasi) yaratish
arr_x1 = [1, 2, 3, 3.5, 4, 6, 7.5, 8.5, 9]
# Ikkinchi kirishning kirish ma'lumotlarining qiymati har doim 1 ga teng
x2 = 1
# Bir qator qadriyatlar yaratish (maqsadli qiymatlar)
arr_y = [4.3, 7, 8.0, 10.1, 11.3, 14.2, 18.5, 19.3, 21.4]
# Tanlanma bo'yicha ishlash
oralig'idagi e (davrlar) uchun:
i uchun (len (arr_x1)) oralig'ida: # len (arr) - funksiya qator uzunligini qaytaradi
# Nuqtaning x koordinatasini olamiz
x1 = arr_x1 [i]
# Hisoblangan y, nuqta koordinatasini olamiz
y = w1 * x1 + w2
# Maqsad Y, nuqta koordinatasini olamiz
target_Y = arr_y [i]
# Xatolik E = - (maqsad qiymati - neyron chiqishi)
E = - (target_Y - y)
# Vaznni yangilash qoidasiga binoan vaznni x darajasida o’zgartamiz
w1 - = lr * E * x1
# Vaznni x2 = 1 ga o’zgartamiz
# w2 - = stavka * E * x2 # Chunki x2 = 1 bo'lsa, unda bu omil qoldirilishi mumkin
w2 - = lr * E
# Ma'lumotlarning chiqishi to'g'ridan-to'g'ri tayyor
print ('Tayyor qator:', w1, '* X +', w2)
Tayyor to'g'ri chiziq: 2.058410130422831 * X + 2.5013583972057263 Ushbu kodni boshqalar singari havoladan yuklab olishingiz mumkin: https://github.com/CaniaCan/neuralmaster
Keling, dastur kodini tavsiflaymiz:
Dasturning boshida biz tasodifiy raqamlar bilan ishlash uchun modulni import qilamiz:
import random
Buning yordamida tasodifiy son bilan biz parametrning vazn koeffitsientini yaratamiz (w2 = b) - to'g'ri chiziqning o'qi orqali o'tishi uchun javobgar:
w2 = random.uniform(-4, 4)
Randov modulning usuli, uniform(from, to)- from dan, to gacha, tasodifiy haqiqiy sonni generatsiya qiladi.
Ko'rib turganingizdek, bizning dasturimizda biz ilgari yozganimiz bilan solishtirganda juda ko'p o'zgarishlar mavjud emas. Biz o'zimizning vazn koeffitsientimiz (w2) bilan ikkinchi kiritishni (x2 = 1) qo'shdik. Koeffitsient (A) - vaznkoeffitsienti (w1), parametr (b) - vaznkoeffitsienti (w2) ga o'zgartirildi. Va, albatta, biz yaxshilangan xato funksiyasini va gradient tushish usuli yordamida vaznkoeffitsientlarini yangilashni amalga oshirdik.
Natijada, bizning rivojlangan neyronimiz endi sinflash masalasini juda yaxshi bajaradi. Endi u ma'lumotlarni ikkita kirish usuli bilan sinflashi va shu bilan to'g'ridan-to'g'ri nol nuqtasida emas, balki butun Y o'qi bo'ylab to'g'ri chiziq bilan kesishishi bilan chiziqli sinflagichni olishi mumkin.
Buni ko'rish uchun natijani ko'rib chiqamiz:
Boshlang'ich chiziq: 0.4 * X + 0.3652477754014445
Ko'ryapsizmi! Bizning sun'iy neyronimiz qanday qilib ajoyib ish qiladi. Ko'zlari bilan deyarli farq qilmasa ham, u bemalol chiziqli bo'linishi mumkin edi.
Endi avvalgidek shartni o'rnatamiz. Agar ma'lumotlar sinflash chizig'ining ustida joylashgan bo'lsa, demak bu jirafaning bir turi va pastdagi hamma narsa timsohlardir. Biz buni kirishlarga neyronning ilgari ko'rmagan qiymatlarini etkazib berish va o'qitilgan neyronning qaysi turga mansubligini mustaqil ravishda aniqlay olish-qilmasligini ko'rish orqali amalga oshiramiz.
x1 = input ("X kengligi uchun qiymatni kiriting:")
x1 = int (x1)
T = input ("Y balandligi uchun qiymatni kiriting:")
T = int (T)
y = w1 * x1 + w2
# Shart
agar T & gt; y:
print ('Bu jirafa!')
boshqa:
print ('Bu timsoh!')
Bizning qadriyatlarimizga kirgandan so'ng, jirafalar yoki timsohlar qanday ma'lumot ekanligini tekshiradigan va berilgan savolga javobni qaytaradigan shart kelib chiqadi.
X: 4 kengligi uchun qiymatni kiriting
Y balandligi qiymatini kiriting: 15
Bu jirafa!
Do'stlaringiz bilan baham: |