Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅
Π£ ΠΎΠ²ΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΡƒ Ρ›Ρƒ Π²Π°ΠΌ Ρ€Π΅Ρ›ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° подСситС ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ΅ Π·Π° машинско ΡƒΡ‡Π΅ΡšΠ΅ Π·Π° 30 ΠΌΠΈΠ½ΡƒΡ‚Π°, ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ нСуронску ΠΌΡ€Π΅ΠΆΡƒ Π·Π° ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡšΠ΅ слика, Π° Π·Π°Ρ‚ΠΈΠΌ ΠΏΠΎΠΊΡ€Π΅Π½Π΅Ρ‚Π΅ исту ΠΌΡ€Π΅ΠΆΡƒ Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΎΠΌ процСсору (Π“ΠŸΠ£).

ΠŸΡ€Π²ΠΎ, Ρ…Π°Ρ˜Π΄Π΅ Π΄Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡˆΠ΅ΠΌΠΎ ΡˆΡ‚Π° јС нСуронска ΠΌΡ€Π΅ΠΆΠ°.

Π£ нашСм ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ, ΠΎΠ²ΠΎ јС ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π», ΠΊΠ°ΠΎ ΠΈ њСгово софтвСрско ΠΈΠ»ΠΈ хардвСрско ΠΎΠ»ΠΈΡ‡Π΅ΡšΠ΅, ΠΈΠ·Π³Ρ€Π°Ρ’Π΅Π½ΠΎ Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ˜Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡΠ°ΡšΠ° Π±ΠΈΠΎΠ»ΠΎΡˆΠΊΠΈΡ… нСуронских ΠΌΡ€Π΅ΠΆΠ° - ΠΌΡ€Π΅ΠΆΠ° Π½Π΅Ρ€Π²Π½ΠΈΡ… Ρ›Π΅Π»ΠΈΡ˜Π° ΠΆΠΈΠ²ΠΎΠ³ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΌΠ°. Овај ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ јС настао Ρ‚ΠΎΠΊΠΎΠΌ ΠΏΡ€ΠΎΡƒΡ‡Π°Π²Π°ΡšΠ° процСса који сС Π΄Π΅ΡˆΠ°Π²Π°Ρ˜Ρƒ Ρƒ ΠΌΠΎΠ·Π³Ρƒ ΠΈ ΠΏΠΎΠΊΡƒΡˆΠ°Ρ˜Π° Π΄Π° сС Ρ‚ΠΈ процСси ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€Π°Ρ˜Ρƒ.

НСуронскС ΠΌΡ€Π΅ΠΆΠ΅ нису ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Ρƒ ΡƒΠΎΠ±ΠΈΡ‡Π°Ρ˜Π΅Π½ΠΎΠΌ смислу Ρ‚Π΅ Ρ€Π΅Ρ‡ΠΈ, ΠΎΠ½Π΅ су ΠΎΠ±ΡƒΡ‡Π΅Π½Π΅. Бпособност ΡƒΡ‡Π΅ΡšΠ° јС јСдна ΠΎΠ΄ Π³Π»Π°Π²Π½ΠΈΡ… прСдности нСуронских ΠΌΡ€Π΅ΠΆΠ° Ρƒ односу Π½Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π°Π»Π½Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅. Π’Π΅Ρ…Π½ΠΈΡ‡ΠΊΠΈ, ΡƒΡ‡Π΅ΡšΠ΅ сС ΡΠ°ΡΡ‚ΠΎΡ˜ΠΈ ΠΎΠ΄ ΠΏΡ€ΠΎΠ½Π°Π»Π°ΠΆΠ΅ΡšΠ° ΠΊΠΎΠ΅Ρ„ΠΈΡ†ΠΈΡ˜Π΅Π½Π°Ρ‚Π° Π²Π΅Π·Π° ΠΈΠ·ΠΌΠ΅Ρ’Ρƒ Π½Π΅ΡƒΡ€ΠΎΠ½Π°. Π’ΠΎΠΊΠΎΠΌ процСса ΠΎΠ±ΡƒΠΊΠ΅, нСуронска ΠΌΡ€Π΅ΠΆΠ° јС Ρƒ ΡΡ‚Π°ΡšΡƒ Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΡ˜Π΅ слоТСнС зависности ΠΈΠ·ΠΌΠ΅Ρ’Ρƒ ΡƒΠ»Π°Π·Π½ΠΈΡ… ΠΈ ΠΈΠ·Π»Π°Π·Π½ΠΈΡ… ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°, ΠΊΠ°ΠΎ ΠΈ Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈ Π³Π΅Π½Π΅Ρ€Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Ρƒ.

Π‘Π° ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡˆΡ‚Π° машинског ΡƒΡ‡Π΅ΡšΠ°, нСуронска ΠΌΡ€Π΅ΠΆΠ° јС посСбан ΡΠ»ΡƒΡ‡Π°Ρ˜ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡšΠ° ΠΎΠ±Ρ€Π°Π·Π°Ρ†Π°, дискриминантнС Π°Π½Π°Π»ΠΈΠ·Π΅, ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π³Ρ€ΡƒΠΏΠΈΡΠ°ΡšΠ° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

ΠžΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅

