Teskari tarqalishli neyronlarni (kitobda 7-bob) kelgusi mavzuda kiritasizmi? Agar kelgusi mavzuga kiritmasangiz shu mavzuning oxiridan kiritish kerak
Mantiqiy funksiya misollorini echishga sun'iy neyronni o'rgatish uchun Python dasturi
Download 1.22 Mb.
|
13-mavzu
- Bu sahifa navigatsiya:
- Dastur matni
13.4. Mantiqiy funksiya misollorini echishga sun'iy neyronni o'rgatish uchun Python dasturi
Mantiqiy (AND) funksiyasi bo'yicha misol. Keling, nazariyani misol bilan qo'llab-quvvatlaymiz. Mantiqiy funksiyani (AND) echishga sun'iy neyronni o'rgatish uchun Pythonda dastur yozaylik. Buning uchun dasturimizga uchinchi kirish parmetrini kiritamiz va mantiqiy (AND) funksiyasi misol sifatida qatnashadi. Shuningdek, o'quv sikliga chegara(porog)ni engib o'tish shartini - birlik sakrashni faollashtirish funksiyasini kiritamiz. Dastur matni: import random import numpy as np # Biz w1 = A to'g'ri chiziqning qiyaligi istalgan raqam bilan boshlaymiz w1 = random.uniform(-4, 4) w1_vis = w1 # w1 ning dastlabki vaznnini eslab qolamiz # to'g'ri chiziqning Y o'qi orqali o'tadigan w2 = b parametr tanlaymiz w2 = random.uniform(-4, 4) w2_vis = w2 # w2 vaznining boshlang'ich qiymatini eslab qolamiz # w3 = b ozod parametrni eslab qolamiz w3 = random.uniform(-4, 4) w3_vis = w3 # w3 vaznining boshlang'ich qiymatini eslab qolamiz # Vazn koeffitsientlarining boshlang'ich qiymatlarini chiqarish print ('Dastlabki vaznlar:', '\ nw1 =', w1, '\ nw2 =', w2, '\ nw3 =', w3) # O'qish tezligi lr = 0,001 # Davrlar sonini o'rnatish epochs = 5000 # Birlik faollashtirish funksiyasi uchun chegara o'rnatish bias = 3 # Mantiqiy (AND) funksiyasi uchun ma'lumotlar qatorini yaratish log_and = np.array ([[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 1]]) # Tanlanma bo'yicha ishlash for e in range(epochs): for i in range(log_and.shape[0]): # shape - massivning o'lchamini qaytaradi, [0] - massivdagi qatorlar indeksi # Nuqtaning x1 koordinatasini olamiz x1 = log_and [i, 0] # i - satr, 0 - ustun # Nuqtaning x2 koordinatasini olamiz x2 = log_and [i, 1] # i - satr, 1- ustun # Vaznlar yig’indisi y = (w1 * x1) + (w2 * x2) + w3 if y >= bias: # Chegara(porog)dan oshib ketganda, chiqish - y = 1 bo'lishi kerak y = 1 # Maqsad Y va nuqtalar koordinatasini olamiz target_Y = log_and [i, 2] # i - qator, 2-ustun # Xatolik E = - (maqsad qiymati - neyron chiqishi) E = - (target_Y - y) # Vaznni x1 darajasida o’zgartamiz w1 - = lr * E * x1 # Vaznni x2 darajasida o’zgartamiz w2 - = lr * E * x2 # x3 = 1 da vaznni o’zgartirish w3 - = lr * E else: # Cetlanish (porog) chegarasi oshmaganida, chiqish - y = 0 bo'lishi kerak y = 0 # Maqsad Y va nuqtalar koordinatasini olamiz target_Y = log_and [i, 2] # i - satr, 2 - ustun # Xatolik E = - (maqsad qiymati - neyron chiqishi) E = - (target_Y - y) # Vaznni x1 darajasida o’zgartamiz w1 - = lr * E * x1 # Vaznni x2 darajasida o’zgartamiz w2 - = lr * E * x2 # x3 = 1 da vaznni o’zgartirish w3 - = lr * E # Ma'lumotlarning chiqishi to'g'ridan-to'g'ri tayyor print ('\ nOrgatilgan vaznlar:', '\ nw1 =', w1, '\ nw2 =', w2, '\ nw3 =', w3) print ('\ n mantiqiy funksiyasini (AND) tekshirish:') print('( 0, 0,', int((0*w1 + 0*w2 + w3)>=3), ')') print('( 1, 0,', int((1*w1 + 0*w2+ w3)>=3), ')') print('( 0, 1,', int((0*w1 + 1*w2+ w3)>=3), ')') print('( 1, 1,', int((1*w1 + 1*w2+ w3)>=3), ')') Dastur natijasi: Dastlabki vazn koeffitsientlari: w1 = 0.9491869921653935 w2 = 1.28402471824886 w3 = -0.08281146388163485 O’qitilgan vazn koeffitsientlari: w1 = 1.23318699217 w2 = 1.56802471825 w3 = 0.201188536118 Mantiqiy funksiya (AND)ni tekshirish: ( 0, 0, 0 ) ( 1, 0, 0 ) ( 0, 1, 0 ) ( 1, 1, 1 ) An'anaga ko'ra, dastur kodini tahlil qilaylik. Oldingi kabi, biz dastlabki vaznlarni tasodifiy son bilan -4 dan 4 gacha bo'lgan oraliqda boshlaymiz va keyinroq ko'rsatish uchun saqlaymiz: w1 = tasodifiy.uniform (-4, 4) w1_vis = w1 # Dastlabki w1 vazn koeffitsientni eslaymiz w2 = tasodifiy.uniform (-4, 4) w2_vis = w2 # Dastlabki w2 vazn koeffitsientni eslaymiz w3 = tasodifiy.uniform (-4, 4) w3_vis = w3 # Dastlabki w3 vazn koeffitsientni eslaymiz O'quv tezligi parametrlari va davrlar sonini aniqlagandan so'ng, biz mantiqiy funksiya (AND) ning ikki o'lchovli massivini (o'quv tanlanmasini) yaratamiz: # Mantiqiy (AND) funksiyasi uchun ma'lumotlar qatorini yaratamiz log_and = np.array ([[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 1]]) Ikki o'lchovli qatorni indekslash qiyin emas: Masalan, biz 0-ustunga, 1-qatorga murojaat qilmoqchi bo'lsak: Buning uchun Python-da quyidagi yozuv kerak: array[1, 0] Kvadrat qavslarning birinchi raqami (1) matritsaning qator indeksi, ikkinchisi (0) ustun indeksidir. Ikki o'lchovli matritsani indekslashni quyidagicha tasavvur qilishimiz mumkin:
Dasturda mantiqiy funksiya massivining dastlabki 2 ta ustuni kirish ma'lumotlarini, 3 - ustun esa chiqish (maqsad) qiymatlarini aks ettiradi. O'quv sikli quyidagicha bo'ladi: # Tanlanma bo'yicha ishlash for e in range(epochs): for i in range(log_and.shape[0]): # shape - massivning o'lchamini qaytaradi, [0] - matritsadagi qatorlar soni indeksi Bu erda log_and.shape[0]: метод shape - qatorlar va ustunlar sonini qaytaradi, ularning qiymatlari funksiyaning 0 va 1 manzillarida joylashgan bo’ladi. Kvadrat qavsda biz ushbu funksiyani faqat massivdagi qatorlarini o'z ichiga olgan 0 elementiga murojaat qilganimiz sababli, biz mos ravishda davrlarda joylashtirilgan 4 ta operatsiyaning siklini olamiz. Keyin, o'quv tanlanmasining har bir qatori uchun kirish ma'lumotlarining koordinatalarini olamiz (mantiqiy funksiya (AND)): # Nuqtaning x1 koordinatasini olish x1 = log_and [i, 0] # i - satr, 0 - ustun # Nuqtaning x2 koordinatasini olish x2 = log_and [i, 1] # i - qator, 1 - ustun Biz vazn yig’indisini hisoblaymiz: # Vazn yig’indisi y = (w1 * x1) + (w2 * x2) + w3 Nihoyat, biz birlik sakrashni faollashtirish funksiyasi uchun sharoit yaratamiz: if y >= bias: # Chegara(porog)dan oshib ketganda, chiqish - y = 1 bo'lishi kerak y = 1 # Maqsad Y va nuqta koordinatasini olish target_Y = log_and [i, 2] # i - qator, 2 - ustun # Xatolik E = - (maqsad qiymati - neyron chiqishi) E = - (target_Y - y) # Vaznni x1 darajasida o’zgartamiz w1 - = lr * E * x1 # Vaznni x2 darajasida o’zgartamiz w2 - = lr * E * x2 # Vaznni x3 = 1 ga o’zgartamiz w3 - = lr * E else: # Chegara(porog)dan oshib ketganda, chiqish - y = 0 bo'lishi kerak y = 0 # Maqsad Y va nuqta koordinatasini olish target_Y = log_and [i, 2] # i - qator, 2 - ustun # Xatolik E = - (maqsad qiymati - neyron chiqishi) E = - (target_Y - y) # Vaznni x1 darajasida o’zgartamiz w1 - = lr * E * x1 # Vaznni x2 darajasida o’zgartamiz w2 - = lr * E * x2 # Vaznni x3 = 1 ga o’zgartamiz w3 - = lr * E Bu erda hamma narsa juda oddiy. Agar vaznlar yig’indisi chegara (porog) qiymatiga teng yoki undan oshsa, u holda javobning to'g'ri ekanligini bildiruvchi 1 qiymatini olish kerak: # Chegara(porog)dan oshib ketganda, chiqish - y = 1 bo'lishi kerak y = 1 O'quv tanlanmamizdan biz javobni (maqsad qiymati) olamiz: # Maqsad Y va nuqta koordinatasini olish target_Y = log_and [i, 2] # i - qator, 2 - ustun Sizga yana bir bor eslatib qo'yaman, bu erda biz mantiqiy funksiyalar qatori ustunining i - qatori 2 -ustuniga, ya'ni maqsad qiymat (chiqish)lariga murojaat qilmoqdamiz. Keyin, biz xatolikni hisoblaymiz va vazn koeffitsientlarini o'zgartiramiz, barchasi avvalgidek takrorlanadi: # Xatolik E = - (maqsad qiymati - neyron chiqishi) E = - (target_Y - y) # Vaznni x1 darajasida o’zgartamiz w1 - = lr * E * x1 # Vaznni x2 darajasida o’zgartamiz w2 - = lr * E * x2 # Vaznni x3 = 1 ga o’zgartamiz w3 - = lr * E Agarda vaznlar yig’indisi chegara(porog) qiymatidan kam bo’lsa, u holda neyronning chiqishi 0 ga teng bo’ladi: # chegara(porog) qiymati oshmaganida, chiqish - y = 0 bo'lishi kerak y = 0 Keyin biz xatoni hisoblaymiz va vazn koeffitsientlarini o'zgartiramiz. Undan keyin biz o’qitishdan so'ng olamizan vaznlarni chiqaramiz va mantiqiy funksiyani o'qitilgan koeffitsientlar bilan tekshiramiz: # Ma'lumotlarni chiqishi to'g'ridan-to'g'ri tayyor print ('\ nOrgatilgan vaznlar:', '\ nw1 =', w1, '\ nw2 =', w2, '\ nw3 =', w3) print ('\ n mantiqiy funksiyasini (AND) tekshirish:') print('( 0, 0,', int((0*w1 + 0*w2 + w3)>=3), ')') print ('(1, 0,', int ((1 * w1 + 0 * w2 + w3)> = 3), ')') print ('(0, 1,', int ((0 * w1 + 1 * w2 + w3)> = 3), ')') print ('(1, 1,', int ((1 * w1 + 1 * w2 + w3)> = 3), ')') Dastur natijasi: Dastlabki vazn koeffitsientlar: w1 = 0.9491869921653935 w2 = 1.28402471824886 w3 = -0.08281146388163485 O’qitilgan (o’qitish natijasida olamizan) vazn koeffitsientlar: w1 = 1.23318699217 w2 = 1.56802471825 w3 = 0.201188536118 (AND) mantiqiy funksiyani tekshirish: ( 0, 0, 0 ) ( 1, 0, 0 ) ( 0, 1, 0 ) ( 1, 1, 1 ) Ushbu kodni quyidagi havola orqali topishingiz mumkin: Download 1.22 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling