തലച്ചോറിനെ ന്യൂറൽ നെറ്റ്വർക്കുകളുമായി താരതമ്യപ്പെടുത്താവുന്നതാണ്. മെഷീൻ ലേണിംഗിനും കൃത്രിമ ന്യൂറൽ നെറ്റ്വർക്കുകൾക്കും പിന്നിലെ ആശയങ്ങൾ മനസിലാക്കാൻ ഈ വിഷയത്തിൽ പുതിയ ഒരാളെ സഹായിക്കുന്നതിന് സാധാരണയായി ഉപയോഗിക്കുന്ന സമാനതയാണിത്.
ഗണിതശാസ്ത്രപരവും സ്ഥിതിവിവരക്കണക്കുകളുമായ നിരവധി പാളികൾ തിരശ്ശീലയ്ക്ക് പിന്നിൽ നടക്കുന്നതിനാൽ, ഈ നെറ്റ്വർക്കുകളെ ഒരു ഗണിതശാസ്ത്ര പ്രവർത്തനമായി നിർവചിക്കുന്നത് കൂടുതൽ വിപുലമായ രീതിയാണ്.
മെഷീൻ ലേണിംഗിൽ യഥാർത്ഥത്തിൽ താൽപ്പര്യമുള്ള, പൈത്തൺ ന്യൂറൽ നെറ്റ്വർക്ക് കോഡ് എങ്ങനെ എഴുതപ്പെടുന്നുവെന്ന് കാണാൻ ആഗ്രഹിക്കുന്ന ആളുകൾക്ക് വേണ്ടിയാണിത്.
ഈ ലേഖനത്തിൽ, ആദ്യം മുതൽ പൂർണ്ണമായി ബന്ധിപ്പിച്ച ഡീപ് ന്യൂറൽ നെറ്റ്വർക്ക് (ഡിഎൻഎൻ) എങ്ങനെ നിർമ്മിക്കാമെന്ന് ഞങ്ങൾ കാണിക്കും. പൈത്തൺ 3.
ഞങ്ങളുടെ പൈത്തൺ ന്യൂറൽ നെറ്റ്വർക്ക് കോഡിന്റെ ഫയൽ ഘടനയുടെ ഒരു അവലോകനം
ഇവിടെ മൂന്ന് ഫയലുകൾ സൃഷ്ടിക്കപ്പെടും. ആദ്യത്തേത് ലളിതമായ nn.py ഫയലാണ്, അത് "സഹായ പ്രവർത്തനങ്ങൾ സജ്ജീകരിക്കുക", "സ്ക്രാച്ചിൽ നിന്ന് ന്യൂറൽ നെറ്റ്വർക്ക് നിർമ്മിക്കൽ" എന്നിവയിൽ ചർച്ച ചെയ്യും.
"MNIST ഡാറ്റ ലോഡുചെയ്യുന്നു" എന്നതിൽ വിവരിച്ചിരിക്കുന്നതുപോലെ, ടെസ്റ്റ് ഡാറ്റ ലോഡുചെയ്യുന്നതിന് mnist loader.py എന്ന പേരിലുള്ള ഒരു ഫയലും ഞങ്ങളുടെ പക്കലുണ്ടാകും.
അവസാനമായി, ഞങ്ങളുടെ ന്യൂറൽ നെറ്റ്വർക്ക് പരിശോധിക്കുന്നതിനായി ടെർമിനലിൽ സമാരംഭിക്കുന്ന test.py എന്ന പേരിൽ ഒരു ഫയൽ ഉണ്ടാകും.
"റണ്ണിംഗ് ടെസ്റ്റുകളിൽ" ഈ ഫയൽ വിശദമായി വിവരിച്ചിരിക്കുന്നു.
ഇൻസ്റ്റലേഷൻ
ഈ ട്യൂട്ടോറിയൽ പിന്തുടരുന്നതിന് NumPy പൈത്തൺ ലൈബ്രറി ഡൗൺലോഡ് ചെയ്യണം. ടെർമിനലിൽ ഇനിപ്പറയുന്ന കമാൻഡ് ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഇത് പൂർത്തിയാക്കാൻ കഴിയും:
മൊഡ്യൂളുകൾ ഇറക്കുമതി ചെയ്യുകയും ഹെൽപ്പർ ഫംഗ്ഷൻ സജ്ജീകരിക്കുകയും ചെയ്യുന്നു
ഞങ്ങൾക്ക് ആവശ്യമുള്ള രണ്ട് ലൈബ്രറികൾ റാൻഡം, NumPy എന്നിവയാണ്, അത് ഞങ്ങൾ ഉടൻ ഇറക്കുമതി ചെയ്യും. ഞങ്ങളുടെ ന്യൂറൽ നെറ്റ്വർക്കിന്റെ പ്രാഥമിക ഭാരങ്ങൾക്കായി, റാൻഡം ലൈബ്രറി ഉപയോഗിച്ച് ഞങ്ങൾ അവയെ ഷഫിൾ ചെയ്യും.
ഞങ്ങളുടെ കണക്കുകൂട്ടലുകൾ വേഗത്തിലാക്കാൻ, ഞങ്ങൾ NumPy അല്ലെങ്കിൽ np ഉപയോഗിക്കും (കൺവെൻഷൻ പ്രകാരം, ഇത് പലപ്പോഴും np ആയി ഇറക്കുമതി ചെയ്യുന്നു). ഞങ്ങളുടെ രണ്ട് സഹായ പ്രവർത്തനങ്ങൾ ഞങ്ങളുടെ ഇറക്കുമതിക്ക് ശേഷം നിർമ്മിക്കപ്പെടും. രണ്ട് സിഗ്മോയിഡ് ഫംഗ്ഷനുകൾ: ഒന്ന്, സിഗ്മോയിഡ് പ്രൈം.
ലോജിസ്റ്റിക് റിഗ്രഷൻ സിഗ്മോയിഡ് ഫംഗ്ഷൻ ഉപയോഗിച്ച് ഡാറ്റയെ തരംതിരിക്കും, അതേസമയം ബാക്ക്പ്രൊപഗേഷൻ സിഗ്മോയിഡ് പ്രൈം ഫംഗ്ഷൻ ഉപയോഗിച്ച് ഡെൽറ്റ അല്ലെങ്കിൽ ഗ്രേഡിയന്റ് കണക്കാക്കും.
നെറ്റ്വർക്ക് ക്ലാസ് സൃഷ്ടിക്കുന്നു
പൂർണ്ണമായി ബന്ധിപ്പിച്ച ഒരു ന്യൂറൽ നെറ്റ്വർക്ക് നിർമ്മിക്കുന്നത് ഈ വിഭാഗത്തിന്റെ ഏക ശ്രദ്ധയാണ്. നെറ്റ്വർക്ക് ക്ലാസ് പിന്നീട് വരുന്ന എല്ലാ ഫംഗ്ഷനുകളും ഉൾക്കൊള്ളുന്നു. ഒബ്ജക്റ്റ്() { [നേറ്റീവ് കോഡ്] } എന്ന ഫംഗ്ഷൻ ഞങ്ങളുടെ നെറ്റ്വർക്ക് ക്ലാസിൽ തുടക്കത്തിൽ സൃഷ്ടിക്കും.
ഒബ്ജക്റ്റ്() { [നേറ്റീവ് കോഡ്] } എന്ന ഫംഗ്ഷന് ഒരു ആർഗ്യുമെന്റ്, വലുപ്പങ്ങൾ ആവശ്യമാണ്. നമ്മുടെ ന്യൂറൽ നെറ്റ്വർക്കിന്റെ ഓരോ ലെയറിലും ഉള്ള ഇൻപുട്ട് നോഡുകളുടെ എണ്ണത്തെ പ്രതിനിധീകരിക്കുന്ന സംഖ്യാ മൂല്യങ്ങളുടെ ഒരു ശേഖരമാണ് സൈസ് വേരിയബിൾ.
ഞങ്ങളുടെ __init__ രീതിയിൽ ഞങ്ങൾ നാല് പ്രോപ്പർട്ടികൾ സമാരംഭിക്കുന്നു. ഇൻപുട്ട് വേരിയബിളുകൾ, വലുപ്പങ്ങൾ, യഥാക്രമം ലെയർ വലുപ്പങ്ങളുടെ പട്ടികയും ലെയറുകളുടെ എണ്ണം, സംഖ്യ ലെയറുകളും സജ്ജമാക്കാൻ ഉപയോഗിക്കുന്നു.
ഇൻപുട്ട് ലെയറിനെ പിന്തുടരുന്ന ഓരോ ലെയറിലേക്കും ഞങ്ങളുടെ നെറ്റ്വർക്കിന്റെ പ്രാരംഭ ബയസുകൾ ക്രമരഹിതമായി അസൈൻ ചെയ്യുക എന്നതാണ് ആദ്യപടി.
അവസാനമായി, ഇൻപുട്ടും ഔട്ട്പുട്ട് ലെയറുകളും തമ്മിലുള്ള ഓരോ ലിങ്കിനും അതിന്റെ ഭാരം ക്രമരഹിതമായി ജനറേറ്റുചെയ്യുന്നു. Np.Random.Randn() സന്ദർഭത്തിനായി സാധാരണ വിതരണത്തിൽ നിന്ന് എടുത്ത ഒരു ക്രമരഹിത സാമ്പിൾ നൽകുന്നു.
ഫീഡ് ഫോർവേഡ് ഫംഗ്ഷൻ
ഒരു ന്യൂറൽ നെറ്റ്വർക്കിൽ, ഫീഡ്ഫോർവേഡ് ഫംഗ്ഷൻ വഴി വിവരങ്ങൾ കൈമാറുന്നു. നിലവിലെ ആക്റ്റിവേഷൻ വെക്ടറിനെ സൂചിപ്പിക്കുന്ന ഒരു ആർഗ്യുമെന്റ്, ഈ ഫംഗ്ഷന് ആവശ്യമായി വരും.
ഈ ഫംഗ്ഷൻ നെറ്റ്വർക്കിലെ എല്ലാ പക്ഷപാതങ്ങളും ഭാരങ്ങളും ആവർത്തിക്കുന്നതിലൂടെ ഓരോ ലെയറിലുമുള്ള ആക്റ്റിവേഷനുകൾ കണക്കാക്കുന്നു. നൽകിയിരിക്കുന്ന ഉത്തരം പ്രവചനമാണ്, ഇത് അവസാന പാളിയുടെ സജീവതയാണ്.
മിനി-ബാച്ച് ഗ്രേഡിയന്റ് ഡിസന്റ്
ഗ്രേഡിയന്റ് ഡിസന്റ് ആണ് ഞങ്ങളുടെ നെറ്റ്വർക്ക് ക്ലാസിന്റെ വർക്ക്ഹോഴ്സ്. ഈ പതിപ്പിൽ, ഞങ്ങൾ മിനി-ബാച്ച് (സ്റ്റോക്കാസ്റ്റിക്) ഗ്രേഡിയന്റ് ഡിസെന്റ് ഉപയോഗിക്കുന്നു, ഗ്രേഡിയന്റ് ഡിസെൻറിന്റെ പരിഷ്കരിച്ച വ്യതിയാനം.
ഞങ്ങളുടെ മോഡൽ അപ്ഡേറ്റ് ചെയ്യാൻ ഒരു ചെറിയ ബാച്ച് ഡാറ്റ പോയിന്റുകൾ ഉപയോഗിക്കുമെന്ന് ഇത് സൂചിപ്പിക്കുന്നു. ആവശ്യമായ നാല് ആർഗ്യുമെന്റുകളും ഒരു ഓപ്ഷണൽ ആർഗ്യുമെന്റും ഈ രീതിയിലേക്ക് കൈമാറുന്നു. പരിശീലന ഡാറ്റ സെറ്റ്, യുഗങ്ങളുടെ എണ്ണം, മിനി ബാച്ചുകളുടെ വലുപ്പം, പഠന നിരക്ക് (ഇറ്റ) എന്നിവയാണ് ആവശ്യമായ നാല് വേരിയബിളുകൾ.
അഭ്യർത്ഥന പ്രകാരം ടെസ്റ്റ് ഡാറ്റ ലഭ്യമാണ്. ഒടുവിൽ ഈ നെറ്റ്വർക്ക് വിലയിരുത്തുമ്പോൾ ഞങ്ങൾ ടെസ്റ്റ് ഡാറ്റ നൽകും. പരിശീലന ഡാറ്റ ഒരു ലിസ്റ്റ് തരത്തിലേക്ക് രൂപാന്തരപ്പെട്ടു കഴിഞ്ഞാൽ ഈ ഫംഗ്ഷനിലെ സാമ്പിളുകളുടെ എണ്ണം തുടക്കത്തിൽ ലിസ്റ്റിന്റെ ദൈർഘ്യത്തിലേക്ക് സജ്ജീകരിക്കും.
നൽകിയിരിക്കുന്ന ഡാറ്റ പരിശോധിക്കുന്നതിനും ഞങ്ങൾ ഇതേ പ്രക്രിയ പ്രയോഗിക്കുന്നു. ലിസ്റ്റുകളായി ഞങ്ങൾക്ക് തിരികെ നൽകുന്നതിനുപകരം, അവ ശരിക്കും ലിസ്റ്റുകളുടെ സിപ്പുകളാണ്. ഞങ്ങൾ പിന്നീട് MNIST ഡാറ്റാ സാമ്പിളുകൾ ലോഡുചെയ്യുമ്പോൾ, ഞങ്ങൾ ഇതിനെക്കുറിച്ച് കൂടുതൽ പഠിക്കും.
രണ്ട് തരത്തിലുള്ള ഡാറ്റയും ഞങ്ങൾ ലിസ്റ്റുകളായി നൽകുന്നുവെന്ന് ഉറപ്പാക്കാൻ കഴിയുമെങ്കിൽ, ഈ തരം കാസ്റ്റിംഗ് അത്യാവശ്യമായിരിക്കണമെന്നില്ല.
ഞങ്ങൾക്ക് ഡാറ്റ ലഭിച്ചുകഴിഞ്ഞാൽ, ഞങ്ങൾ ഒരു ലൂപ്പിൽ പരിശീലന കാലഘട്ടത്തിലേക്ക് പോകുന്നു. ഒരു പരിശീലന കാലയളവ് ന്യൂറൽ നെറ്റ്വർക്ക് പരിശീലനത്തിന്റെ ഒരു റൗണ്ട് മാത്രമാണ്. മിനി ബാച്ചുകളുടെ ഒരു ലിസ്റ്റ് നിർമ്മിക്കുന്നതിന് മുമ്പ് ക്രമരഹിതത ഉറപ്പാക്കാൻ ഞങ്ങൾ ആദ്യം ഓരോ കാലഘട്ടത്തിലെയും ഡാറ്റ ഷഫിൾ ചെയ്യുന്നു.
ചുവടെ ചർച്ചചെയ്യുന്ന അപ്ഡേറ്റ് മിനി ബാച്ച് ഫംഗ്ഷൻ ഓരോ മിനി ബാച്ചിനും വിളിക്കും. ടെസ്റ്റ് ഡാറ്റ ലഭ്യമാണെങ്കിൽ പരിശോധനയുടെ കൃത്യതയും തിരികെ നൽകും.
കോസ്റ്റ് ഡെറിവേറ്റീവ് ഹെൽപ്പർ ഫംഗ്ഷൻ
യഥാർത്ഥത്തിൽ ബാക്ക്പ്രൊപഗേഷൻ കോഡ് സൃഷ്ടിക്കുന്നതിന് മുമ്പ് നമുക്ക് കോസ്റ്റ് ഡെറിവേറ്റീവ് എന്നൊരു സഹായ ഫംഗ്ഷൻ വികസിപ്പിക്കാം. നമ്മുടെ ഔട്ട്പുട്ട് ലെയറിൽ ഒരു തെറ്റ് സംഭവിച്ചാൽ, കോസ്റ്റ് ഡെറിവേറ്റീവ് ഫംഗ്ഷൻ അത് കാണിക്കും.
ഇതിന് രണ്ട് ഇൻപുട്ടുകൾ ആവശ്യമാണ്: ഔട്ട്പുട്ട് ആക്റ്റിവേഷൻ അറേയും പ്രതീക്ഷിക്കുന്ന ഔട്ട്പുട്ട് മൂല്യങ്ങളുടെ y-കോർഡിനേറ്റുകളും.
ബാക്ക്പ്രൊപ്പഗേഷൻ പ്രവർത്തനം
ഞങ്ങളുടെ നിലവിലെ ആക്റ്റിവേഷൻ വെക്ടർ, ആക്റ്റിവേഷൻ, അതുപോലെ മറ്റേതെങ്കിലും ആക്റ്റിവേഷൻ വെക്ടറുകൾ, ആക്റ്റിവേഷനുകൾ, z-വെക്ടറുകൾ, zs എന്നിവയെല്ലാം മനസ്സിൽ സൂക്ഷിക്കേണ്ടതാണ്. ഇൻപുട്ട് ലെയർ എന്ന് വിളിക്കുന്ന ഒരു ലെയർ ആദ്യം സജീവമാക്കുന്നു.
ഓരോ പക്ഷപാതവും ഭാരവും ഇട്ടതിനുശേഷം ഞങ്ങൾ ലൂപ്പ് ചെയ്യും. ഓരോ ലൂപ്പിലും z വെക്ടറിനെ വെയ്റ്റുകളുടെയും ആക്റ്റിവേഷന്റെയും ഡോട്ട് പ്രൊഡക്ട് ആയി കണക്കാക്കുകയും അത് zs ന്റെ ലിസ്റ്റിലേക്ക് ചേർക്കുകയും സജീവമാക്കൽ വീണ്ടും കണക്കാക്കുകയും ആക്റ്റിവേഷനുകളുടെ ലിസ്റ്റിലേക്ക് അപ്ഡേറ്റ് ചെയ്ത ആക്റ്റിവേഷൻ ചേർക്കുകയും ഉൾപ്പെടുന്നു.
ഒടുവിൽ, കണക്ക്. zs വെക്റ്ററുകളുടെ അവസാന മൂലകത്തിന്റെ സിഗ്മോയിഡ് പ്രൈം കൊണ്ട് ഗുണിച്ച മുൻ പാളിയിൽ നിന്നുള്ള പിശകിന് തുല്യമായ ഡെൽറ്റ, നമ്മുടെ ബാക്ക്വേഡ് പാസ് ആരംഭിക്കുന്നതിന് മുമ്പ് കണക്കാക്കുന്നു.
നബ്ല ബിയുടെ അവസാന പാളി ഡെൽറ്റയായി സജ്ജീകരിച്ചിരിക്കുന്നു, കൂടാതെ നബ്ല wയുടെ അവസാന പാളി ഡെൽറ്റയുടെ ഡോട്ട് ഉൽപ്പന്നമായും രണ്ടാമത്തെ മുതൽ അവസാനത്തെ ആക്ടിവേഷൻ പാളിയായും സജ്ജീകരിച്ചിരിക്കുന്നു (ട്രാൻസ്പോസ് ചെയ്തതിനാൽ നമുക്ക് യഥാർത്ഥത്തിൽ കണക്ക് ചെയ്യാൻ കഴിയും) .
ഞങ്ങൾ മുമ്പത്തെപ്പോലെ തന്നെ തുടരുന്നു, രണ്ടാമത്തെ ലെയറിൽ ആരംഭിച്ച് അവസാനത്തേതിൽ അവസാനിക്കുന്നു, ഈ അവസാന ലെയറുകൾ പൂർത്തിയാക്കിയ ശേഷം പ്രക്രിയ ആവർത്തിക്കുക. പിന്നീട് നബ്ലകൾ ഒരു ട്യൂപ്പിൾ ആയി തിരികെ നൽകുന്നു.
മിനി-ബാച്ച് ഗ്രേഡിയന്റ് ഡിസെന്റ് അപ്ഡേറ്റ് ചെയ്യുന്നു
മുമ്പത്തെ ഞങ്ങളുടെ SGD (സ്റ്റോക്കാസ്റ്റിക് ഗ്രേഡിയന്റ് ഡിസെന്റ്) രീതി മിനി-ബാച്ച് അപ്ഡേറ്റ് ഉൾക്കൊള്ളുന്നു. ഇത് എസ്ജിഡിയിൽ ഉപയോഗിക്കുന്നതിനാൽ ബാക്ക്പ്രോപ്പും ആവശ്യമായതിനാൽ, ഈ ഫംഗ്ഷൻ എവിടെ സ്ഥാപിക്കണമെന്ന് ഞാൻ ചർച്ച ചെയ്തു.
ഒടുവിൽ, അത് ഇവിടെ പോസ്റ്റ് ചെയ്യാൻ ഞാൻ തീരുമാനിച്ചു. നമ്മുടെ ബാക്ക്പ്രോപ്പ് ഫംഗ്ഷൻ ചെയ്തതുപോലെ, ബയസുകളുടെയും വെയ്റ്റുകളുടെയും നബ്ലകളുടെ 0 വെക്ടറുകൾ സൃഷ്ടിച്ചാണ് ഇത് ആരംഭിക്കുന്നത്.
ഇതിന് രണ്ട് ഇൻപുട്ടുകളായി മിനി ബാച്ചും എറ്റ ലേണിംഗ് നിരക്കും ആവശ്യമാണ്. മിനി-ബാച്ചിൽ, ഓരോ ഇൻപുട്ട്, x, ഔട്ട്പുട്ട്, y എന്നിവയ്ക്കും ഓരോ നാബ്ല അറേയുടെയും ഡെൽറ്റ ലഭിക്കുന്നതിന് ഞങ്ങൾ ബാക്ക്പ്രോപ്പ് ഫംഗ്ഷൻ ഉപയോഗിക്കുന്നു. നബ്ല ലിസ്റ്റുകൾ ഈ ഡെൽറ്റകൾ ഉപയോഗിച്ച് അപ്ഡേറ്റ് ചെയ്യുന്നു.
അവസാനമായി, നെറ്റ്വർക്കിന്റെ ഭാരവും പക്ഷപാതവും അപ്ഡേറ്റ് ചെയ്യുന്നതിന് ഞങ്ങൾ പഠന നിരക്കും നബ്ലകളും ഉപയോഗിക്കുന്നു. ഓരോ മൂല്യവും ഏറ്റവും പുതിയ മൂല്യത്തിലേക്ക് അപ്ഡേറ്റ് ചെയ്യുന്നു, പഠന നിരക്ക് കുറച്ച്, മിനിബാച്ച് വലുപ്പം കൊണ്ട് ഗുണിച്ച്, തുടർന്ന് നബ്ല മൂല്യത്തിലേക്ക് ചേർക്കുന്നു.
പ്രവർത്തനം വിലയിരുത്തുക
മൂല്യനിർണ്ണയ പ്രവർത്തനമാണ് നമ്മൾ എഴുതേണ്ട അവസാനത്തേത്. ഈ ഫംഗ്ഷനുള്ള ഏക ഇൻപുട്ട് ടെസ്റ്റ് ഡാറ്റയാണ്. ഈ ഫംഗ്ഷനിൽ, ഞങ്ങൾ നെറ്റ്വർക്കിന്റെ ഔട്ട്പുട്ടുകളെ പ്രതീക്ഷിച്ച ഫലവുമായി താരതമ്യം ചെയ്യുന്നു, y. ഇൻപുട്ട്, x, ഫോർവേഡ് എന്നിവ നൽകുന്നതിലൂടെ, നെറ്റ്വർക്കിന്റെ ഔട്ട്പുട്ടുകൾ നിർണ്ണയിക്കപ്പെടുന്നു.
കോഡ് പൂർത്തിയാക്കുക
ഞങ്ങൾ എല്ലാ കോഡുകളും സംയോജിപ്പിക്കുമ്പോൾ, ഇത് ഇങ്ങനെയാണ് ദൃശ്യമാകുന്നത്.
ന്യൂറൽ നെറ്റ്വർക്ക് പരിശോധിക്കുന്നു
MNIST ഡാറ്റ ലോഡുചെയ്യുന്നു
ദി MNIST ഡാറ്റ .pkl.gz ഫോർമാറ്റിലാണ്, അത് ഞങ്ങൾ GZIP ഉപയോഗിച്ച് തുറന്ന് അച്ചാർ ഉപയോഗിച്ച് ലോഡ് ചെയ്യും. പരിശീലനം, മൂല്യനിർണ്ണയം, ടെസ്റ്റ് ഡാറ്റ എന്നിങ്ങനെ വിഭജിച്ച് മൂന്ന് വലുപ്പമുള്ള ഈ ഡാറ്റ ലോഡ് ചെയ്യുന്നതിനുള്ള ഒരു ദ്രുത രീതി നമുക്ക് എഴുതാം.
ഞങ്ങളുടെ ഡാറ്റ കൈകാര്യം ചെയ്യുന്നത് എളുപ്പമാക്കുന്നതിന്, 10 ഇനങ്ങളുടെ അറേയിലേക്ക് y എൻകോഡ് ചെയ്യുന്നതിന് ഞങ്ങൾ മറ്റൊരു ഫംഗ്ഷൻ എഴുതും. ചിത്രത്തിന്റെ ശരിയായ അക്കവുമായി പൊരുത്തപ്പെടുന്ന 0 ഒഴികെയുള്ള അറേ 1 സെ ആയിരിക്കും.
ഞങ്ങളുടെ ഡാറ്റ വായിക്കാനാകുന്ന ഫോർമാറ്റിലേക്ക് ലോഡ് ചെയ്യുന്നതിന് ഞങ്ങൾ അടിസ്ഥാന ലോഡ് ഡാറ്റയും ഒരു ഹോട്ട് എൻകോഡ് രീതിയും ഉപയോഗിക്കും. മറ്റൊരു ഫംഗ്ഷൻ എഴുതപ്പെടും, അത് ഞങ്ങളുടെ x മൂല്യങ്ങളെ ചിത്രത്തിന്റെ 784 പിക്സലുകളുമായി പൊരുത്തപ്പെടുന്ന 784 വലുപ്പമുള്ള ഒരു ലിസ്റ്റിലേക്കും ഞങ്ങളുടെ y മൂല്യങ്ങളെ അവയുടെ സിംഗിൾ ഹോട്ട് എൻകോഡ് ചെയ്ത വെക്റ്റർ രൂപത്തിലേക്കും മാറ്റും.
ഒരു സൂചിക മറ്റൊന്നുമായി പൊരുത്തപ്പെടുന്ന തരത്തിൽ ഞങ്ങൾ x, y മൂല്യങ്ങൾ സംയോജിപ്പിക്കും. പരിശീലനം, മൂല്യനിർണ്ണയം, ടെസ്റ്റ് ഡാറ്റ സെറ്റുകൾ എന്നിവയ്ക്ക് ഇത് ബാധകമാണ്. അതിനുശേഷം ഞങ്ങൾ മാറ്റിയ ഡാറ്റ തിരികെ നൽകുന്നു.
ടെസ്റ്റുകൾ നടത്തുന്നു
"mnist loader" എന്ന പേരിൽ ഞങ്ങൾ ഒരു പുതിയ ഫയൽ നിർമ്മിക്കും, അത് ഞങ്ങൾ മുമ്പ് സ്ഥാപിച്ച ന്യൂറൽ നെറ്റ്വർക്കും (ലളിതമായ nn) MNIST ഡാറ്റാ സെറ്റ് ലോഡറും ഞങ്ങൾ ടെസ്റ്റിംഗ് ആരംഭിക്കുന്നതിന് മുമ്പ് ഇറക്കുമതി ചെയ്യും.
ഈ ഫയലിൽ, ഡാറ്റ ഇറക്കുമതി ചെയ്യുക, 784-ന്റെ ഇൻപുട്ട് ലെയർ വലുപ്പവും 10-ന്റെ ഔട്ട്പുട്ട് ലെയർ വലുപ്പവുമുള്ള ഒരു നെറ്റ്വർക്ക് നിർമ്മിക്കുക, പരിശീലന ഡാറ്റയിൽ നെറ്റ്വർക്കിന്റെ SGD ഫംഗ്ഷൻ പ്രവർത്തിപ്പിക്കുക, തുടർന്ന് ടെസ്റ്റ് ഡാറ്റ ഉപയോഗിച്ച് അത് പരിശോധിക്കുക.
ഞങ്ങളുടെ ഇൻപുട്ട് ലെയറുകളുടെ ലിസ്റ്റിന്, 784-നും 10-നും ഇടയിലുള്ള സംഖ്യകളിൽ വ്യത്യാസമൊന്നുമില്ല. മറ്റ് ലെയറുകൾ നമുക്ക് ഇഷ്ടമുള്ള രീതിയിൽ മാറ്റാം; ഇൻപുട്ട്, ഔട്ട്പുട്ട് വലുപ്പങ്ങൾ മാത്രം നിശ്ചയിച്ചിരിക്കുന്നു.
മൂന്ന് പാളികൾ ആവശ്യമില്ല; നമുക്ക് നാലോ അഞ്ചോ അല്ലെങ്കിൽ രണ്ടോ ഉപയോഗിക്കാം. അത് പരീക്ഷിച്ചു രസിക്കുക.
തീരുമാനം
ഇവിടെ, പൈത്തൺ 3 ഉപയോഗിച്ച്, ഞങ്ങൾ ആദ്യം മുതൽ ഒരു ന്യൂറൽ നെറ്റ്വർക്ക് സൃഷ്ടിക്കുന്നു. ഉയർന്ന തലത്തിലുള്ള ഗണിതത്തോടൊപ്പം, നടപ്പാക്കലിന്റെ പ്രത്യേകതകളും ഞങ്ങൾ ചർച്ച ചെയ്തു.
സഹായ പ്രവർത്തനങ്ങൾ നടപ്പിലാക്കിക്കൊണ്ട് ഞങ്ങൾ ആരംഭിച്ചു. ന്യൂറോണുകൾ പ്രവർത്തിക്കുന്നതിന്, സിഗ്മോയിഡ്, സിഗ്മോയിഡ് പ്രൈം ഫംഗ്ഷനുകൾ നിർണായകമാണ്. ന്യൂറൽ നെറ്റ്വർക്കിലേക്ക് ഡാറ്റ നൽകുന്നതിനുള്ള അടിസ്ഥാന പ്രക്രിയയായ ഫീഡ്ഫോർവേർഡ് ഫംഗ്ഷൻ ഞങ്ങൾ പിന്നീട് പ്രായോഗികമാക്കുന്നു.
അടുത്തതായി, ഞങ്ങളുടെ ന്യൂറൽ നെറ്റ്വർക്കിനെ നയിക്കുന്ന എഞ്ചിനായ പൈത്തണിൽ ഞങ്ങൾ ഗ്രേഡിയന്റ് ഡിസെന്റ് ഫംഗ്ഷൻ സൃഷ്ടിച്ചു. "ലോക്കൽ മിനിമ" കണ്ടെത്താനും അവയുടെ ഭാരവും പക്ഷപാതവും ഒപ്റ്റിമൈസ് ചെയ്യാനും, ഞങ്ങളുടെ ന്യൂറൽ നെറ്റ്വർക്ക് ഗ്രേഡിയന്റ് ഡിസെന്റ് ഉപയോഗിക്കുന്നു. ഉപയോഗിച്ച് ഞങ്ങൾ backpropagation ഫംഗ്ഷൻ സൃഷ്ടിച്ചു ഗ്രേഡിയന്റ് ഇറക്കം.
ഔട്ട്പുട്ടുകൾ ശരിയായ ലേബലുകളുമായി പൊരുത്തപ്പെടാത്തപ്പോൾ അപ്ഡേറ്റുകൾ നൽകുന്നതിലൂടെ, ഈ ഫംഗ്ഷൻ ന്യൂറൽ നെറ്റ്വർക്കിനെ "പഠിക്കാൻ" പ്രാപ്തമാക്കുന്നു.
അവസാനം, ഞങ്ങൾ ഞങ്ങളുടെ പുതിയ പൈത്തൺ ഇട്ടു ന്യൂറൽ നെറ്റ്വർക്ക് MNIST ഡാറ്റാ സെറ്റ് ഉപയോഗിച്ച് ടെസ്റ്റിലേക്ക്. എല്ലാം സുഗമമായി പ്രവർത്തിച്ചു.
ഹാപ്പി കോഡിംഗ്!
നിങ്ങളുടെ അഭിപ്രായങ്ങൾ രേഖപ്പെടുത്തുക