ΠŸΡ€Π²ΠΎ, поглСдајмо ΠΎΠΏΡ€Π΅ΠΌΡƒ. ΠŸΠΎΡ‚Ρ€Π΅Π±Π°Π½ Π½Π°ΠΌ јС сСрвСр са инсталираним Π›ΠΈΠ½ΡƒΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΌ систСмом. ΠžΠΏΡ€Π΅ΠΌΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° Π·Π° Ρ€Π°Π΄ систСма машинског ΡƒΡ‡Π΅ΡšΠ° јС ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ ΠΌΠΎΡ›Π½Π° ΠΈ, ΠΊΠ°ΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, скупа. Π—Π° ΠΎΠ½Π΅ који Π½Π΅ΠΌΠ°Ρ˜Ρƒ Π΄ΠΎΠ±Ρ€Ρƒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΏΡ€ΠΈ Ρ€ΡƒΡ†ΠΈ, ΠΏΡ€Π΅ΠΏΠΎΡ€ΡƒΡ‡ΡƒΡ˜Π΅ΠΌ Π΄Π° ΠΎΠ±Ρ€Π°Ρ‚Π΅ ΠΏΠ°ΠΆΡšΡƒ Π½Π° ΠΏΠΎΠ½ΡƒΠ΄Π΅ ΠΊΠ»Π°ΡƒΠ΄ ΠΏΡ€ΠΎΠ²Π°Ρ˜Π΄Π΅Ρ€Π°. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π±Ρ€Π·ΠΎ ΠΈΠ·Π½Π°Ρ˜ΠΌΠΈΡ‚ΠΈ Ρ‚Ρ€Π°ΠΆΠ΅Π½ΠΈ сСрвСр ΠΈ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΠΈ само Π²Ρ€Π΅ΠΌΠ΅ ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ°.

Π£ ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚ΠΈΠΌΠ° Π³Π΄Π΅ јС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚ΠΈ нСуронскС ΠΌΡ€Π΅ΠΆΠ΅ користим сСрвСрС јСдног ΠΎΠ΄ руских ΠΏΡ€ΠΎΠ²Π°Ρ˜Π΄Π΅Ρ€Π° ΠΎΠ±Π»Π°ΠΊΠ°. Компанија Π½ΡƒΠ΄ΠΈ сСрвСрС Ρƒ ΠΎΠ±Π»Π°ΠΊΡƒ Π·Π° ΠΈΠ·Π½Π°Ρ˜ΠΌΡ™ΠΈΠ²Π°ΡšΠ΅ посСбно Π·Π° машинско ΡƒΡ‡Π΅ΡšΠ΅ са ΠΌΠΎΡ›Π½ΠΈΠΌ ВСсла Π’100 Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΌ процСсорима (Π“ΠŸΠ£) компанијС ΠΠ’Π˜Π”Π˜Π. Π£ΠΊΡ€Π°Ρ‚ΠΊΠΎ: ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ сСрвСра са Π“ΠŸΠ£-ΠΎΠΌ ΠΌΠΎΠΆΠ΅ Π±ΠΈΡ‚ΠΈ дСсСтинС ΠΏΡƒΡ‚Π° Π΅Ρ„ΠΈΠΊΠ°ΡΠ½ΠΈΡ˜Π΅ (Π±Ρ€ΠΆΠ΅) Ρƒ ΠΏΠΎΡ€Π΅Ρ’Π΅ΡšΡƒ са сСрвСром сличнС Ρ†Π΅Π½Π΅ који користи ЦПУ (ΠΏΠΎΠ·Π½Π°Ρ‚Ρƒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»Π½Ρƒ процСсорску Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ) Π·Π° ΠΏΡ€ΠΎΡ€Π°Ρ‡ΡƒΠ½Π΅. Ово сС постиТС Π·Π°Ρ…Π²Π°Ρ™ΡƒΡ˜ΡƒΡ›ΠΈ карактСристикама Π“ΠŸΠ£ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅, која сС Π±Ρ€ΠΆΠ΅ носи са ΠΏΡ€ΠΎΡ€Π°Ρ‡ΡƒΠ½ΠΈΠΌΠ°.

Π”Π° бисмо ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π»ΠΈ Π΄ΠΎΠ»Π΅ описанС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΡƒΠΏΠΈΠ»ΠΈ смо слСдСћи сСрвСр Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ Π΄Π°Π½Π°:

  • Π‘Π‘Π” диск 150 Π“Π‘
  • РАМ 32 Π“Π‘
  • ВСсла Π’100 16 Π“Π± процСсор са 4 Ρ˜Π΅Π·Π³Ρ€Π°

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π»ΠΈ смо Π£Π±ΡƒΠ½Ρ‚Ρƒ 18.04 Π½Π° Π½Π°ΡˆΡƒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ.

ΠŸΠΎΡΡ‚Π°Π²Ρ™Π°ΡšΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ°

Π‘Π°Π΄Π° ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°Ρ˜ΠΌΠΎ свС ΡˆΡ‚ΠΎ јС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ Π·Π° Ρ€Π°Π΄ Π½Π° сСрвСру. ΠŸΠΎΡˆΡ‚ΠΎ јС наш Ρ‡Π»Π°Π½Π°ΠΊ првСнствСно Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ›Ρƒ ΠΎ Π½Π΅ΠΊΠΈΠΌ Ρ‚Π°Ρ‡ΠΊΠ°ΠΌΠ° којС Ρ›Π΅ ΠΈΠΌ Π±ΠΈΡ‚ΠΈ кориснС.

