Гарчиг[Нуух][Үзүүлэх]
Тархи нь мэдрэлийн сүлжээтэй адил юм. Энэ зүйрлэл нь тухайн сэдвийг шинээр эзэмшсэн хүмүүст машин сургалтын болон хиймэл мэдрэлийн сүлжээний цаадах санааг ойлгоход нь туслах зорилгоор ашиглагддаг.
Хөшигний ард хэд хэдэн давхаргаар математик болон статистик тооцоолол явагдаж байгаа тул эдгээр сүлжээг математикийн функц гэж тодорхойлох нь илүү дэвшилтэт арга юм.
Энэ нь машин сурах сонирхолтой хүмүүст зориулагдсан бөгөөд Python мэдрэлийн сүлжээний код хэрхэн бичигдсэнийг харахыг хүсдэг.
Энэ нийтлэлд бид бүрэн холбогдсон гүн мэдрэлийн сүлжээг (DNN) эхнээс нь хэрхэн бүтээхийг харуулах болно. Python 3.
Манай Python мэдрэлийн сүлжээний кодын файлын бүтцийн тойм
Энд гурван файл үүсгэгдэх болно. Эхнийх нь энгийн nn.py файл бөгөөд үүнийг "Тусламжийн функцийг тохируулах" болон "Мэдрэлийн сүлжээг эхнээс нь бий болгох" хэсэгт авч үзэх болно.
Бид мөн "MNIST өгөгдлийг ачаалж байна" хэсэгт тайлбарласны дагуу туршилтын өгөгдлийг ачаалах mnist loader.py нэртэй файлтай болно.
Эцэст нь бид мэдрэлийн сүлжээг шалгахын тулд терминал дээр ажиллуулах test.py нэртэй файлтай болно.
Энэ файлыг "Ажиллаж буй туршилтууд" хэсэгт дэлгэрэнгүй тайлбарласан болно.
суурилуулах ажил
Энэхүү зааварчилгааг дагахын тулд NumPy Python номын санг татаж авах шаардлагатай. Та терминал дээрх дараах тушаалыг ашиглан үүнийг хийж болно.
Модулуудыг импортлох, Туслах функцийг тохируулах
Бидэнд шаардлагатай хоёр л номын сан бол санамсаргүй болон NumPy бөгөөд бид үүнийг шууд импортлох болно. Манай мэдрэлийн сүлжээний анхны жингийн хувьд бид тэдгээрийг санамсаргүй номын санг ашиглан холино.
Тооцоололтоо хурдасгахын тулд бид NumPy эсвэл np-г ашиглана (ерөнхийдөө үүнийг ихэвчлэн np гэж импортлодог). Манай хоёр туслах функцийг импортын дараа хийх болно. Хоёр сигмоид функц: нэг ба сигмоид праймер.
Логистик регресс нь сигмоид функцийг ашиглан өгөгдлийг ангилах бол буцах тархалт нь сигмоид үндсэн функцийг ашиглан дельта эсвэл градиентийг тооцоолох болно.
Сүлжээний анги үүсгэх
Бүрэн холбогдсон мэдрэлийн сүлжээг бий болгох нь энэ хэсгийн цорын ганц анхаарал хандуулах зүйл юм. Сүлжээний анги нь дараа нь ирэх бүх функцийг багтаана. Object() { [уугуул код] } функцийг манай сүлжээний ангид анх үүсгэнэ.
Object() { [үндсэн код] } функцэд хэмжээс гэсэн нэг аргумент шаардлагатай. Хэмжээ хувьсагч нь манай мэдрэлийн сүлжээний давхарга бүрт байгаа оролтын зангилааны тоог илэрхийлдэг тоон утгуудын цуглуулга юм.
Бид __init__ аргадаа дөрвөн шинж чанарыг эхлүүлдэг. Оролтын хувьсагч, хэмжээ нь давхаргын хэмжээ, давхаргын тоо, тоо давхаргын жагсаалтыг тохируулахад ашиглагддаг.
Эхний алхам бол оролтын давхаргыг дагасан давхарга бүрт манай сүлжээний анхны хазайлтыг санамсаргүй байдлаар хуваарилах явдал юм.
Эцэст нь, оролт ба гаралтын давхаргын хоорондох холбоос бүр өөрийн жинг санамсаргүй байдлаар үүсгэсэн байна. Np.Random.Randn() нь контекстийн хувьд хэвийн тархалтаас авсан санамсаргүй түүврийг өгдөг.
Дамжуулах функц
Мэдрэлийн сүлжээнд мэдээллийг дамжуулах функцээр дамжуулдаг. Энэ функцэд одоогийн идэвхжүүлэх векторыг харуулсан нэг аргумент шаардлагатай болно.
Энэ функц нь сүлжээн дэх бүх хазайлт, жинг давтах замаар давхарга бүрийн идэвхжүүлэлтийг тооцдог. Өгөгдсөн хариулт нь сүүлийн давхаргын идэвхжүүлэлт болох таамаглал юм.
Мини багц градиент уналт
Манай Сүлжээний ангийн гол хүч бол Gradient Descent юм. Энэ хувилбарт бид градиент удмын өөрчилсөн хувилбар болох мини-багц (стохастик) градиент уналтыг ашигладаг.
Энэ нь манай загварыг шинэчлэхийн тулд бага хэмжээний өгөгдлийн цэгүүдийг ашиглах болно гэдгийг харуулж байна. Дөрвөн шаардлагатай ба нэг нэмэлт аргументыг энэ аргад шилжүүлнэ. Шаардлагатай дөрвөн хувьсагч нь сургалтын өгөгдлийн багц, эриний тоо, жижиг багцын хэмжээ, суралцах хурд (eta) юм.
Туршилтын өгөгдлийг хүсэлтийн дагуу авах боломжтой. Бид эцэст нь энэ сүлжээг үнэлэхдээ туршилтын өгөгдлийг өгөх болно. Сургалтын өгөгдлийг жагсаалтын төрөл болгон хувиргасны дараа энэ функц дэх дээжийн тоог эхлээд жагсаалтын уртад тохируулна.
Бид өгөгдсөн өгөгдлүүдийг шалгахдаа мөн адил үйл явцыг хэрэгжүүлдэг. Учир нь тэдгээр нь бидэнд жагсаалт хэлбэрээр буцаагдахын оронд үнэхээр жагсаалтын зип юм. Бид дараа нь MNIST өгөгдлийн дээжийг ачаалах үед энэ талаар илүү ихийг мэдэх болно.
Хэрэв бид хоёр төрлийн өгөгдлийг жагсаалт хэлбэрээр өгч чадах юм бол энэ төрлийн дамжуулалт зайлшгүй чухал биш юм.
Өгөгдөлтэй болсны дараа бид сургалтын үе шатуудыг давталттайгаар явуулдаг. Сургалтын хугацаа нь мэдрэлийн сүлжээний сургалтын зөвхөн нэг үе шат юм. Бид мини багцын жагсаалтыг гаргахын өмнө санамсаргүй байдлыг баталгаажуулахын тулд эрин үе бүрт өгөгдлийг холино.
Доор авч үзэх мини багцын шинэчлэлтийн функцийг мини багц бүрт дуудах болно. Туршилтын өгөгдөл байгаа тохиолдолд туршилтын нарийвчлалыг мөн буцааж өгнө.
Зардлын дериватив туслах функц
Буцах кодыг үнэхээр үүсгэхээсээ өмнө эхлээд зардлын дериватив хэмээх туслах функцийг хөгжүүлцгээе. Хэрэв бид гаралтын давхаргадаа алдаа гаргавал зардлын дериватив функц үүнийг харуулах болно.
Үүнд хоёр оролт шаардлагатай: гаралтын идэвхжүүлэлтийн массив ба хүлээгдэж буй гаралтын утгуудын у координат.
Буцааж тархах функц
Бидний одоогийн идэвхжүүлэлтийн вектор, идэвхжүүлэлт, түүнчлэн бусад идэвхжүүлэлтийн векторууд, идэвхжүүлэлтүүд, z-векторууд, zs бүгдийг санаж байх ёстой. Эхлээд оролтын давхарга гэж нэрлэгддэг давхарга идэвхждэг.
Бид хэвийсэн байдал, жин тус бүрийг байрлуулсны дараа давталт хийнэ. Давталт бүр нь z векторыг жин ба идэвхжүүлэлтийн цэгийн үржвэр болгон тооцоолох, zs-ийн жагсаалтад нэмэх, идэвхжүүлэлтийг дахин тооцоолох, идэвхжүүлэлтийн жагсаалтад шинэчлэгдсэн идэвхжүүлэлтийг нэмэх зэрэг орно.
Эцэст нь математик. Өмнөх давхаргын алдааг zs векторуудын сүүлчийн элементийн сигмоид анхны тоогоор үржүүлсэнтэй тэнцүү болох дельта нь биднийг ухраах дамжуулалтыг эхлүүлэхээс өмнө тооцоолно.
nabla b-ийн сүүлчийн давхарга нь дельта, nabla w-ийн эцсийн давхарга нь дельтагийн цэгийн үржвэр ба хоёр дахь-сүүлийн идэвхжилтийн давхарга байхаар тохируулагдсан (бид математикийг бодитоор хийж чадахаар шилжүүлсэн) .
Бид өмнөх шигээ үргэлжлүүлж, хоёр дахь давхаргаас эхлээд сүүлчийнхийг нь дуусгаж, эдгээр сүүлчийн давхаргыг дуусгасны дараа үйл явцыг давтана. Дараа нь наблуудыг tuple хэлбэрээр буцааж өгнө.
Мини-багцын градиент уналтыг шинэчилж байна
Бидний өмнөх SGD (стохастик градиент удам) арга нь мини багц шинэчлэлтийг агуулдаг. Үүнийг SGD-д ашигладаг боловч арын тулгуур шаарддаг тул би энэ функцийг хаана байрлуулах талаар маргасан.
Эцэст нь би энд нийтлэх сонголт хийсэн. Энэ нь бидний backprop функцтэй адил хазайлт ба жингийн наблуудын 0 векторыг үүсгэснээр эхэлдэг.
Энэ нь мини-багц ба сургалтын хурдыг хоёр оролт болгон шаарддаг. Мини багцад бид backprop функцийг ашиглан оролт, х, гаралт, y бүрийн хувьд набла массив бүрийн дельтаг авдаг. Дараа нь набла жагсаалтыг эдгээр дельтагаар шинэчилнэ.
Эцэст нь бид сүлжээний жин ба хэвийх утгыг шинэчлэхийн тулд сургалтын хурд болон наблуудыг ашигладаг. Утга бүрийг хамгийн сүүлийн үеийн утга болгон шинэчилж, суралцах хурдыг хасч, жижиг багцын хэмжээгээр үржүүлж, дараа нь nabla утгад нэмнэ.
Функцийг үнэлэх
Үнэлгээний функц нь бидний бичих ёстой эцсийн функц юм. Туршилтын өгөгдөл нь энэ функцийн цорын ганц оролт юм. Энэ функцэд бид зөвхөн сүлжээний гаралтыг хүлээгдэж буй үр дүнтэй харьцуулна, y. Оролт, х, урагш тэжээх замаар сүлжээний гаралтыг тодорхойлно.
Бүрэн код
Бид бүх кодыг нэгтгэх үед иймэрхүү харагдах болно.
Мэдрэлийн сүлжээг турших
MNIST өгөгдлийг ачаалж байна
The MNIST мэдээлэл .pkl.gz форматтай бөгөөд бид GZIP ашиглан нээж, даршилсан ногоогоор ачаална. Энэ өгөгдлийг сургалт, баталгаажуулалт, туршилтын өгөгдөлд хуваасан гурван хэмжээтэй tuple хэлбэрээр ачаалах хурдан аргыг бичье.
Өгөгдлөө удирдахад хялбар болгохын тулд бид y-г 10 зүйлтэй массив болгон кодлох өөр функц бичнэ. Зургийн зохих цифртэй таарч байгаа 0-ээс бусад массив нь 1-ээс бүрдэнэ.
Бид өгөгдлийг унших боломжтой формат руу ачаалахын тулд үндсэн ачааллын өгөгдөл болон нэг халуун кодчилолын аргыг ашиглана. Өөр нэг функц бичигдэх бөгөөд энэ нь бидний x утгыг зургийн 784 пикселтэй тохирох 784 хэмжээтэй жагсаалтад, мөн y утгыг нэг халуун кодлогдсон вектор хэлбэрт хувиргах болно.
Дараа нь бид x ба y утгуудыг нэгтгэж, нэг индекс нөгөө индекстэйгээ таарч байна. Энэ нь сургалт, баталгаажуулалт, туршилтын өгөгдлийн багцад хамаарна. Дараа нь бид өөрчлөгдсөн өгөгдлийг буцаана.
Ажиллаж буй тестүүд
Бид "mnist loader" нэртэй шинэ файл хийх бөгөөд энэ нь бидний өмнө нь үүсгэсэн мэдрэлийн сүлжээ (энгийн nn) болон MNIST өгөгдлийн багц дуудагчийг туршиж эхлэхээс өмнө хоёуланг нь импортлох болно.
Энэ файлд бидний хийх ёстой зүйл бол өгөгдлийг импортлох, оролтын түвшний 784 хэмжээтэй, гаралтын түвшний 10 хэмжээтэй сүлжээг байгуулж, сургалтын өгөгдөл дээр сүлжээний SGD функцийг ажиллуулж, дараа нь тестийн өгөгдлийг ашиглан тест хийх явдал юм.
Бидний оролтын давхаргын жагсаалтын хувьд 784 ба 10-ын хооронд ямар тоо байх нь хамаагүй гэдгийг санаарай. Бид бусад давхаргыг хүссэнээрээ өөрчилж болно; Зөвхөн оролт, гаралтын хэмжээ тогтмол байна.
Гурван давхарга шаардлагагүй; Бид дөрөв, тав, бүр хоёрыг ч ашиглаж болно. Үүнийг туршиж үзээрэй.
Дүгнэлт
Энд бид Python 3 ашиглан мэдрэлийн сүлжээг эхнээс нь бий болгодог. Өндөр түвшний математикийн хажуугаар бид хэрэгжилтийн онцлогийг хэлэлцсэн.
Бид туслах функцүүдийг хэрэгжүүлж эхэлсэн. Нейронууд ажиллахын тулд сигмоид ба сигмоид үндсэн функцууд маш чухал юм. Дараа нь бид мэдрэлийн сүлжээнд өгөгдөл дамжуулах үндсэн процесс болох урагш дамжуулах функцийг хэрэгжүүлсэн.
Дараа нь бид мэдрэлийн сүлжээг удирддаг хөдөлгүүр болох Python-д градиент descent функцийг бүтээсэн. "Орон нутгийн минимум" -ыг олох, тэдгээрийн жин, хазайлтыг оновчтой болгохын тулд манай мэдрэлийн сүлжээ нь градиент уруулыг ашигладаг. Бид буцаан тархалтын функцийг ашиглан үүсгэсэн градиент уналт.
Гаралт нь зохих шошготой таарахгүй үед шинэчлэлтүүдийг хүргэснээр энэ функц нь мэдрэлийн сүлжээнд "суралцах" боломжийг олгодог.
Эцэст нь бид цоо шинэ Python-оо орууллаа мэдрэлийн сүлжээ MNIST мэдээллийн багцыг ашиглан тест хийх. Бүх зүйл хэвийн ажиллаж байсан.
Кодлоход баяртай байна!
хариу үлдээх