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:
Do'stlaringiz bilan baham: |