Π’Π΅Π»ΠΈΠΊΠΈ Π΄Π΅ΠΎ посла ΠΏΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ подСшавања ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ° ΠΎΠ±Π°Π²Ρ™Π° сС ΠΏΡ€Π΅ΠΊΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π½Π΅ линијС. Π’Π΅Ρ›ΠΈΠ½Π° корисника користи Виндовс ΠΊΠ°ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈ ОБ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Π΄Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° Ρƒ ΠΎΠ²ΠΎΠΌ ОБ-Ρƒ оставља ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π° сС ΠΏΠΎΠΆΠ΅Π»ΠΈ. Π—Π±ΠΎΠ³ Ρ‚ΠΎΠ³Π° Ρ›Π΅ΠΌΠΎ користити Π·Π³ΠΎΠ΄Π°Π½ Π°Π»Π°Ρ‚ Π¦ΠΌΠ΄Π΅Ρ€/. ΠŸΡ€Π΅ΡƒΠ·ΠΌΠΈΡ‚Π΅ ΠΌΠΈΠ½ΠΈ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½ΠΈΡ‚Π΅ Π¦ΠΌΠ΄Π΅Ρ€.Π΅ΠΊΠ΅. Π—Π°Ρ‚ΠΈΠΌ сС ΠΌΠΎΡ€Π°Ρ‚Π΅ ΠΏΠΎΠ²Π΅Π·Π°Ρ‚ΠΈ са сСрвСром ΠΏΡ€Π΅ΠΊΠΎ Π‘Π‘Π₯:

ssh root@server-ip-or-hostname

УмСсто сСрвСр-ΠΈΠΏ-ΠΎΡ€-хостнамС, Π½Π°Π²Π΅Π΄ΠΈΡ‚Π΅ ИП адрСсу ΠΈΠ»ΠΈ ДНБ ΠΈΠΌΠ΅ вашСг сСрвСра. Π—Π°Ρ‚ΠΈΠΌ унСситС Π»ΠΎΠ·ΠΈΠ½ΠΊΡƒ ΠΈ Π°ΠΊΠΎ јС Π²Π΅Π·Π° ΡƒΡΠΏΠ΅ΡˆΠ½Π°, Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π±ΠΈ Π΄Π° добијСмо ΠΏΠΎΡ€ΡƒΠΊΡƒ сличну овој.

Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-74-generic x86_64)

Π“Π»Π°Π²Π½ΠΈ јСзик Π·Π° Ρ€Π°Π·Π²ΠΎΡ˜ ΠœΠ› ΠΌΠΎΠ΄Π΅Π»Π° јС ΠŸΠΈΡ‚Ρ…ΠΎΠ½. А Π½Π°Ρ˜ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½ΠΈΡ˜Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Π·Π° ΡšΠ΅Π³ΠΎΠ²Ρƒ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Ρƒ Π½Π° Π›ΠΈΠ½ΡƒΠΊΡƒ јС Анаконда.

Π₯ајдС Π΄Π° Π³Π° инсталирамо Π½Π° наш сСрвСр.

ΠŸΠΎΡ‡ΠΈΡšΠ΅ΠΌΠΎ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ΠΌ Π»ΠΎΠΊΠ°Π»Π½ΠΎΠ³ ΠΌΠ΅Π½Π°ΡŸΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°:

sudo apt-get update

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Ρ†ΡƒΡ€Π» (услуТни ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½Π΅ линијС):

sudo apt-get install curl

ΠŸΡ€Π΅ΡƒΠ·ΠΌΠΈΡ‚Π΅ Π½Π°Ρ˜Π½ΠΎΠ²ΠΈΡ˜Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Анацонда Дистрибутион:

cd /tmp
curl –O https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh

ΠŸΠΎΡ‡Π½ΠΈΠΌΠΎ са ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜ΠΎΠΌ:

bash Anaconda3-2019.10-Linux-x86_64.sh

Π’ΠΎΠΊΠΎΠΌ процСса ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π΅, ΠΎΠ΄ вас Ρ›Π΅ сС Ρ‚Ρ€Π°ΠΆΠΈΡ‚ΠΈ Π΄Π° ΠΏΠΎΡ‚Π²Ρ€Π΄ΠΈΡ‚Π΅ ΡƒΠ³ΠΎΠ²ΠΎΡ€ ΠΎ Π»ΠΈΡ†Π΅Π½Ρ†ΠΈ. Након ΡƒΡΠΏΠ΅ΡˆΠ½Π΅ ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π΅ Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π±ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΠ²ΠΎ:

Thank you for installing Anaconda3!

Многи ΠΎΠΊΠ²ΠΈΡ€ΠΈ су сада ΠΊΡ€Π΅ΠΈΡ€Π°Π½ΠΈ Π·Π° Ρ€Π°Π·Π²ΠΎΡ˜ ΠœΠ› ΠΌΠΎΠ΄Π΅Π»Π°; Ρ€Π°Π΄ΠΈΠΌΠΎ са Π½Π°Ρ˜ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½ΠΈΡ˜ΠΈΠΌ: ΠŸΠΈΠ’ΠΎΡ€Ρ†Ρ… ΠΈ ВСнсорфлов.

ΠšΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ ΠΎΠΊΠ²ΠΈΡ€Π° Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π° Π΄Π° ΠΏΠΎΠ²Π΅Ρ›Π°Ρ‚Π΅ Π±Ρ€Π·ΠΈΠ½Ρƒ Ρ€Π°Π·Π²ΠΎΡ˜Π° ΠΈ користитС Π³ΠΎΡ‚ΠΎΠ²Π΅ Π°Π»Π°Ρ‚Π΅ Π·Π° стандарднС Π·Π°Π΄Π°Ρ‚ΠΊΠ΅.

