පටුන[සඟවන්න][පෙන්වන්න]
මොළය ස්නායු ජාල සමඟ සැසඳිය හැකිය. යන්ත්ර ඉගෙනීම සහ කෘත්රිම ස්නායුක ජාල පිටුපස ඇති අදහස් අවබෝධ කර ගැනීම සඳහා විෂයයට නවකයෙකුට සහාය වීමට සාමාන්යයෙන් භාවිතා වන ප්රතිසම මෙයයි.
තිරය පිටුපස ගණිතමය සහ සංඛ්යානමය ගණනය කිරීම් ස්තර කිහිපයක් සිදුවන නිසා මෙම ජාල ගණිතමය ශ්රිතයක් ලෙස අර්ථ දැක්වීම වඩාත් දියුණු ක්රමයකි.
මෙය යන්ත්ර ඉගෙනීමට සැබවින්ම උනන්දුවක් දක්වන සහ Python neural network code ලියා ඇති ආකාරය බැලීමට අවශ්ය පුද්ගලයින් සඳහා වේ.
මෙම ලිපියෙන් අපි මුල සිටම සම්පුර්ණයෙන්ම සම්බන්ධිත ගැඹුරු ස්නායුක ජාලයක් (DNN) ගොඩනගන්නේ කෙසේදැයි පෙන්වමු. Python මීට උදාහරණ 3.
අපගේ Python Neural Network Code සඳහා ගොනු ව්යුහය පිළිබඳ දළ විශ්ලේෂණයක්
මෙහි ගොනු තුනක් සාදනු ඇත. පළමුවැන්න සරල nn.py ගොනුව වන අතර, එය "සහායක කාර්යයන් සැකසීම" සහ "මුල සිට ස්නායු ජාලය ගොඩනැගීම" තුළ සාකච්ඡා කෙරේ.
“MNIST දත්ත පූරණය කරමින්” විස්තර කර ඇති පරිදි, පරීක්ෂණ දත්ත පූරණය කිරීමට mnist loader.py නමින් ගොනුවක් ද අප සතුව ඇත.
අවසාන වශයෙන්, අපගේ ස්නායුක ජාලය පරීක්ෂා කිරීම සඳහා ටර්මිනලයේ දියත් කෙරෙන test.py නම් ගොනුවක් අප සතුව ඇත.
මෙම ගොනුව "ධාවන පරීක්ෂණ" තුළ විස්තරාත්මකව විස්තර කර ඇත.
ස්ථාපනය
මෙම නිබන්ධනය අනුගමනය කිරීම සඳහා NumPy Python පුස්තකාලය බාගත කළ යුතුය. ටර්මිනලයේ පහත විධානය භාවිතා කිරීමෙන් ඔබට මෙය කළ හැකිය:
මොඩියුල ආයාත කිරීම සහ උපකාරක කාර්යය සැකසීම
අපට අවශ්ය එකම පුස්තකාල දෙක සසම්භාවී සහ NumPy වේ, අපි වහාම ආනයනය කරනු ඇත. අපගේ ස්නායුක ජාලයේ ආරම්භක බර සඳහා, අපි අහඹු පුස්තකාලය භාවිතයෙන් ඒවා මාරු කරන්නෙමු.
අපගේ ගණනය කිරීම් වේගවත් කිරීම සඳහා, අපි NumPy හෝ np භාවිතා කරන්නෙමු (සම්මුතිය අනුව, එය බොහෝ විට np ලෙස ආනයනය කරනු ලැබේ). අපගේ ආනයනය කිරීමෙන් පසු අපගේ උපකාරක කාර්යයන් දෙක සිදු කෙරේ. සිග්මොයිඩ් ශ්රිත දෙකක්: එකක් සහ සිග්මොයිඩ් ප්රයිම්.
ලොජිස්ටික් ප්රතිගමනය සිග්මොයිඩ් ශ්රිතය භාවිතයෙන් දත්ත වර්ගීකරණය කරනු ලබන අතර, පසු ප්රචාරණය මඟින් සිග්මොයිඩ් ප්රයිම් ශ්රිතය භාවිතයෙන් ඩෙල්ටා හෝ ශ්රේණිය ගණනය කරනු ඇත.
ජාල පන්තිය නිර්මාණය කිරීම
සම්පුර්ණයෙන්ම සම්බන්ධ වූ ස්නායුක ජාලයක් ගොඩනැගීම මෙම කොටසෙහි එකම අවධානය වේ. ජාල පන්තියට පසුව එන සියලුම කාර්යයන් ඇතුළත් වේ. Object() { [native code] } ශ්රිතය අපගේ ජාල පන්තියේ මුලින් නිර්මාණය වනු ඇත.
Object() { [native code] } ශ්රිතයට එක් තර්කයක්, ප්රමාණ අවශ්ය වේ. ප්රමාණ විචල්යය යනු අපගේ ස්නායුක ජාලයේ එක් එක් ස්ථරයේ ඇති ආදාන නෝඩ් ගණන නියෝජනය කරන සංඛ්යාත්මක අගයන්ගේ එකතුවකි.
අපි අපගේ __init__ ක්රමය තුළ ගුණාංග හතරක් ආරම්භ කරමු. ආදාන විචල්යයන්, ප්රමාණයන්, පිළිවෙලින් ස්ථර ප්රමාණයේ ලැයිස්තුව සහ ස්ථර ගණන, ස්ථර ගණන සැකසීමට භාවිතා කරයි.
පළමු පියවර වන්නේ ආදාන ස්තරය අනුගමනය කරන සෑම ස්ථරයකටම අපගේ ජාලයේ ආරම්භක නැඹුරුව අහඹු ලෙස පැවරීමයි.
අවසාන වශයෙන්, ආදාන සහ ප්රතිදාන ස්ථර අතර එක් එක් සබැඳිය එහි බර අහඹු ලෙස ජනනය කර ඇත. Np.Random.Randn() සන්දර්භය සඳහා සාමාන්ය ව්යාප්තියෙන් ලබාගත් අහඹු නියැදියක් ලබා දෙයි.
ඉදිරි කාර්යය පෝෂණය කරන්න
ස්නායුක ජාලයක් තුළ, පෝෂක ශ්රිතය මඟින් තොරතුරු ඉදිරියට යවනු ලැබේ. මෙම ශ්රිතයට වත්මන් සක්රිය දෛශිකය දක්වන එක් තර්කයක්, a, අවශ්ය වේ.
මෙම ශ්රිතය ජාලයේ ඇති සියලුම පක්ෂග්රාහී සහ බර පුනරාවර්තනය කිරීමෙන් එක් එක් ස්ථරයේ සක්රිය කිරීම් ඇස්තමේන්තු කරයි. ලබා දී ඇති පිළිතුර වන්නේ අවසාන ස්ථරයේ සක්රිය කිරීම් වන අනාවැකියයි.
කුඩා කාණ්ඩයේ අනුක්රමික බැසයාම
අපගේ ජාල පන්තියේ වැඩ අශ්වයා ශ්රේණිගත සම්භවයයි. මෙම අනුවාදයේ, අපි කුඩා කාණ්ඩයේ (ස්ටෝචස්ටික්) අනුක්රමණ සම්භවයක් භාවිතා කරන්නෙමු, ශ්රේණිගත සම්භවයේ නවීකරණය කරන ලද ප්රභේදයකි.
මෙයින් ඇඟවෙන්නේ අපගේ ආකෘතිය යාවත්කාලීන කිරීමට කුඩා දත්ත පොයින්ට් එකක් භාවිතා කරන බවයි. මෙම ක්රමයට අවශ්ය හතරක් සහ එක් විකල්ප තර්කයක් ලබා දේ. අවශ්ය විචල්ය හතර වන්නේ පුහුණු දත්ත කට්ටලය, යුග ගණන, කුඩා කණ්ඩායම්වල ප්රමාණය සහ ඉගෙනුම් අනුපාතය (eta) වේ.
ඉල්ලීම මත පරීක්ෂණ දත්ත ලබා ගත හැකිය. අපි අවසානයේ මෙම ජාලය ඇගයීමට ලක් කරන විට අපි පරීක්ෂණ දත්ත සපයන්නෙමු. පුහුණු දත්ත ලැයිස්තු වර්ගයක් බවට පරිවර්තනය කළ පසු මෙම ශ්රිතයේ සාම්පල ගණන මුලින් ලැයිස්තුවේ දිගට සකසා ඇත.
ලබා දී ඇති දත්ත පරීක්ෂා කිරීම සඳහා ද අපි එම ක්රියාවලියම යොදමු. මෙයට හේතුව ලැයිස්තු ලෙස අප වෙත ආපසු ලබා දීම වෙනුවට ඒවා සැබවින්ම ලැයිස්තු වල සිප් වීමයි. අපි පසුව MNIST දත්ත සාම්පල පූරණය කරන විට, අපි මේ ගැන වැඩිදුර ඉගෙන ගන්නෙමු.
අපි ලැයිස්තු ලෙස දත්ත වර්ග දෙකම සපයන බව සහතික කර ගත හැකි නම්, මෙම වර්ගය-වාත්තු කිරීම අත්යවශ්ය නොවේ.
අපට දත්ත ලැබුණු පසු, අපි ලූපයක් තුළ පුහුණු යුගයන් හරහා යමු. පුහුණු කාල සීමාවක් යනු ස්නායුක ජාල පුහුණුවේ එක් වටයක් පමණි. කුඩා කණ්ඩායම් ලැයිස්තුවක් සෑදීමට පෙර අහඹු බව සහතික කිරීම සඳහා අපි පළමුව එක් එක් යුගයේ දත්ත මාරු කරමු.
පහත සාකච්ඡා කර ඇති යාවත්කාලීන mini batch ශ්රිතය, එක් එක් කුඩා කණ්ඩායම සඳහා කැඳවනු ලැබේ. පරීක්ෂණ දත්ත තිබේ නම් පරීක්ෂණ නිරවද්යතාවය ද ආපසු ලබා දෙනු ඇත.
පිරිවැය-ව්යුත්පන්න උපකාරක කාර්යය
ඇත්තටම backpropagation code එක හදන්න කලින් අපි මුලින්ම cost derivative කියන helper function එකක් develop කරමු. අපගේ ප්රතිදාන ස්ථරයේ වැරදීමක් සිදුවුවහොත්, පිරිවැය ව්යුත්පන්න ශ්රිතය එය පෙන්වයි.
එයට යෙදවුම් දෙකක් අවශ්ය වේ: ප්රතිදාන සක්රිය කිරීමේ අරාව සහ අපේක්ෂිත ප්රතිදාන අගයන්හි y-ඛණ්ඩාංක.
Backpropagation කාර්යය
අපගේ වර්තමාන සක්රීය කිරීමේ දෛශිකය, සක්රිය කිරීම, මෙන්ම වෙනත් ඕනෑම සක්රිය දෛශික, සක්රිය කිරීම් සහ z-දෛශික, zs, සියල්ල මතක තබා ගත යුතුය. ඉන්පුට් ලේයර් කියන ලේයර් එකක් මුලින්ම ඇක්ටිව් වෙනවා.
අපි ඒවා තැබීමෙන් පසු එක් එක් නැඹුරුව සහ බර හරහා ලූප් කරන්නෙමු. සෑම ලූපයකටම z දෛශිකය බර සහ සක්රිය කිරීමේ තිත් ගුණිතය ලෙස ගණනය කිරීම, එය zs ලැයිස්තුවට එකතු කිරීම, සක්රිය කිරීම නැවත ගණනය කිරීම සහ සක්රීය කිරීම් ලැයිස්තුවට යාවත්කාලීන කරන ලද සක්රිය කිරීම එකතු කිරීම ඇතුළත් වේ.
අවසාන වශයෙන්, ගණිතය. zs දෛශිකවල අවසාන මූලද්රව්යයේ සිග්මොයිඩ් ප්රයිම් වලින් ගුණ කරන ලද පෙර ස්ථරයේ දෝෂයට සමාන වන ඩෙල්ටා, අපි අපගේ පසුගාමී ගමන් ආරම්භ කිරීමට පෙර ගණනය කරනු ලැබේ.
nabla b හි අවසාන ස්ථරය ඩෙල්ටාව ලෙස සකසා ඇති අතර, nabla w හි අවසාන ස්ථරය ඩෙල්ටාවේ තිත් ප්රතිඵලය සහ සක්රිය කිරීමේ දෙවන සිට අවසාන ස්ථරය දක්වා (පරිවර්තනය කර ඇති නිසා අපට ඇත්ත වශයෙන්ම ගණිතය කළ හැක) .
අපි පෙර පරිදිම ඉදිරියට යමු, දෙවන ස්ථරයෙන් ආරම්භ කර අවසාන ස්ථරයෙන් අවසන් වන අතර, මෙම අවසාන ස්ථර සම්පූර්ණ කිරීමෙන් පසු ක්රියාවලිය නැවත කරන්න. එවිට නැබ්ලාස් නැවත ටුපල් ලෙස ලබා දෙනු ලැබේ.
Mini-batch අනුක්රමික බැසයාම යාවත්කාලීන කිරීම
අපගේ SGD (stochastic gradient descent) ක්රමයට කුඩා කණ්ඩායම් යාවත්කාලීන කිරීම් ඇතුළත් වේ. එය SGD හි භාවිතා වන නමුත් backprop ද අවශ්ය වන බැවින්, මෙම ශ්රිතය තැබිය යුත්තේ කොතැනටද යන්න මම විවාද කළෙමි.
අවසාන වශයෙන්, මම එය මෙහි පළ කිරීමට තෝරා ගත්තෙමි. එය ආරම්භ වන්නේ අපගේ බැක්ප්රොප් ශ්රිතය කළාක් මෙන්, පක්ෂග්රාහී සහ බර' නැබ්ලා වල දෛශික 0ක් ජනනය කිරීමෙනි.
එයට කුඩා කණ්ඩායම සහ eta ඉගෙනුම් අනුපාතය එහි යෙදවුම් දෙක ලෙස අවශ්ය වේ. කුඩා කණ්ඩායම තුළ, අපි එක් එක් ආදානය, x සහ ප්රතිදානය, y සඳහා එක් එක් nabla array වල ඩෙල්ටා ලබා ගැනීමට backprop ශ්රිතය භාවිතා කරමු. නබ්ලා ලැයිස්තු පසුව මෙම ඩෙල්ටා සමඟ යාවත්කාලීන වේ.
අවසාන වශයෙන්, අපි ජාලයේ බර සහ පක්ෂග්රාහීත්වය යාවත්කාලීන කිරීමට ඉගෙනීමේ අනුපාතය සහ නැබ්ලාස් භාවිතා කරමු. සෑම අගයක්ම මෑතකාලීන අගයට යාවත්කාලීන කර, ඉගෙනීමේ වේගය අඩු කර, minibatch ප්රමාණයෙන් ගුණ කර, පසුව nabla අගයට එකතු කරනු ලැබේ.
කාර්යය ඇගයීම
ඇගයීම් ශ්රිතය තමයි අපිට ලිවිය යුතු අවසාන එක. මෙම කාර්යය සඳහා පරීක්ෂණ දත්ත එකම ආදානය වේ. මෙම ශ්රිතයේදී, අපි ජාලයේ ප්රතිදානයන් සසඳන්නේ අපේක්ෂිත ප්රතිඵලය සමඟ පමණි, y. ආදානය පෝෂණය කිරීමෙන්, x, ඉදිරියට, ජාලයේ ප්රතිදානයන් තීරණය වේ.
සම්පූර්ණ කේතය
අපි සියලුම කේතයන් ඒකාබද්ධ කළ විට, එය දිස්වන්නේ එලෙස ය.
ස්නායු ජාලය පරීක්ෂා කිරීම
MNIST දත්ත පූරණය කරමින්
එම MNIST දත්ත .pkl.gz ආකෘතියෙන් ඇත, එය අපි GZIP භාවිතයෙන් විවෘත කර අච්චාරු සමඟ පූරණය කරන්නෙමු. පුහුණු කිරීම, වලංගු කිරීම සහ පරීක්ෂණ දත්ත ලෙස බෙදා මෙම දත්ත තුනේ ප්රමාණයේ ටියුපල් ලෙස පූරණය කිරීමට ඉක්මන් ක්රමයක් ලියන්නෙමු.
අපගේ දත්ත කළමනාකරණය කිරීම පහසු කිරීම සඳහා, අපි y අයිතම 10 අරාවකට සංකේතනය කිරීමට තවත් කාර්යයක් ලියන්නෙමු. රූපයේ නියම අංකයට ගැළපෙන 0 හැර අරාව සියල්ල 1 වේ.
අපගේ දත්ත කියවිය හැකි ආකෘතියකට පූරණය කිරීමට අපි මූලික පැටවුම් දත්ත සහ එක් උණුසුම් සංකේත ක්රමයක් භාවිතා කරන්නෙමු. අපගේ x අගයන් රූපයේ පික්සල 784 ට ගැළපෙන 784 ප්රමාණයේ ලැයිස්තුවක් බවට පරිවර්තනය කරන තවත් ශ්රිතයක් ලියා ඇත, සහ අපගේ y අගයන් ඒවායේ තනි උණුසුම් කේතනය කළ දෛශික ස්වරූපයට පරිවර්තනය කරයි.
එවිට අපි එක් දර්ශකයක් අනෙකට ගැලපෙන පරිදි x සහ y අගයන් ඒකාබද්ධ කරමු. මෙය පුහුණුව, වලංගු කිරීම සහ පරීක්ෂණ දත්ත කට්ටල සඳහා අදාළ වේ. ඉන්පසුව අපි වෙනස් කළ දත්ත ආපසු ලබා දෙන්නෙමු.
ධාවන පරීක්ෂණ
අපි "mnist loader" නමින් නව ගොනුවක් සාදනු ලබන අතර එය අප කලින් ස්ථාපිත කළ ස්නායු ජාලය (සරල nn) සහ MNIST දත්ත කට්ටල පූරකය යන දෙකම අප විසින් පරීක්ෂා කිරීම ආරම්භ කිරීමට පෙර ආනයනය කරනු ඇත.
මෙම ගොනුව තුළ, අපට අවශ්ය වන්නේ දත්ත ආනයනය කිරීම, ආදාන ස්ථර ප්රමාණය 784 සහ ප්රතිදාන ස්ථර ප්රමාණය 10 ක් සහිත ජාලයක් තැනීම, පුහුණු දත්ත මත ජාලයේ SGD ශ්රිතය ක්රියාත්මක කිරීම, පසුව පරීක්ෂණ දත්ත භාවිතයෙන් එය පරීක්ෂා කිරීම පමණි.
අපගේ ආදාන ස්ථර ලැයිස්තුව සඳහා, 784 සහ 10 අතර ඇති ඕනෑම සංඛ්යාවල වෙනසක් නොවන බව මතක තබා ගන්න. අපට අනෙක් ස්ථර අප කැමති ආකාරයට වෙනස් කළ හැකිය; ආදාන සහ ප්රතිදාන ප්රමාණ පමණක් සවි කර ඇත.
ස්ථර තුනක් අවශ්ය නොවේ; අපි හතරක්, පහක් හෝ දෙකක් පමණක් භාවිතා කළ හැකිය. එය අත්හදා බැලීමෙන් විනෝද වන්න.
නිගමනය
මෙන්න, Python 3 භාවිතා කරමින්, අපි මුල සිටම ස්නායු ජාලයක් නිර්මාණය කරමු. ඉහළ මට්ටමේ ගණිතය සමඟ, අපි ක්රියාත්මක කිරීමේ විශේෂතා ද සාකච්ඡා කළෙමු.
අපි උපකාරක කාර්යයන් ක්රියාත්මක කිරීම ආරම්භ කළෙමු. නියුරෝන ක්රියා කිරීමට නම්, සිග්මොයිඩ් සහ සිග්මොයිඩ් ප්රධාන ක්රියාකාරකම් ඉතා වැදගත් වේ. පසුව අපි ස්නායුක ජාලයට දත්ත පෝෂණය කිරීමේ මූලික ක්රියාවලිය වන feedforward ශ්රිතය ක්රියාවට නංවන්නෙමු.
ඊළඟට, අපි අපගේ ස්නායු ජාලය මෙහෙයවන එන්ජිම වන Python හි ශ්රේණිගත අවරෝහණ ශ්රිතය නිර්මාණය කළෙමු. "දේශීය අවම" ස්ථානගත කිරීම සහ ඒවායේ බර සහ පක්ෂග්රාහීත්වය ප්රශස්ත කිරීම සඳහා, අපගේ ස්නායුක ජාලය අනුක්රමණ සම්භවය භාවිතා කරයි. අපි භාවිතා කරමින් backpropagation ශ්රිතය නිර්මාණය කළෙමු අනුක්රමණ සම්භවය.
නිමැවුම් නිසි ලේබල සමඟ නොගැලපෙන විට යාවත්කාලීන ලබා දීමෙන්, මෙම ශ්රිතය ස්නායු ජාලයට "ඉගෙන ගැනීමට" සබල කරයි.
අවසාන වශයෙන්, අපි අපගේ නවතම Python තැබුවෙමු ස්නායු ජාලය MNIST දත්ත කට්ටලය භාවිතයෙන් පරීක්ෂණයට. සියල්ල සුමටව ක්රියාත්මක විය.
සුබ කේතීකරණයක්!
ඔබමයි