Π£ ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ρ›Π΅ΠΌΠΎ Ρ€Π°Π΄ΠΈΡ‚ΠΈ са ΠŸΠΈΠ’ΠΎΡ€Ρ†Ρ…-ΠΎΠΌ. Π₯ајдС Π΄Π° Π³Π° инсталирамо:

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

Π‘Π°Π΄Π° ΠΌΠΎΡ€Π°ΠΌΠΎ Π΄Π° ΠΏΠΎΠΊΡ€Π΅Π½Π΅ΠΌΠΎ ΠˆΡƒΠΏΠΈΡ‚Π΅Ρ€ НотСбоок, ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π°Π½ Ρ€Π°Π·Π²ΠΎΡ˜Π½ΠΈ Π°Π»Π°Ρ‚ Π·Π° ΡΡ‚Ρ€ΡƒΡ‡ΡšΠ°ΠΊΠ΅ Π·Π° ΠœΠ›. ΠžΠΌΠΎΠ³ΡƒΡ›Π°Π²Π° Π²Π°ΠΌ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄ ΠΈ ΠΎΠ΄ΠΌΠ°Ρ… Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π΅ њСговог ΠΈΠ·Π²Ρ€ΡˆΠ΅ΡšΠ°. ΠˆΡƒΠΏΠΈΡ‚Π΅Ρ€ НотСбоок јС ΡƒΠΊΡ™ΡƒΡ‡Π΅Π½ ΡƒΠ· Анацонда ΠΈ Π²Π΅Ρ› јС инсталиран Π½Π° нашСм сСрвСру. ΠœΠΎΡ€Π°Ρ‚Π΅ Π΄Π° сС ΠΏΠΎΠ²Π΅ΠΆΠ΅Ρ‚Π΅ Π½Π° њСга са нашСг дСсктоп систСма.

Π”Π° бисмо Ρ‚ΠΎ ΡƒΡ€Π°Π΄ΠΈΠ»ΠΈ, ΠΏΡ€Π²ΠΎ Ρ›Π΅ΠΌΠΎ ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ΠΈ ΠˆΡƒΠΏΠΈΡ‚Π΅Ρ€ Π½Π° сСрвСру који Π½Π°Π²ΠΎΠ΄ΠΈ ΠΏΠΎΡ€Ρ‚ 8080:

jupyter notebook --no-browser --port=8080 --allow-root

Π—Π°Ρ‚ΠΈΠΌ, ΠΎΡ‚Π²Π°Ρ€Π°Ρ˜ΡƒΡ›ΠΈ још Ρ˜Π΅Π΄Π½Ρƒ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Ρƒ Ρƒ нашој Π¦ΠΌΠ΄Π΅Ρ€ ΠΊΠΎΠ½Π·ΠΎΠ»ΠΈ (Π³ΠΎΡ€ΡšΠΈ ΠΌΠ΅Π½ΠΈ - дијалог Нова ΠΊΠΎΠ½Π·ΠΎΠ»Π°) ΠΌΠΈ Ρ›Π΅ΠΌΠΎ сС ΠΏΠΎΠ²Π΅Π·Π°Ρ‚ΠΈ ΠΏΡ€Π΅ΠΊΠΎ ΠΏΠΎΡ€Ρ‚Π° 8080 Π½Π° сСрвСр ΠΏΡ€Π΅ΠΊΠΎ Π‘Π‘Π₯:

ssh -L 8080:localhost:8080 root@server-ip-or-hostname

Када унСсСмо ΠΏΡ€Π²Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π±ΠΈΡ›Π΅ Π½Π°ΠΌ ΠΏΠΎΠ½ΡƒΡ’Π΅Π½Π΅ Π²Π΅Π·Π΅ Π·Π° ΠΎΡ‚Π²Π°Ρ€Π°ΡšΠ΅ ΠˆΡƒΠΏΠΈΡ‚Π΅Ρ€-Π° Ρƒ нашСм ΠΏΡ€Π΅Ρ‚Ρ€Π°ΠΆΠΈΠ²Π°Ρ‡Ρƒ:

To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-18788-open.html
    Or copy and paste one of these URLs:
        http://localhost:8080/?token=cca0bd0b30857821194b9018a5394a4ed2322236f116d311
     or http://127.0.0.1:8080/?token=cca0bd0b30857821194b9018a5394a4ed2322236f116d311

Π₯ајдС Π΄Π° користимо Π²Π΅Π·Ρƒ Π·Π° лоцалхост:8080. ΠšΠΎΠΏΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΏΡƒΠ½Ρƒ ΠΏΡƒΡ‚Π°ΡšΡƒ ΠΈ Π½Π°Π»Π΅ΠΏΠΈΡ‚Π΅ јС Ρƒ адрСсну Ρ‚Ρ€Π°ΠΊΡƒ Π»ΠΎΠΊΠ°Π»Π½ΠΎΠ³ ΠΏΡ€Π΅Ρ‚Ρ€Π°ΠΆΠΈΠ²Π°Ρ‡Π° вашСг Ρ€Π°Ρ‡ΡƒΠ½Π°Ρ€Π°. ΠˆΡƒΠΏΠΈΡ‚Π΅Ρ€ НотСбоок Ρ›Π΅ сС ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚ΠΈ.

Π₯ајдС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠΎ Π½ΠΎΠ²Ρƒ Π±Π΅Π»Π΅ΠΆΠ½ΠΈΡ†Ρƒ: Ново - Π‘Π΅Π»Π΅ΠΆΠ½ΠΈΡ†Π° - ΠŸΠΈΡ‚Ρ…ΠΎΠ½ 3.

Π₯ајдС Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠΎ исправан Ρ€Π°Π΄ свих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ којС смо инсталирали. Π₯ајдС Π΄Π° унСсСмо ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠŸΠΈΠ’ΠΎΡ€Ρ†Ρ… ΠΊΠΎΠ΄Π° Ρƒ ΠˆΡƒΠΏΠΈΡ‚Π΅Ρ€ ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½Π΅ΠΌΠΎ ΠΈΠ·Π²Ρ€ΡˆΠ΅ΡšΠ΅ (Π΄ΡƒΠ³ΠΌΠ΅ Π ΡƒΠ½):

from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π±ΠΈ Ρ‚Ρ€Π΅Π±Π°ΠΎ Π±ΠΈΡ‚ΠΈ ΠΎΡ‚ΠΏΡ€ΠΈΠ»ΠΈΠΊΠ΅ ΠΎΠ²Π°ΠΊΠΎ:

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

Ако ΠΈΠΌΠ°Ρ‚Π΅ сличан Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, ΠΎΠ½Π΄Π° смо свС исправно конфигурисали ΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° ΠΏΠΎΡ‡Π½Π΅ΠΌΠΎ Π΄Π° Ρ€Π°Π·Π²ΠΈΡ˜Π°ΠΌΠΎ нСуронску ΠΌΡ€Π΅ΠΆΡƒ!

ΠšΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ нСуронскС ΠΌΡ€Π΅ΠΆΠ΅

НаправићСмо нСуронску ΠΌΡ€Π΅ΠΆΡƒ Π·Π° ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡšΠ΅ слика. Π£Π·ΠΌΠΈΠΌΠΎ ΠΎΠ²ΠΎ ΠΊΠ°ΠΎ основу вођство.

ΠšΠΎΡ€ΠΈΡΡ‚ΠΈΡ›Π΅ΠΌΠΎ јавно доступни скуп ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ЦИЀАР10 Π·Π° ΠΎΠ±ΡƒΠΊΡƒ ΠΌΡ€Π΅ΠΆΠ΅. Има класС: β€žΠ°Π²ΠΈΠΎΠ½β€, β€žΠ°ΡƒΡ‚ΠΎΠΌΠΎΠ±ΠΈΠ»β€, β€žΠΏΡ‚ΠΈΡ†Π°β€, β€žΠΌΠ°Ρ‡ΠΊΠ°β€, β€žΡ˜Π΅Π»Π΅Π½β€, β€žΠΏΠ°Ρβ€, β€žΠΆΠ°Π±Π°β€, β€žΠΊΠΎΡšβ€, β€žΠ±Ρ€ΠΎΠ΄β€, β€žΠΊΠ°ΠΌΠΈΠΎΠ½β€. Π‘Π»ΠΈΠΊΠ΅ Ρƒ ЦИЀАР10 су 3ΠΊ32ΠΊ32, односно 3-ΠΊΠ°Π½Π°Π»Π½Π΅ сликС Ρƒ боји ΠΎΠ΄ 32ΠΊ32 пиксСла.

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅
Π—Π° Ρ€Π°Π΄ Ρ›Π΅ΠΌΠΎ користити ΠΏΠ°ΠΊΠ΅Ρ‚ који јС ΠΊΡ€Π΅ΠΈΡ€Π°ΠΎ ΠŸΠΈΠ’ΠΎΡ€Ρ†Ρ… Π·Π° Ρ€Π°Π΄ са сликама - торцхвисион.

Π£Ρ€Π°Π΄ΠΈΡ›Π΅ΠΌΠΎ слСдСћС ΠΊΠΎΡ€Π°ΠΊΠ΅ ΠΏΠΎ рСдослСду:

  • Π£Ρ‡ΠΈΡ‚Π°Π²Π°ΡšΠ΅ ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° скупова ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π·Π° ΠΎΠ±ΡƒΠΊΡƒ ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅
  • Π”Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π° нСуронскС ΠΌΡ€Π΅ΠΆΠ΅
  • ΠœΡ€Π΅ΠΆΠ½Π° ΠΎΠ±ΡƒΠΊΠ° ΠΎ ΠΏΠΎΠ΄Π°Ρ†ΠΈΠΌΠ° ΠΎ ΠΎΠ±ΡƒΡ†ΠΈ
  • ΠœΡ€Π΅ΠΆΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° тСстним ΠΏΠΎΠ΄Π°Ρ†ΠΈΠΌΠ°
  • Поновимо ΠΎΠ±ΡƒΠΊΡƒ ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ користСћи Π“ΠŸΠ£

Π˜Π·Π²Ρ€ΡˆΠΈΡ›Π΅ΠΌΠΎ сав доњи ΠΊΠΎΠ΄ Ρƒ ΠˆΡƒΠΏΠΈΡ‚Π΅Ρ€ Π½ΠΎΡ‚Π΅Π±ΠΎΠΎΠΊ-Ρƒ.

Π£Ρ‡ΠΈΡ‚Π°Π²Π°ΡšΠ΅ ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° ЦИЀАР10

ΠšΠΎΠΏΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½ΠΈΡ‚Π΅ слСдСћи ΠΊΠΎΠ΄ Ρƒ ΠˆΡƒΠΏΠΈΡ‚Π΅Ρ€-Ρƒ:


import torch
import torchvision
import torchvision.transforms as transforms

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

ΠžΠ΄Π³ΠΎΠ²ΠΎΡ€ Π±ΠΈ Ρ‚Ρ€Π΅Π±Π°ΠΎ Π±ΠΈΡ‚ΠΈ:

Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz
Extracting ./data/cifar-10-python.tar.gz to ./data
Files already downloaded and verified

Π₯ајдС Π΄Π° ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ΅ΠΌΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ слика Π·Π° ΠΎΠ±ΡƒΠΊΡƒ Π·Π° Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅:


import matplotlib.pyplot as plt
import numpy as np

# functions to show an image

def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()

# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()

# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

Π”Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π° нСуронскС ΠΌΡ€Π΅ΠΆΠ΅

Π₯ајдС Π΄Π° ΠΏΡ€Π²ΠΎ Ρ€Π°Π·ΠΌΠΎΡ‚Ρ€ΠΈΠΌΠΎ ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡˆΠ΅ нСуронска ΠΌΡ€Π΅ΠΆΠ° Π·Π° ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡšΠ΅ слика. Ово јС Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½Π° ΠΌΡ€Π΅ΠΆΠ° ΠΎΠ΄ Ρ‚Π°Ρ‡ΠΊΠ΅ Π΄ΠΎ Ρ‚Π°Ρ‡ΠΊΠ΅. Π£Π·ΠΈΠΌΠ° ΡƒΠ»Π°Π·Π½Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅, ΠΏΡ€ΠΎΡΠ»Π΅Ρ’ΡƒΡ˜Π΅ ΠΈΡ… ΠΊΡ€ΠΎΠ· Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ слојСва јСдан ΠΏΠΎ јСдан, Π° Π·Π°Ρ‚ΠΈΠΌ ΠΊΠΎΠ½Π°Ρ‡Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈ ΠΈΠ·Π»Π°Π·Π½Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅.

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

Π₯ајдС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠΎ сличну ΠΌΡ€Π΅ΠΆΡƒ Ρƒ нашСм ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΡƒ:


import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()

Π’Π°ΠΊΠΎΡ’Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡˆΠ΅ΠΌΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Ρƒ Π³ΡƒΠ±ΠΈΡ‚ΠΊΠ° ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€


import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

ΠœΡ€Π΅ΠΆΠ½Π° ΠΎΠ±ΡƒΠΊΠ° ΠΎ ΠΏΠΎΠ΄Π°Ρ†ΠΈΠΌΠ° ΠΎ ΠΎΠ±ΡƒΡ†ΠΈ

ΠŸΠΎΡ‡Π½ΠΈΠΌΠΎ Π΄Π° Ρ‚Ρ€Π΅Π½ΠΈΡ€Π°ΠΌΠΎ Π½Π°ΡˆΡƒ нСуронску ΠΌΡ€Π΅ΠΆΡƒ. Π˜ΠΌΠ°Ρ˜Ρ‚Π΅ Π½Π° ΡƒΠΌΡƒ Π΄Π° Π½Π°ΠΊΠΎΠ½ ΡˆΡ‚ΠΎ ΠΏΠΎΠΊΡ€Π΅Π½Π΅Ρ‚Π΅ овај ΠΊΠΎΠ΄, ΠΌΠΎΡ€Π°Ρ›Π΅Ρ‚Π΅ Π΄Π° сачСкатС Π½Π΅ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΄ΠΎΠΊ сС посао Π½Π΅ Π·Π°Π²Ρ€ΡˆΠΈ. Π’Ρ€Π΅Π±Π°Π»ΠΎ ΠΌΠΈ јС 5 ΠΌΠΈΠ½ΡƒΡ‚Π°. ΠŸΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ јС Π²Ρ€Π΅ΠΌΠ΅ Π·Π° ΠΎΠ±ΡƒΠΊΡƒ ΠΌΡ€Π΅ΠΆΠ΅.

 for epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

Π”ΠΎΠ±ΠΈΡ˜Π°ΠΌΠΎ слСдСћи Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚:

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

Ми Ρ‡ΡƒΠ²Π°ΠΌΠΎ наш ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»:

PATH = './cifar_net.pth'
torch.save(net.state_dict(), PATH)

ΠœΡ€Π΅ΠΆΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° тСстним ΠΏΠΎΠ΄Π°Ρ†ΠΈΠΌΠ°

ΠžΠ±ΡƒΡ‡ΠΈΠ»ΠΈ смо ΠΌΡ€Π΅ΠΆΡƒ користСћи скуп ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π·Π° ΠΎΠ±ΡƒΠΊΡƒ. Али ΠΌΠΎΡ€Π°ΠΌΠΎ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠΎ Π΄Π° Π»ΠΈ јС ΠΌΡ€Π΅ΠΆΠ° ΡƒΠΎΠΏΡˆΡ‚Π΅ Π½Π΅ΡˆΡ‚ΠΎ Π½Π°ΡƒΡ‡ΠΈΠ»Π°.

Ово Ρ›Π΅ΠΌΠΎ тСстирати Ρ‚Π°ΠΊΠΎ ΡˆΡ‚ΠΎ Ρ›Π΅ΠΌΠΎ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Ρ‚ΠΈ ΠΎΠ·Π½Π°ΠΊΡƒ класС ΠΊΠΎΡ˜Ρƒ нСуронска ΠΌΡ€Π΅ΠΆΠ° ΠΈΠ·Π»Π°Π·ΠΈ ΠΈ тСстирати јС Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠΎ Π΄Π° Π»ΠΈ јС истинита. Ако јС ΠΏΡ€Π΅Π΄Π²ΠΈΡ’Π°ΡšΠ΅ Ρ‚Π°Ρ‡Π½ΠΎ, додајСмо ΡƒΠ·ΠΎΡ€Π°ΠΊ Π½Π° листу Ρ‚Π°Ρ‡Π½ΠΈΡ… ΠΏΡ€Π΅Π΄Π²ΠΈΡ’Π°ΡšΠ°.
Π₯ајдС Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌΠΎ слику ΠΈΠ· тСстног скупа:

dataiter = iter(testloader)
images, labels = dataiter.next()

# print images
imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

Π‘Π°Π΄Π° Π·Π°ΠΌΠΎΠ»ΠΈΠΌΠΎ нСуронску ΠΌΡ€Π΅ΠΆΡƒ Π΄Π° Π½Π°ΠΌ ΠΊΠ°ΠΆΠ΅ ΡˆΡ‚Π° јС Π½Π° ΠΎΠ²ΠΈΠΌ сликама:


net = Net()
net.load_state_dict(torch.load(PATH))

outputs = net(images)

_, predicted = torch.max(outputs, 1)

print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]
                              for j in range(4)))

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ ΠΈΠ·Π³Π»Π΅Π΄Π°Ρ˜Ρƒ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Π΄ΠΎΠ±Ρ€ΠΈ: ΠΌΡ€Π΅ΠΆΠ° јС Ρ‚Π°Ρ‡Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠΎΠ²Π°Π»Π° Ρ‚Ρ€ΠΈ ΠΎΠ΄ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ сликС.

Π₯ајдС Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠΎ ΠΊΠ°ΠΊΠΎ ΠΌΡ€Π΅ΠΆΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡˆΠ΅ Ρƒ Ρ†Π΅Π»ΠΎΠΌ скупу ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.


correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

ИзглСда Π΄Π° ΠΌΡ€Π΅ΠΆΠ° Π½Π΅ΡˆΡ‚ΠΎ Π·Π½Π° ΠΈ Ρ€Π°Π΄ΠΈ. Када Π±ΠΈ насумично ΠΎΠ΄Ρ€Π΅Π΄ΠΈΠΎ класС, тачност Π±ΠΈ Π±ΠΈΠ»Π° 10%.

Π‘Π°Π΄Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠΎ којС класС ΠΌΡ€Π΅ΠΆΠ° Π±ΠΎΡ™Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΡ˜Π΅:

class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs, 1)
        c = (predicted == labels).squeeze()
        for i in range(4):
            label = labels[i]
            class_correct[label] += c[i].item()
            class_total[label] += 1


for i in range(10):
    print('Accuracy of %5s : %2d %%' % (
        classes[i], 100 * class_correct[i] / class_total[i]))

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

Π§ΠΈΠ½ΠΈ сС Π΄Π° јС ΠΌΡ€Π΅ΠΆΠ° Π½Π°Ρ˜Π±ΠΎΡ™Π° Ρƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜ΠΈ Π°ΡƒΡ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π° ΠΈ Π±Ρ€ΠΎΠ΄ΠΎΠ²Π°: тачност ΠΎΠ΄ 71%.

Π”Π°ΠΊΠ»Π΅, ΠΌΡ€Π΅ΠΆΠ° Ρ€Π°Π΄ΠΈ. Π‘Π°Π΄Π° ΠΏΠΎΠΊΡƒΡˆΠ°Ρ˜ΠΌΠΎ Π΄Π° прСнСсСмо њСгов Ρ€Π°Π΄ Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈ процСсор (Π“ΠŸΠ£) ΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎ ΡˆΡ‚Π° сС мСња.

ΠžΠ±ΡƒΠΊΠ° нСуронскС ΠΌΡ€Π΅ΠΆΠ΅ Π½Π° Π“ΠŸΠ£-Ρƒ

ΠŸΡ€Π²ΠΎ Ρ›Ρƒ ΡƒΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΎΠ±Ρ˜Π°ΡΠ½ΠΈΡ‚ΠΈ ΡˆΡ‚Π° јС ЦУДА. ЦУДА (Π¦ΠΎΠΌΠΏΡƒΡ‚Π΅ Π£Π½ΠΈΡ„ΠΈΠ΅Π΄ Π”Π΅Π²ΠΈΡ†Π΅ АрцхитСцтурС) јС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Π·Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ рачунарство ΠΊΠΎΡ˜Ρƒ јС Ρ€Π°Π·Π²ΠΈΠ»Π° ΠΠ’Π˜Π”Π˜Π Π·Π° ΠΎΠΏΡˆΡ‚Π΅ рачунарство Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΌ процСсорским Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠ° (Π“ΠŸΠ£). Π‘Π° ЦУДА-ΠΎΠΌ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈ ΠΌΠΎΠ³Ρƒ Π΄Ρ€Π°ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΄Π° ΡƒΠ±Ρ€Π·Π°Ρ˜Ρƒ рачунарскС Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ користСћи снагу Π“ΠŸΠ£-Π°. Ова ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° јС Π²Π΅Ρ› инсталирана Π½Π° нашСм сСрвСру који смо ΠΊΡƒΠΏΠΈΠ»ΠΈ.

Π₯ајдС Π΄Π° ΠΏΡ€Π²ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡˆΠ΅ΠΌΠΎ наш Π“ΠŸΠ£ ΠΊΠ°ΠΎ ΠΏΡ€Π²ΠΈ Π²ΠΈΠ΄Ρ™ΠΈΠ²ΠΈ Ρ†ΡƒΠ΄Π° ΡƒΡ€Π΅Ρ’Π°Ρ˜.

device = torch . device ( "cuda:0" if torch . cuda . is_available () else "cpu" )
# Assuming that we are on a CUDA machine, this should print a CUDA device:
print ( device )

Π’Π°ΡˆΠ° ΠΏΡ€Π²Π° нСуронска ΠΌΡ€Π΅ΠΆΠ° Π½Π° Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ (Π“ΠŸΠ£). Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΠΊΠ΅

БлањС ΠΌΡ€Π΅ΠΆΠ΅ Π½Π° Π“ΠŸΠ£:

net.to(device)

Π’Π°ΠΊΠΎΡ’Π΅ Ρ›Π΅ΠΌΠΎ ΠΌΠΎΡ€Π°Ρ‚ΠΈ Π΄Π° ΡˆΠ°Ρ™Π΅ΠΌΠΎ ΡƒΠ»Π°Π·Π΅ ΠΈ Ρ†ΠΈΡ™Π΅Π²Π΅ Π½Π° сваком ΠΊΠΎΡ€Π°ΠΊΡƒ Π“ΠŸΠ£-Ρƒ:

inputs, labels = data[0].to(device), data[1].to(device)

Π₯ајдС Π΄Π° ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΎΠ±ΡƒΡ‡ΠΈΠΌΠΎ ΠΌΡ€Π΅ΠΆΡƒ Π½Π° Π“ΠŸΠ£:

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
for epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
    inputs, labels = data[0].to(device), data[1].to(device)

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

Овог ΠΏΡƒΡ‚Π°, ΠΌΡ€Π΅ΠΆΠ½ΠΈ Ρ‚Ρ€Π΅Π½ΠΈΠ½Π³ јС Ρ‚Ρ€Π°Ρ˜Π°ΠΎ ΠΎΠΊΠΎ 3 ΠΌΠΈΠ½ΡƒΡ‚Π°. ΠŸΠΎΠ΄ΡΠ΅Ρ‚ΠΈΠΌΠΎ сС Π΄Π° јС иста Ρ„Π°Π·Π° Π½Π° ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΠΎΠ½Π°Π»Π½ΠΎΠΌ процСсору Ρ‚Ρ€Π°Ρ˜Π°Π»Π° 5 ΠΌΠΈΠ½ΡƒΡ‚Π°. Π Π°Π·Π»ΠΈΠΊΠ° нијС Π·Π½Π°Ρ‡Π°Ρ˜Π½Π°, Ρ‚ΠΎ сС дСшава Π·Π°Ρ‚ΠΎ ΡˆΡ‚ΠΎ наша ΠΌΡ€Π΅ΠΆΠ° нијС Ρ‚Π°ΠΊΠΎ Π²Π΅Π»ΠΈΠΊΠ°. Када користитС Π²Π΅Π»ΠΈΠΊΠ΅ Π½ΠΈΠ·ΠΎΠ²Π΅ Π·Π° ΠΎΠ±ΡƒΠΊΡƒ, Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΈΠ·ΠΌΠ΅Ρ’Ρƒ Π±Ρ€Π·ΠΈΠ½Π΅ Π“ΠŸΠ£-Π° ΠΈ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎΠ³ процСсора Ρ›Π΅ сС ΠΏΠΎΠ²Π΅Ρ›Π°Ρ‚ΠΈ.

Π§ΠΈΠ½ΠΈ сС Π΄Π° јС Ρ‚ΠΎ свС. Π¨Ρ‚Π° смо успСли Π΄Π° ΡƒΡ€Π°Π΄ΠΈΠΌΠΎ:

  • ПоглСдали смо ΡˆΡ‚Π° јС Π“ΠŸΠ£ ΠΈ ΠΈΠ·Π°Π±Ρ€Π°Π»ΠΈ сСрвСр Π½Π° ΠΊΠΎΠΌΠ΅ јС инсталиран;
  • ΠŸΠΎΡΡ‚Π°Π²ΠΈΠ»ΠΈ смо софтвСрско ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ΅ Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ нСуронскС ΠΌΡ€Π΅ΠΆΠ΅;
  • Направили смо нСуронску ΠΌΡ€Π΅ΠΆΡƒ Π·Π° ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡšΠ΅ слика ΠΈ ΠΎΠ±ΡƒΡ‡ΠΈΠ»ΠΈ јС;
  • Поновили смо ΠΌΡ€Π΅ΠΆΠ½Ρƒ ΠΎΠ±ΡƒΠΊΡƒ користСћи Π“ΠŸΠ£ ΠΈ Π΄ΠΎΠ±ΠΈΠ»ΠΈ смо ΠΏΠΎΠ²Π΅Ρ›Π°ΡšΠ΅ Π±Ρ€Π·ΠΈΠ½Π΅.

Π Π°Π΄ΠΎ Ρ›Ρƒ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΠΈ Π½Π° ΠΏΠΈΡ‚Π°ΡšΠ° Ρƒ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΌΠ°.

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€