YouTube2Text

YAPAY ZEKAYI MİKRODENETLEYİCİYE SIĞDIRDIK! | STM32CUBE.AI — Transcript

by Mühendislik Projeleri · 6,792 words · 1,396 segments · language en · Watch on YouTube

Full transcript

  1. 0:00Bugüne kadar STM32 ile birçok farklı
  2. 0:02uygulama yaptık. Ama bu videoda
  3. 0:03alışılagelmiş projelerin dışına çıkıp
  4. 0:05sınırları biraz zorlayacağız. Genellikle
  5. 0:07yüksek işlem kapasitesine sahip
  6. 0:09sunucularda ya da ekran kartlarında
  7. 0:11çalıştırılan yapay zeka modelini
  8. 0:13STM32'nin kısıtlı RAM ve flash belleğine
  9. 0:15sığdırıp çalıştıracağız. Bunu ST
  10. 0:17firmasının STM32Cube AI uygulaması ile
  11. 0:19yapacağız. Ayrıca bir gömülü sistem
  12. 0:21mühendisi olarak yapay zekayı tüketen
  13. 0:23tarafta değil, onunla uçtan uca ürün
  14. 0:25geliştiren tarafta olmak beni gerçekten
  15. 0:27mutlu ediyor. Uzun zamandır aklımdaydı
  16. 0:29projeyi yapmak. Nihayet hayata
  17. 0:30geçiriyoruz. Hazırsanız başlayalım.
  18. 0:34>> [müzik]
  19. 0:37>> Bu videoda STM32 ve dokunmatik TFT ekran
  20. 0:40kullanarak tam anlamıyla bir uç birim
  21. 0:42yapay zeka, yani Edge AI uygulaması
  22. 0:45geliştireceğiz.
  23. 0:45>> [müzik]
  24. 0:45>> CNN tabanlı bir görüntü işleme modelini
  25. 0:48sadece 128 KB RAM ve 512 KB flash
  26. 0:52belleğe sahip STM32 üzerinde tamamen
  27. 0:54lokal olarak çalıştıracağız. Çalışmamız
  28. 0:56bir önceki projemizin devam niteliğinde.
  29. 0:58Hatırlarsanız önceki videoda STM32 ile
  30. 1:01TFT ekran kullanımını detaylıca ele
  31. 1:03almıştık. Şimdi ise bu sistemin üzerine
  32. 1:05yapay zeka katmanını ekleyeceğiz.
  33. 1:06İşlenen verileri harici bir sunucuya ya
  34. 1:09da güçlü bir bilgisayara
  35. 1:10göndermeyeceğiz. Tüm tahminleme süreci
  36. 1:12doğrudan STM32'nin kendi [müzik] kısıtlı
  37. 1:14kaynaklarıyla mikro denetleyicinin
  38. 1:16içinde gerçekleşecek. Uygulamamızın
  39. 1:18konsepti ise şöyle: Ekrana elimizle bir
  40. 1:20sayı çizeceğiz ve STM32'ye entegre
  41. 1:22ettiğimiz yapay zekanın bu sayıyı doğru
  42. 1:24tahmin etmesini isteyeceğiz. Tabii bu
  43. 1:26çalışma için öncelikle eğitilmiş bir
  44. 1:28yapay zeka modeline ihtiyacımız var.
  45. 1:30İşin bu kısmını alanında uzman yapay
  46. 1:32zeka mühendisi Ali anlatacak. Sözü
  47. 1:34Ali'ye bırakıyorum.
  48. 1:35>> Selamlar, ben Ali. Sektörde yapay zeka
  49. 1:37mühendisi olarak çalışıyorum. Bugün
  50. 1:38sizlere projemizin yapmış olduğum yapay
  51. 1:40zeka modülünden bahsedeceğim. Hemen
  52. 1:42başlayalım. Öncelikle kısaca yapay zeka
  53. 1:44nedir, nasıl çalışır anlatayım. Yapay
  54. 1:46zeka dediğimiz şey bilgisayarın insan
  55. 1:48gibi bilinç kazanması değil. Daha çok
  56. 1:49veriden anlamlı örüntüler çıkararak
  57. 1:51karar verebilmesidir. Yani bir sisteme
  58. 1:52yeterince örnek gösteriyoruz. Sistem bu
  59. 1:54örnekler arasındaki benzerlikleri
  60. 1:56öğreniyor ve daha önce görmediği yeni
  61. 1:57bir veri geldiğinde tahmin yapabiliyor.
  62. 1:59Klasik programlamada biz bilgisayarlara
  63. 2:01kuralları tek tek yazarız. Örneğin if
  64. 2:03else yapıları ile eğer şu olursa bunu
  65. 2:05yap deriz. Ama yapay zekada durum biraz
  66. 2:07farklı. Biz kuralları doğrudan yazmak
  67. 2:08yerine modele örnekleri veriyoruz. Model
  68. 2:10bu örneklerden kendi içerisinde bir
  69. 2:12ilişki kuruyor. Gördüğü örnekler
  70. 2:14sayesinde seçilen algoritmaya
  71. 2:15güncelleyerek en optimum haline
  72. 2:17ulaştırıyor. Örneğin binlerce el yazısı
  73. 2:18ile yazılmış rakamlar gösterdiğimizde
  74. 2:20model zamanla 3 rakamı genelde böyle
  75. 2:22kıvrılır, 1 rakamı genelde dik bir
  76. 2:24çizgidir gibi özellikleri öğrenmeye
  77. 2:25başlıyor. Yani [müzik] ona kural
  78. 2:27tanımlamıyoruz. Bu iş böyle yapılır, bu
  79. 2:29işe göre kuralları kendin yaz diyoruz.
  80. 2:30Başka bir [müzik] deyişle de balık
  81. 2:32vermiyor, balık tutmayı öğretiyoruz.
  82. 2:33Yapay zekanın geçmişi aslında oldukça
  83. 2:35eski. 1950'lerde Alan Turing'in
  84. 2:37makineler düşünebilir mi sorusuyla
  85. 2:39başlayan tartışmalar 1956'da Dartmouth
  86. 2:41konferansı ile yapay zekanın ayrı bir
  87. 2:43alan olarak ortaya çıkmasına kadar
  88. 2:45gidiyor. İlk dönemlerde sistem daha çok
  89. 2:46insanın yazdığı kurallarla çalışıyordu.
  90. 2:48Fakat zamanla kontrol etmemiz gereken
  91. 2:50durumların miktarı arttı. Milyonlarca
  92. 2:52durum içerisindeki milyarlarca vakanın
  93. 2:54her biri için if else yazamayız değil
  94. 2:55mi? Bu gelişmeleri takiben de veri
  95. 2:57miktarı arttı. Bilgisayarlar güçlendi.
  96. 2:59Özellikle GPU'lar ve büyük veri setleri
  97. 3:01sayesinde derin öğrenme dediğimiz
  98. 3:02yaklaşım çok daha başarılı hale geldi.
  99. 3:04Kısa tarihçeden sonra yapay zekanın
  100. 3:06nasıl geliştiğine de çok kısaca bakalım.
  101. 3:08İlk dönemlerde yapay zeka daha çok kural
  102. 3:09tabanlı sistemlerden oluşuyordu. Yani
  103. 3:11insan uzmanlar kuralları yazıyordu,
  104. 3:13sistem de bu kurallara göre kararları
  105. 3:15veriyordu. Mesela eğer sıcaklık şu
  106. 3:17derecenin üstündeyse alarm ver gibi.
  107. 3:18Daha sonra makine öğrenmesi yaklaşımı
  108. 3:20öne çıktı. Burada artık kuralları tek
  109. 3:21tek yazmak yerine modele veri setini
  110. 3:23veriyoruz ve model bu veriler arasındaki
  111. 3:25ilişkiyi öğreniyordu. En basit
  112. 3:27örneklerden biri klasik bir makine
  113. 3:28öğrenmesi algoritması olan lineer
  114. 3:30regresyon. Lineer regresyonda model
  115. 3:32veriler arasındaki ilişkiyi temsil eden
  116. 3:33en uygun doğruyu bulmaya çalışır.
  117. 3:35Grafikte bunu şöyle düşünebiliriz.
  118. 3:36Elimizde birçok nokta var ve model bu
  119. 3:38noktaların genel gidişatını en iyi
  120. 3:40temsil eden çizgiyi çizmeye çalışıyor.
  121. 3:42Yani mevcut durumlara göre kendi
  122. 3:43kurallarını kendi inşa ediyor. Amaç
  123. 3:45noktalarla doğru arasındaki hatanın
  124. 3:46mümkün olduğunca küçük olmasıdır. Mesela
  125. 3:48evin metrekaresi arttıkça fiyat nasıl
  126. 3:50değişiyor gibi sayısal tahminler bu
  127. 3:52algoritmayla yapılabilir. Classification
  128. 3:54yani sınıflandırma problemlerinde ise
  129. 3:55logistic regression, decision tree,
  130. 3:58random forest, SVM gibi yöntemler
  131. 3:59kullanıldı. Bunlar görüntü, metin veya
  132. 4:02tablo verisinden belirli özellikleri
  133. 4:03çıkarıp karar vermeye çalışıyordu. Bu
  134. 4:05özellik çıkarma sürecine feature
  135. 4:07extraction denir. Ama burada önemli bir
  136. 4:09problem vardı. Özellikleri çoğu zaman
  137. 4:10insanın kendisi belirlemesi gerekiyordu.
  138. 4:12Özellikleri insanın belirlemesinden
  139. 4:14kastım şu: Örneğin akciğer grafisinde
  140. 4:16anormallik tespit eden bir model yapmak
  141. 4:18istiyorsunuz. Modeli eğitmek için
  142. 4:19binlerce, [müzik] milyonlarca akciğer
  143. 4:21grafisi toplamanız gerekiyor. Eğer
  144. 4:22supervised learning yani etiketli
  145. 4:24öğrenme yapıyorsanız bu görüntülerin
  146. 4:26normal mi, anormal mi olduğunu
  147. 4:27doktorlara etiketletmeniz gerekiyor.
  148. 4:29Bunun yanında klasik makine öğrenmesi
  149. 4:31tarafında görüntüdeki lekenin boyutu,
  150. 4:33parlaklık yoğunluğu, kenar yapısı veya
  151. 4:35doku değişimi gibi özellikleri de çoğu
  152. 4:36zaman bizim belirleyip modele vermemiz
  153. 4:38gerekiyordu. İşte bu yüzden manuel
  154. 4:40özellik çıkarma süreci klasik makine
  155. 4:42öğrenmesi yöntemlerinin en büyük
  156. 4:43zorluklarından biriydi. Bir diğer
  157. 4:45problemi ise makine öğrenmesi
  158. 4:46algoritmalarına ne kadar veri verirseniz
  159. 4:48o kadar iyi olmuyordu modeller. Bir yere
  160. 4:50kadar iyi oluyorlardı fakat bir yerden
  161. 4:52sonra iyileşmeleri duruyordu. Çünkü
  162. 4:53kapasiteleri sınırlıydı. Bu sorunlara
  163. 4:55çözüm olarak deep learning konsepti daha
  164. 4:57güçlü hale geldi. Derin öğrenmede model
  165. 4:59sadece son kararı vermiyor. Aynı zamanda
  166. 5:01verinin içindeki önemli özellikleri de
  167. 5:02katmanları sayesinde kendi öğreniyor.
  168. 5:04Hani az önce akciğer grafisindeki
  169. 5:06lekenin boyutu, kenar yapısı, parlaklık
  170. 5:08yoğunluğu gibi özellikleri bizim
  171. 5:09çıkarmamız gerekebiliyordu demiştim.
  172. 5:11Deep learning tarafında bu özellikleri
  173. 5:13tek tek bizim tanımlamamız gerekmez.
  174. 5:14Model eğitim sırasında görüntülere
  175. 5:16bakarak hangi çizgilerin, dokuların,
  176. 5:18yoğunlukların veya şekillerin karar
  177. 5:20vermede önemli olduğunu kendi
  178. 5:21ağırlıkları üzerinden öğrenir. Tabii
  179. 5:22supervised learning yapıyorsak yine
  180. 5:24doğru etiketlenmiş verilere ihtiyaç
  181. 5:26duyarız. Yani modelin bu görüntü normal
  182. 5:28mi yoksa anormal mi gibi örnekleri
  183. 5:30görmesi gerekir. Ama görüntünün içindeki
  184. 5:31anlamlı özellikleri çıkarmanın büyük
  185. 5:33kısmını artık model kendisi yapıyor. Bir
  186. 5:35diğer kavramımız ise artificial neural
  187. 5:37network'ler yani yapay sinir ağları. Bu
  188. 5:39yapılar insan beyninden esinlenen
  189. 5:41katmanlı modellerdir. Her katmanda
  190. 5:42veriler bazı ağırlıklardan geçer,
  191. 5:44dönüştürülür ve bir sonraki katmana
  192. 5:46aktarılır. Model eğitim sırasında
  193. 5:47hatasına bakarak bu ağırlıkları
  194. 5:49günceller. Böylece zamanla daha doğru
  195. 5:51tahmin yapmayı öğrenir. Görüntü
  196. 5:52problemlerinde ise özel olarak CNN
  197. 5:54mimarisi çok başarılı oldu. Çünkü
  198. 5:56görüntülerde piksel komşulukları
  199. 5:57önemlidir. CNN görüntünün üzerinde
  200. 5:59[müzik] küçük filtreler gezdirerek
  201. 6:01kenar, çizgi, kıvrım ve şekil gibi
  202. 6:02özellikleri yakalar. Bizim projemizde de
  203. 6:04el yazısı ile yazılmış rakamları tanımak
  204. 6:06için CNN kullanıyoruz. Daha sonra
  205. 6:08görüntü, ses ve diğer konularda değil de
  206. 6:10asıl devrim insan dili tarafında
  207. 6:11gerçekleşti. [müzik]
  208. 6:12Özellikle dil ve sıralı veri
  209. 6:14problemlerinde RNN, LSTM gibi yapılar
  210. 6:16kullanıldı. Fakat bunlardaki uzun
  211. 6:17dönemli hafızayı tutamama problemleri ve
  212. 6:19diğer problemler [müzik] sebebiyle
  213. 6:21günümüzdeki Transformer mimarisine
  214. 6:23geçildi. ChatGPT gibi büyük dil
  215. 6:24modellerinin temelinde Transformer
  216. 6:26mimarisi vardır. GPT, yani Generative
  217. 6:29Pre-trained Transformer. Transformer
  218. 6:31verideki parçaların birbirleriyle
  219. 6:32ilişkisini Attention [müzik]
  220. 6:33mekanizmasıyla öğrenir. Bir de
  221. 6:35Generative AI tarafı var, yani üretken
  222. 6:37yapay zeka. Bu modeller sadece
  223. 6:38sınıflandırma [müzik] yapmaz, yeni
  224. 6:40içerik üretebilir. Metin, görsel, ses
  225. 6:42veya video oluşturabilir. Görsel üretim
  226. 6:44tarafında Diffusion modelleri çok
  227. 6:45yaygınlaştı. Diffusion modelleri basitçe
  228. 6:48gürültülü bir görüntüden adım adım
  229. 6:49anlamlı bir görüntü üretmeyi öğrenir.
  230. 6:51Ama bizim bu projemizdeki problemimiz
  231. 6:53üretim değil, Classification, yani
  232. 6:54sınıflandırma problemi. Yani modelden
  233. 6:56yeni bir görüntü üretmesini istemiyoruz.
  234. 6:58[müzik] Ekrana yazılan rakamın hangi
  235. 7:00sınıfa ait olduğunu bulmasını istiyoruz.
  236. 7:02Bu yüzden burada en uygun mimarilerden
  237. 7:03birisi CNN oluyor. Şimdi CNN mimarisini
  238. 7:06ve içerisindeki katmanların neler
  239. 7:07yaptığını öğrenelim. Mimari resminde
  240. 7:09görebileceğiniz üzere en önce resmimiz
  241. 7:11mimarimize, modelimize uygun formatta
  242. 7:12gelir. Örneğin MNIST veri setiyle
  243. 7:14eğiteceğimiz modelimiz 28 x 28 x 1 girdi
  244. 7:17bekler. Dolayısıyla modelimize uygun 28
  245. 7:20x 28 formatında input resim gelir.
  246. 7:22Burada gördüğünüz mimari aslında iki
  247. 7:24kısma ayrılıyor. Convolution ve Pooling
  248. 7:26layer'larında Feature Extraction, yani
  249. 7:28özellik çıkarma işlemi yapılır. Fully
  250. 7:29Connected diye belirtilen kısım
  251. 7:31içerisinde ise Classification, yani
  252. 7:33sınıflandırma işlemlerinin yapıldığı
  253. 7:35Artificial Neural Network katmanları
  254. 7:36vardır. Convolution katmanının amacı
  255. 7:39resimde hangi desenin nerede olduğunu
  256. 7:40bulmaktır. Pooling katmanlarının amacı
  257. 7:42ise bulunan bu sonucu küçültüp
  258. 7:44özetlemektir. Yani özetle Convolution
  259. 7:46layer'ları resimde ne var sorusunu
  260. 7:48cevaplar. Pooling katmanları ise önemli
  261. 7:50olanı tut, gerisini at der. Şimdi tek
  262. 7:52tek katmanların içerisine göz atalım.
  263. 7:54İlk Feature Extraction yapan katmanımız
  264. 7:56hangi desenin nerede olduğunu tespit
  265. 7:57etmeye yarayan Convolution
  266. 7:58layer'ımızdır. Bu layer [müzik] özellik
  267. 8:00çıkarma için Convolution Kernel, diğer
  268. 8:02adıyla filtre kullanılır. Input olarak
  269. 8:04gelen resmimizin bu piksellerden
  270. 8:06oluştuğunu düşünelim. Bu piksellerin
  271. 8:08oluşturduğu yapı nihai olarak resmimizin
  272. 8:10neresinde, hangi renkte, ne deseni var
  273. 8:12bilgisini taşır. Bu aşamada bu
  274. 8:13özellikleri öğrenmek için daha önce de
  275. 8:15belirttiğim convolution kernelleri, yani
  276. 8:17filtrelerimiz devreye girer. Her bir
  277. 8:19filtrenin, yani kernelin kendine ait bir
  278. 8:21görevi vardır. Örneğin kernel 1 tüm
  279. 8:23resmi gezer ve yatay çizgi nerede
  280. 8:25haritasını çıkarır. Kernel 2 tüm resmi
  281. 8:27gezer ve dikey çizgi nerede haritasını
  282. 8:29çıkarır. Son kernele kadar bu böyle
  283. 8:31devam eder. Buradan anlayabileceğiniz
  284. 8:33üzere bu filtrenin sayısı bir adet
  285. 8:34değildir. Elimizdeki mevcut veri setine
  286. 8:36göre sayılar belirlenir. Veri setinin
  287. 8:38barındırdığı resimlerin karmaşıklıkları
  288. 8:40ve detayları arttıkça filtrelerimizin
  289. 8:42sayısı da artmalıdır. Üzerinde
  290. 8:43çalışabileceğimiz el yazısı veri seti
  291. 8:45çok karmaşık veri seti olmadığı için
  292. 8:47genelde 32, 64 gibi filtre sayısı
  293. 8:49belirlenebilir. Örneğin orta
  294. 8:51karmaşıklıkta resimler için CIFAR-10
  295. 8:53veri setinde 64, 128 gibi değerler
  296. 8:55belirlenebilirken tamamen karmaşık
  297. 8:57resimlerden oluşan ImageNet seviyesinde
  298. 8:59128, 512 gibi filtre sayısı
  299. 9:01belirlenebilir. Veri setindeki
  300. 9:03resimlerden öğrenilmesi gereken detay
  301. 9:05sayısı arttıkça bu detayları tespit
  302. 9:07etmeye yarayan filtrelerin sayısı da
  303. 9:08doğal olarak artmalıdır. Burada
  304. 9:10belirlediğiniz sayı eğittiğiniz modelin
  305. 9:12kalitesinden de anlaşılacaktır. Örneğin
  306. 9:14eğittiğiniz model eğer yeni örneklerde
  307. 9:16desenleri yakalayamıyorsa bu dikkat
  308. 9:18etmeniz gereken parametrelerden birinin
  309. 9:20kernel sayısının düşüklüğü olduğunu
  310. 9:21işaret olabilir. Peki kernel resmin
  311. 9:23üzerinde ne yapıyor? Kernel resmin sol
  312. 9:25üst köşesine yerleştirilir. Kernelin
  313. 9:27içerisindeki rastgele oluşturulmuş
  314. 9:29piksellerle eleman eleman çarpılır ve
  315. 9:31sonuçlar toplanır. Bu toplam yeni
  316. 9:33matrisin bir pikseli olur. Ardından
  317. 9:35kernel bir adım kayar ve işlem resmin
  318. 9:37tamamı gezilene kadar tekrarlanır.
  319. 9:39Ortaya çıkan yeni matrise feature map
  320. 9:41diyoruz. Feature mapteki yüksek değerler
  321. 9:43bu kernelin aradığı desenin o bölgede
  322. 9:45bulunduğunu gösterir. Kernel boyutuna
  323. 9:47gelirsek genelde 3 x 3 kullanılır.
  324. 9:49Burada stride diye bir kavramdan
  325. 9:50bahsetmek istiyorum. Stride kernelin her
  326. 9:53adımda orijinal resim üzerinde kaç
  327. 9:54piksel kayacağını belirler. Stride
  328. 9:56değeri 1 ise kernel her piksele uğrar.
  329. 9:59Stride 2'de birer atlayarak ilerler ve
  330. 10:01feature map yarı boyutuna iner. Peki
  331. 10:02hangisini seçmeliyiz? Convolution
  332. 10:04katmanlarında varsayılan tercih stride
  333. 10:061'dir. Çünkü amacımız detay yakalamak.
  334. 10:08Piksel atlamak ise detay kaybetmek
  335. 10:10demektir. Stride 2'yi daha çok büyük
  336. 10:12resimlerle çalışırken hesaplama yükünü
  337. 10:14azaltmak için ilk katmanlarda
  338. 10:15görürsünüz. Günümüz mimarilerinin bir
  339. 10:17kısmında pooling katmanı devre dışı
  340. 10:19bırakılıp stride 2'li convolution
  341. 10:21kullanılıyor. Yani küçültme için ayrı
  342. 10:22bir katman yerine convolution'ın kendisi
  343. 10:24yapar. Ama MNIST gibi zaten küçük olan
  344. 10:2628 x 28'lik [müzik] resimlerde stride 2
  345. 10:29kullanmak bence gereksiz bir risk. O
  346. 10:31kadar az pikselde atladığınız her
  347. 10:32pikselin önemi olabilir. Burada stride 1
  348. 10:34kullanıp küçültmeyi pooling'e bırakmak
  349. 10:36[müzik] en mantıklısı olacaktır. Gelelim
  350. 10:38padding'e. 5 x 5'lik bir matrise 3 x 3
  351. 10:41kernel uyguladığınızda sonuç 3 x 3
  352. 10:43çıkıyor. Yani her convolution'da matris
  353. 10:45küçülüyor. Bunun yanında kenar
  354. 10:46pikselleri daha az hesaba katılıyor.
  355. 10:48Convolution kernel'i orijinal resim
  356. 10:50üzerinde işlem yaparken köşedeki
  357. 10:52pikseller yalnızca bir kez hesaplamaya
  358. 10:54girerken ortadaki pikseller dört kez
  359. 10:56giriyor. Padding matrisin çevresine
  360. 10:58sıfırlardan bir çerçeve ekleyerek
  361. 11:00köşedeki piksellerin daha az
  362. 11:01hesaplanmaya girmesini engeller. Onları
  363. 11:03da orta pikseller haline getirmiş olur.
  364. 11:05Padding isteğe bağlı bir özelliktir. Bu
  365. 11:07da elinizdeki setinin türüne göre
  366. 11:09değişir. Eğer köşelerinde fazla
  367. 11:11özellikler barındıran resimler içeren
  368. 11:13bir veri setiyle çalışıyorsanız
  369. 11:14padding'i aktif hale getirmeniz daha iyi
  370. 11:16olacaktır. Kernellerin içindeki
  371. 11:18değerleri ise biz belirlemiyoruz.
  372. 11:19Eğitimin başında rastgele atanırlar ve
  373. 11:21model her hatasından sonra bu değerleri
  374. 11:23günceller. Yani CNN'deki weight'ler,
  375. 11:25yani modelin neye ne kadar önem
  376. 11:27vereceğini belirleyen model ağırlıkları
  377. 11:28tam olarak kernellerin içindeki bu
  378. 11:30değerlerdir. Mimarideki ikinci [müzik]
  379. 11:31convolution layer ise doğrudan resme
  380. 11:33değil, ilk katmanın output olarak
  381. 11:35verdiği feature map'lere bakar. İlk
  382. 11:37katman çizgi, kenar gibi basit desenleri
  383. 11:39bulurken ikinci katman bunları
  384. 11:41birleştirerek köşe ve kıvrım gibi daha
  385. 11:43karmaşık yapıları yakalar. Derinlere
  386. 11:45indikçe model resmi daha anlamlı
  387. 11:47parçalar halinde görmeye başlar.
  388. 11:48Convolution layer'lardan çıktığımızda
  389. 11:50elimizde çok sayıda feature map vardır.
  390. 11:52Ancak bunlar hala büyük ve gereksiz
  391. 11:54detaylar barındırıyor. Bir sonraki
  392. 11:55katmanımız olan pooling layer, diğer
  393. 11:57adıyla downsampling layer, bu bilgiyi
  394. 11:59küçültüp özetleme görevini üstleniyor.
  395. 12:01Pooling layer'ın iki amacı vardır.
  396. 12:03Birincisi, milyonlarca boyutlardan
  397. 12:05oluşan milyarlarca veri barındıran bir
  398. 12:07veri setindeki boyutları yarısına kadar
  399. 12:09indirebilir. Bu sayede model hem daha
  400. 12:11hızlı eğitilir hem de daha az hafıza
  401. 12:13kullanır. İkincisi overfitting riskini
  402. 12:15azaltmak. Overfitting ne diye soracak
  403. 12:16olursanız, model eğitiminde sık
  404. 12:18karşılaşılan bilen bir durumdur. Modelin
  405. 12:20eğitildiği veri setini aşırı öğrenmesi,
  406. 12:22yani ezberlemesi, [müzik]
  407. 12:23ancak karşısına çıkan yeni örneklerde
  408. 12:25doğruluğunun çok düşük olması durumudur.
  409. 12:27Yani bu aslında günümüzdeki eğitim
  410. 12:29sistemini özetleyen bir durumdur.
  411. 12:30Okullarda sınavları geçmek için sınav
  412. 12:32odaklı çalışırız. [müzik] Fakat hem
  413. 12:34konuyu öğrenmeyiz, hem de gerçek hayat
  414. 12:35için bir çıkarım yapamayız. Model de
  415. 12:37buradaki hataya düşer. Eğitim veri
  416. 12:39setinde başarısı çok iyidir. Fakat
  417. 12:40karşısına çıkan yeni örneklerde
  418. 12:42çuvallar. Çünkü ezberlemiştir,
  419. 12:44öğrenmemiştir. Pooling de burada bu
  420. 12:46durumun oluşmamasına yardımcı oluyor
  421. 12:47aslında. Feature map'ler küçültülerek
  422. 12:49sonraki katman olan fully connected
  423. 12:51layer'a daha küçük bir veri grubu gider.
  424. 12:53Bu da o katmandaki parametre sayısını
  425. 12:55ciddi şekilde azaltır. Parametre
  426. 12:57azaldıkça modelin eğitim verisini
  427. 12:58ezberleme kapasitesi de azalır. Yani
  428. 13:00model resimleri ezberlemek yerine genel
  429. 13:02desenleri öğrenmeye yönelir. Nasıl
  430. 13:04yapılacağına gelecek olursak,
  431. 13:06convolution'ın çıktısı olan feature
  432. 13:07map'in üzerinde küçük bir pencere
  433. 13:09gezdirilir. Ve her pencereden tek bir
  434. 13:11değer alınır. Bu arada buranın CNN'in
  435. 13:13neyine kadar ağırlık vereceğini belirten
  436. 13:15weight'lere doğrudan bir katkısı yoktur.
  437. 13:17Burada herhangi bir şey öğrenilmez.
  438. 13:18Buradaki işlemler sabittir. Buradaki
  439. 13:20penceremizin standart boyutu 2 x 2'dir
  440. 13:23ve stride 2 olarak kullanılır. Pooling
  441. 13:25penceresinin boyutu ile stride sayısının
  442. 13:27birbirine eşit olduğu her zaman her
  443. 13:28piksel bir kez işleme girer. Birden
  444. 13:30fazla adette pooling türü vardır. Burada
  445. 13:32dört farklı pooling türünden
  446. 13:33bahsedebilirim. Max pooling, average
  447. 13:35pooling, min pooling ve modern
  448. 13:37mimarilerde kullanılan pooling'i
  449. 13:39kaldıralım. Convolution'ın stride 2
  450. 13:41olarak kullanım yaklaşımı. Daha farklı
  451. 13:43ileri seviye pooling yöntemleri de var.
  452. 13:45Fakat biz konuyu uzatmamak adına burada
  453. 13:46bunlardan bahsetmeyeceğiz. Max pooling,
  454. 13:49pooling çerçevesinin girdiği matristeki
  455. 13:51en yüksek değeri alır. CNN katmanlarında
  456. 13:53varsayılan tercih budur. Feature map'te
  457. 13:55yüksek değer desen burada var anlamına
  458. 13:57geldiği için en güçlü sinyali tutmak
  459. 13:59mantıklı. Average pooling, pooling
  460. 14:01çerçevesinin girdiği matristeki
  461. 14:02değerlerin ortalamasını alır. Bölgedeki
  462. 14:04tüm değerlerin daha yumuşak bir özet
  463. 14:06çıkarır. Güçlü bir sinyal zayıf
  464. 14:08değerlerle ortalandığında sönükleşir. Bu
  465. 14:10yüzden ara katmanlarda max'e göre daha
  466. 14:12az kullanılır. Min pooling, pooling
  467. 14:14çerçevesinin girdiği matristeki en küçük
  468. 14:16değeri alır. Convolution katmanlarından
  469. 14:18çıkan feature map'lerde çok sayıda sıfır
  470. 14:20değeri olabileceğinden, bu pooling
  471. 14:22yöntemi de onları seçebileceğinden
  472. 14:23dolayı aslında teorik de olup pratikte
  473. 14:25neredeyse hiç kullanılmayan bir pooling
  474. 14:27yöntemidir. Convolution ve pooling
  475. 14:29layer'larından sonra artificial neural
  476. 14:30network, yani yapay sinir ağları diye
  477. 14:32adlandırdığımız fully connected
  478. 14:34layer'lardan hemen önce flattening
  479. 14:35işlemi yapılır. Flatten, çok boyutlu
  480. 14:37veriyi tek boyutlu bir vektöre çevirir.
  481. 14:392 x 2'lik matris dört elemanlı bir
  482. 14:41listeye dönüşür. Ya da 7 x 7 x 64'lük
  483. 14:45veri 7 x 7 x 64, yani 3136 elemanlı tek
  484. 14:49bir vektör olur. Bunları yaparken hiçbir
  485. 14:51hesaplama yapmaz. Parametresi de yoktur.
  486. 14:53Değerler aynen korunur. Sadece
  487. 14:55dizilişleri değişir. Matris satır satır
  488. 14:57okunur ve arka arkaya dizilir. Kısaca
  489. 14:59bilgi kaybolmaz, sadece şekil
  490. 15:00değiştirir. Özetle flatten işlemi
  491. 15:02şöyledir. Örneğin 2, 3, 4, 1 şeklinde
  492. 15:05bir matrisimiz olduğunu varsayalım. Bu
  493. 15:06matrisin flatten işleminden sonra şöyle
  494. 15:08olacağını düşünebiliriz. Veriler sıralı
  495. 15:10ve ardışık olarak art arda konulduğunda
  496. 15:122, 3, 4 ve 1 rakamları bu şekilde
  497. 15:15dizilir. Yani veri düzleştirilmiş olur.
  498. 15:17Bu gereklidir çünkü fully connected
  499. 15:18katmanlar yalnızca tek boyutlu girdi
  500. 15:20kabul eder. Her nöron gelen her değere
  501. 15:22ayrı bir weight ile bağlanır. Matris
  502. 15:24satır, sütun ve kanal gibi kavramları
  503. 15:26bilmez. Önüne bir sayı listesi gelmesini
  504. 15:28bekler. Flattening'den gelen
  505. 15:29düzleştirilmiş veri klasik yapay sinir
  506. 15:31ağlarının bulunduğu fully connected
  507. 15:33layer'larına gider. Buraya fully
  508. 15:34connected denmesinin sebebi tüm
  509. 15:36nöronlarının kendinden önceki ve sonraki
  510. 15:38katmanlarda bulunan tüm nöronlara bağlı
  511. 15:40olmasıdır. Ariyeten partialy connected,
  512. 15:42localy connected ve three connected gibi
  513. 15:45diğer alternatifleri de vardır. Fakat
  514. 15:47CNN'de fully connected layer'lar
  515. 15:48kullanılır. Burada her zaman bir tane
  516. 15:50input layer, bir tane output layer ve
  517. 15:52sayısını bizim ihtiyaca göre
  518. 15:53belirlediğimiz hidden layer'larımız,
  519. 15:55yani gizli katmanlarımız vardır. Bir
  520. 15:57nöron tam olarak ne yapar? Her nöron
  521. 15:59aynı üç işlemi yapar. Gelen her değeri
  522. 16:01kendi weight'leriyle çarpar. Sonuçları
  523. 16:03ve bir bias ekler. Toplamı bir
  524. 16:05aktivasyon fonksiyonundan geçirir. Örnek
  525. 16:07olarak üç girdili bir nöron düşünelim.
  526. 16:09Bir nöron için gelen input'un 2, 3 ve 1
  527. 16:12olduğunu düşünelim. Nöronun
  528. 16:14weight'lerine ise 0.5, -1 ve 2 diyelim.
  529. 16:17Bias'a da 1 diyelim. Hesaplama şöyle
  530. 16:18olmuş oluyor. 2 x 0.5 + 3 x -1 + 1 x 2
  531. 16:23ve artı bayas olan 1'i eklediğimizde 1
  532. 16:26sonucunu elde ederiz. Eşitliğin
  533. 16:27karşısındaki bu 1, bu işlemi yapan
  534. 16:29nöronun çıktısıdır. Yani aslında
  535. 16:31convolution'daki işlemin aynısını burada
  536. 16:33yapmış oluyoruz. Input layer'ların ne
  537. 16:34yaptığını biliyoruz. Yaptıkları tek şey
  538. 16:36önceki katmanlardan gelen flatten
  539. 16:38edilmiş veriyi tutmak. Peki hidden
  540. 16:39layer'la output layer'larının
  541. 16:41birbirlerinden farkı ne? İkisi de az
  542. 16:42önceki hesabı yapar. Farkları
  543. 16:44kullandıkları aktivasyon fonksiyonu ve
  544. 16:46rolleri dir. Hidden layer'lar Relu
  545. 16:47aktivasyon fonksiyonunu kullanır. Asıl
  546. 16:49classification yapmanın öğrenildiği yer
  547. 16:51burasıdır. Flatten'den gelen özellikleri
  548. 16:53birleştirip ara sonuçlar üretir. Örneğin
  549. 16:55bir nöron üstte yatay çizgi var ve altta
  550. 16:57kıvrım var kombinasyonuna duyarlı hale
  551. 17:00gelir. Nöronların tek bir anlamı yoktur.
  552. 17:02Neye ne kadar duyarlı olacaklarına
  553. 17:03eğitim karar verir. Örneğin bu nöronun
  554. 17:05mu 3'ün köşesindeki kıvrımlarından
  555. 17:07sorumlu olacağı yoksa bu nöronun mu
  556. 17:09olacağına eğitim esnasında karar
  557. 17:11verilir. Burada rastgelelik söz
  558. 17:12konusudur. Output layer ise softmax
  559. 17:15aktivasyon fonksiyonunu kullanır. Basit
  560. 17:17deyişle buranın 3'ün mü aradığımız rakam
  561. 17:19olduğunu yoksa 5'in mi aradığımız rakam
  562. 17:21olduğunu söyleyen katmandır. 0 ile 1
  563. 17:23arasında olasılıksal değerle yön
  564. 17:25gösterir. Örneğin 1 için 0.11, 5 için
  565. 17:280.87 dediyse aralarındaki en yüksek
  566. 17:31değer olan 5 öne çıkar ve sonuç olarak
  567. 17:33bu rakam %87 olasılıkla 5'tir denmiş
  568. 17:35olur. Bizim örneğimizde buradaki nöron
  569. 17:37sayıları şöyledir. Bildiğiniz üzere
  570. 17:39bizim resmimiz 28 x 28 x 1 boyutunda
  571. 17:42geldi. Convolution katmanında 32 adet
  572. 17:44convolution filter'ı kullandığımızı
  573. 17:46varsayarsak bu boyut 28 x 28 x 32 oldu.
  574. 17:50Ardından pooling layer'ında 2 x 2
  575. 17:52pencere kullanarak bu boyutu 14 x
  576. 17:54[müzik] 14 x 32 seviyesine getirdik.
  577. 17:56Sonra ikinci convolution katmanında 64
  578. 17:58tane kernel kullandık ve boyut [müzik]
  579. 18:0014 x 14 x 60 oldu. Ardından tekrar bir
  580. 18:03max pooling yaptık ve boyut 7 x 7 x 64
  581. 18:06oldu. En sonunda flatten ile bunları
  582. 18:08düzleştirdik ve 7 x 7 x 64'ten sayı 3136
  583. 18:12oldu. Dolayısıyla input layer'ımızda
  584. 18:143136 nöron vardır diyebiliriz. Hidden
  585. 18:16layer'larımızda da 128 adet nöron
  586. 18:18kullandığımızı varsayalım. Genelde MNIST
  587. 18:20için kullanılan alışılagelmiş nöron
  588. 18:22sayısı budur. Output katmanında 0'dan
  589. 18:249'a 10 adet sınıflandırma seçeneğimiz
  590. 18:26olduğundan dolayı 10 nöron kullandık.
  591. 18:28Bir de mimaride gözünüze çarpmış
  592. 18:29olabilecek olan dropout layer'ımız var.
  593. 18:31Dropout layer'ın amacı overfitting'i
  594. 18:33engellemektir. Rastgele bazı nöronları
  595. 18:35kapatarak aşırı öğrenmeyi, modelin
  596. 18:37eğitim veri setini ezberlemesini
  597. 18:38engeller. Dropout olmadan bazı nöronlar
  598. 18:41birbirlerine aşırı bağımlı hale gelir ve
  599. 18:43belirli örnekleri ezberleyen dar
  600. 18:44kombinasyonlar oluşur. Hangi nöronun
  601. 18:46kapanacağı belli olmadığında hiçbir
  602. 18:48nöron diğerine güvenemez. Her biri tek
  603. 18:50başına işe yarayan bir özellik öğrenmek
  604. 18:51zorunda kalır. Mimarideki yeri ise
  605. 18:54hidden layer'lar ile output
  606. 18:55layer'larının arasıdır. Fakat hidden
  607. 18:57layer'ların kendi arasında bir yerde
  608. 18:58konabilir. Örneğin kod kısmında dropout
  609. 19:000.5 dediğinizde bu hidden layer'lardaki
  610. 19:03128 nöronun her birini %50 ihtimalle
  611. 19:06kapat demektir. Son olarak bahsetmediğim
  612. 19:07forward propagation ve backward
  613. 19:09propagation konularından bahsetmek
  614. 19:11istiyorum. Buraya kadar öğrenimin
  615. 19:12modelin weight'lerini güncelleyerek,
  616. 19:14yani ağırlıklarını güncelleyerek
  617. 19:15olduğunu söyledik. Peki ya bu nasıl
  618. 19:17oluyor? Buradaki iki kavram forward ve
  619. 19:19backward propagation. Forward
  620. 19:21propagation başından beri anlattığımız
  621. 19:22normal mimaridir. Model lineer şekilde
  622. 19:25mimarimizde ilerleyerek tahminlerini
  623. 19:26yapar. Backward propagation gerçek değer
  624. 19:29ile modelin tahmin ettiği değer
  625. 19:30arasındaki farktan hata miktarının
  626. 19:32hesaplanması ve bu hatanın azaltılması
  627. 19:34amacıyla ağırlıkların, yani weight'lerin
  628. 19:36güncellenmesini sağlayan süreçtir. Model
  629. 19:39tahmin ettiği değerler ile gerçek
  630. 19:40değerleri kıyaslar. Bir loss, yani kayıp
  631. 19:42fonksiyonu aracılığıyla hatasını çıkarır
  632. 19:45ve gerçek değerlere daha yakınlaştıracak
  633. 19:47düzenlemeyi yaparak weight'leri
  634. 19:48günceller. Bu işlem weight'lerin
  635. 19:49bulunduğu iki yerde olur. Fully
  636. 19:51connected layer ve convolution layer.
  637. 19:53Diğer katmanlarda weight'ler
  638. 19:54olmadığından dolayı oralarda olmaz.
  639. 19:56Şimdi projemizde çalıştırdığımız CNN
  640. 19:58modelinin kodlarını ve detaylarını
  641. 20:00GitHub sayfamızdan kontrol edelim.
  642. 20:02Projemizde kullanılan modelin kaynak
  643. 20:03kodlarının bulunduğu repomuz bu şekilde.
  644. 20:05Burada asıl olarak iki dosyaya
  645. 20:07bakacağız. Çünkü ana işlemlerimizi
  646. 20:08bunların içerisinde yaptık. [müzik]
  647. 20:10Diğer kısımlar şu anki projemizle
  648. 20:11alakasız kaçıyor. Bu sebeple buralara
  649. 20:13değinmiyorum. Ana dosyamız olan
  650. 20:15model_train, yani modelimizi eğittiğimiz
  651. 20:17ve CNN katmanlarını kurduğumuz dosyaya
  652. 20:19bakalım. Gördüğünüz üzere 50 satırlık
  653. 20:20kısa bir kod dosyası bizleri karşılıyor.
  654. 20:22En baştan hızlı bir bakış atalım. Gerçek
  655. 20:24bir ürünü geliştirirken yapay zeka
  656. 20:26projelerinde özellikle model eğitimi,
  657. 20:28derin öğrenme ve makine öğrenmesi
  658. 20:30uygulamaları gibi görevlerde genellikle
  659. 20:32iki ana [müzik] kütüphane öne çıkar.
  660. 20:33Birincisi PyTorch. Eski adıyla Facebook,
  661. 20:36günümüz adıyla Meta tarafından
  662. 20:37geliştirilen PyTorch bu alanda en yaygın
  663. 20:39kullanılan kütüphanelerden birincisidir.
  664. 20:41İkincisi ise TensorFlow. Google
  665. 20:43tarafından geliştirilen TensorFlow
  666. 20:45makine öğrenmesi ve derin öğrenme
  667. 20:46uygulamalarında kullanılan bir diğer
  668. 20:48önemli kütüphanedir. Biz bu projede
  669. 20:50TensorFlow kullandık. TensorFlow'un
  670. 20:52içerisinde yer alan yüksek seviyeli bir
  671. 20:53API olan Keras'tan yararlandık. Keras'ın
  672. 20:56TensorFlow'dan temel farkı modellerimizi
  673. 20:58daha kısa, sade ve okunaklı bir şekilde
  674. 21:00tanımlamamıza olanak sağlamasıdır.
  675. 21:02Burada eğitim amaçlı bir içerik
  676. 21:03ürettiğimiz için [müzik] modelin nasıl
  677. 21:05oluştuğunu ve eğitildiğini daha
  678. 21:06anlaşılır bir şekilde göstermek adına
  679. 21:08Keras bizim için uygun bir tercih oldu.
  680. 21:09Ancak burada önemli bir noktayı
  681. 21:11belirtmek gerekiyor. Keras'ı kullanırken
  682. 21:13arka planda hesaplama ve model
  683. 21:14çalıştırma işlemleri TensorFlow
  684. 21:16tarafından gerçekleştiriliyor. Yani biz
  685. 21:18modeli Keras'ın daha sade ve kullanıcı
  686. 21:19dostu API'yi üzerinden tanımlarken
  687. 21:22işlemlerin büyük bir kısmı arka planda
  688. 21:23TensorFlow tarafından yürütülüyor. İlk
  689. 21:25satırda gözümüze çarpan kütüphane
  690. 21:27Sequential. [müzik] Bu CNN katmanlarını
  691. 21:29üst üste ardışık olarak dizmemizi
  692. 21:31sağlayan bir TensorFlow model yapısıdır.
  693. 21:33İkinci satırda [müzik] CNN katmanları
  694. 21:34olan Convolution, Pooling, Flatten ve
  695. 21:36Fully Connected Layer'larını import
  696. 21:38ettik. Üçüncü satırda to_categorical'ı
  697. 21:40import ettik. Bunu birazdan etiketleri
  698. 21:42modelin anlayacağı forma çevirirken
  699. 21:44kullanacağız. Dördüncü satırda MNIST
  700. 21:45veri setini, yani el yazısı rakamları
  701. 21:47import ettik. Keras bu veri setini hazır
  702. 21:49olarak sunuyor. Tek satırda indirip
  703. 21:51kullanabiliyoruz. NumPy çok meşhur bir
  704. 21:53kütüphanedir. Açılımı Numerical
  705. 21:55Python'dır. Data Science, yani veri
  706. 21:56bilimi alanında çok sık kullanılır. Biz
  707. 21:58ise burada resimler gibi büyük [müzik]
  708. 22:00sayı tablolarıyla hızlıca hesap yapmak
  709. 22:01için import ettik. Warning importları
  710. 22:03ise çıktı logları kirlenmesin diye
  711. 22:05uyarıları kapatmaya yarıyor. Normalde
  712. 22:07modelleri eğitirken dataseti ikiye
  713. 22:09böleriz. Train dataseti ve test dataseti
  714. 22:11diye. Örneğin bir datasetimiz [müzik]
  715. 22:13varsa bu datasetinin %70'ini modelin
  716. 22:15eğitimi için kullanır, kalan %30'unu ise
  717. 22:17eğitim bittikten [müzik] sonra modelin
  718. 22:18test edilmesi için kullanırız. Burada
  719. 22:20bunu yapıyoruz. X_train ve Y_train
  720. 22:22kısımlarında modelin eğitim için
  721. 22:24kullanacağı verileri kaydediyor, X test
  722. 22:26ve Y test kısımlarında ise modelin
  723. 22:28eğitim sonrası test edilmesi için
  724. 22:29ayrılmış veri seti parçalarını
  725. 22:31bulunduruyoruz. X'ler resimlerin
  726. 22:33kendilerine, Y'ler ise o resimlerde
  727. 22:34hangi rakamın yazıldığını, yani doğru
  728. 22:36cevapları barındırıyor. Train kısmı
  729. 22:38modeli eğitmek için kullanacağımız
  730. 22:4060.000 resim, test kısmı ise modelin
  731. 22:42eğitim sırasında [müzik] hiç görmediği
  732. 22:4310.000 resmi barındırıyor. Model
  733. 22:45eğitildikten sonra daha önce görmediği
  734. 22:47resimlerde ne kadar başarılı olduğunu
  735. 22:49bununla ölçebiliriz. Bu kısımda ise
  736. 22:50normalizasyon işlemi yapıyoruz.
  737. 22:52Bilgisayar için her piksel 0 ile 255
  738. 22:55arasında bir sayıdır. 0 siyah, 255
  739. 22:57beyaz, aradaki değerler grinin
  740. 22:59tonlarıdır. Biz bu sayıları 255'e
  741. 23:01bölerek hepsini 0 ile 1 arasına
  742. 23:03getiriyoruz. Yani normalize ediyoruz.
  743. 23:04[müzik] 255'e bölme işlemi yapıldıktan
  744. 23:07sonra örneğin 255 olan piksel 1, 0 olan
  745. 23:10piksel yine 0 oluyor. Yani pikseller 0
  746. 23:12ile 1 değeri arasında float değerleri
  747. 23:14olarak temsil ediliyor. Resim aynı
  748. 23:16görünmeye devam ediyor. Sadece sayılar
  749. 23:18küçülüyor. Bunu yapıyoruz çünkü model
  750. 23:19küçük sayılarla çok daha rahat ve hızlı
  751. 23:21öğreniyor. Büyük sayıları ise eğitimi
  752. 23:23zorlaştırıyor. Dimension fixing kısmında
  753. 23:25boyut düzenleme işlemi yapıyoruz.
  754. 23:26Convolution katmanı her resmi üç [müzik]
  755. 23:28bilgiyle bekler. Yükseklik, genişlik ve
  756. 23:30kanal sayısı. Kanal sayısı resmin renk
  757. 23:32bilgisidir. Renkli resimlerde üç kanal
  758. 23:35vardır. Kırmızı, yeşil ve mavi. Siyah
  759. 23:37beyaz resimlerde ise tek kanal vardır.
  760. 23:39MNIST veri [müzik] seti içerisinde
  761. 23:40bulunan el yazısı rakamları siyah beyaz
  762. 23:43olduğu için burada kanal sayısını 1
  763. 23:44olarak ayarladık. Bu satır onu ekliyor.
  764. 23:46[müzik] 28 x 28 olan resimlerimizi 28 x
  765. 23:4928 x 1, yani 28 x 28 boyutlu siyah beyaz
  766. 23:53resimler demek oluyor. Başındaki 60.000
  767. 23:55sayısı yukarıda da bahsettiğimiz
  768. 23:57eğitimde [müzik] kullanılacak olan
  769. 23:58resimlerin sayısını belirtiyor. Buradaki
  770. 24:00işlemimiz one hot encoding isimli bir
  771. 24:02işlem. [müzik] Modelimizin çıktısında 10
  772. 24:04tane kutu olduğunu düşünelim. Her kutu
  773. 24:06bir rakamı temsil ediyor. Model her
  774. 24:08rakam için bir olasılık tahmin ediyor.
  775. 24:10Örneğin modelimizin tahmini böyle olsun.
  776. 24:11Burada model 1 [müzik] için %10, 3 için
  777. 24:14%20, 5 için %60, 8 için %10 olasılık
  778. 24:17vermiş. En yüksek olasılık %60 ile 5
  779. 24:19rakamında [müzik] olduğu için modelin
  780. 24:21tahmini 5 oluyor. Şimdi model tahminini
  781. 24:23gerçek cevapla karşılaştırmamız
  782. 24:24gerekiyor. Bunun için Y train [müzik] ve
  783. 24:26Y test içerisindeki gerçek cevapları da
  784. 24:28aynı formata getiriyoruz. Burada
  785. 24:30yaptığımız işlemde tam olarak bu. Y
  786. 24:32train içerisindeki rakamları one hot
  787. 24:33formatına dönüştürüyoruz. Normalde Y
  788. 24:35train içerisinde cevaplar doğrudan rakam
  789. 24:37olarak bulunuyor. Örneğin bu resmin
  790. 24:39gerçek cevabı 8 ise Y train eşittir 8
  791. 24:42şeklinde bir formatta [müzik] bulunuyor.
  792. 24:43Biz bu değeri one hot encoding ile 10
  793. 24:45elemanlı bir diziye dönüştürüyoruz ve
  794. 24:47tablo böyle olmuş oluyor. Burada 10 tane
  795. 24:49değer var ve her değer bir rakamı temsil
  796. 24:51ediyor. Gerçek cevap 8 olduğu [müzik]
  797. 24:52için 8'in bulunduğu yer 1 değerini
  798. 24:54alıyor. Diğer bütün rakamların bulunduğu
  799. 24:56yerler ise 0 oluyor. Yani Y train
  800. 24:58içerisindeki her rakam için bu işlem
  801. 25:00tekrar ediliyor. Gerçek cevap 3 ise 3'ün
  802. 25:02bulunduğu yer 1, diğerleri 0 oluyor.
  803. 25:04Gerçek cevap 5 ise 5'in bulunduğu yer 1,
  804. 25:07diğerleri 0 oluyor. Böylece elimizde iki
  805. 25:09farklı cevap oluyor. Gerçek cevabın
  806. 25:11bulunduğu one hot formatı ve modelin
  807. 25:13tahmini. Burada 5 demiş ama gerçek cevap
  808. 25:158. Yani modelimiz yanılmış. Bu iki
  809. 25:17diziyi karşılaştırarak modelin ne kadar
  810. 25:19hata yaptığını hesaplayabiliyoruz. Daha
  811. 25:20sonra model bu hatayı azaltmaya
  812. 25:22çalışarak kendi weight'lerini
  813. 25:23güncelliyor ve zamanla daha da doğru
  814. 25:25tahminler yapmayı öğreniyor. Peki bunu
  815. 25:27her zaman yapmak zorunda mıyız? Cevabı
  816. 25:29hayır. Gerçek cevapları one hot
  817. 25:30formatına dönüştürmemiz kullanacağımız
  818. 25:32hata fonksiyonuna, yani loss function'a
  819. 25:34bağlı. Birazdan kullanacağımız
  820. 25:36categorical cross entropy hata [müzik]
  821. 25:37fonksiyonu gerçek cevapların bu
  822. 25:39formatta, yani one hot formatında
  823. 25:41olmasını beklediği için burada one hot
  824. 25:43encoding işlemi yapıyoruz. Asıl modeli
  825. 25:45kurduğumuz, katmanlarını belirlediğimiz,
  826. 25:47neye benzeyeceğini tanımladığımız kısma
  827. 25:49[müzik] geldik. Burada teoride
  828. 25:50anlattığımız katmanları sırasıyla
  829. 25:52diziyoruz. İlk satır convolution [müzik]
  830. 25:53katmanını tanımlıyor. 32 tane 3 x 3'lük
  831. 25:56filtre kullanılacağını, çıktıya ReLU
  832. 25:58aktivasyon fonksiyonu uygulanacağını
  833. 26:00tanımlıyor. Input shape ise modele
  834. 26:01gelecek resmin boyutunu tanımlıyor. Yani
  835. 26:0428 x [müzik] 28 x 1. İkinci satır 2 x 2
  836. 26:07pencere ile max pooling yapıyor. Üçüncü
  837. 26:09satır flatten ile veriyi düzleştiriyor.
  838. 26:11Dördüncü satır 128 nöronlu hidden
  839. 26:13layer'ımız. Son satırda 10 nöronlu
  840. 26:15output layer'ımız. Softmax [müzik] ile
  841. 26:17her rakam için bir olasılık veriyor.
  842. 26:19Fark etmiş olabileceğiniz üzere bu model
  843. 26:21diyagramdaki mimariden daha sade. Tek
  844. 26:23convolution ve tek pooling katmanı var.
  845. 26:25Dropout yok. Bunun sebebi MNIST basit
  846. 26:27bir veri seti olduğu için bu yalın
  847. 26:29katman dizilimi bize yetiyor. Daha
  848. 26:30karmaşık veri setlerinde diyagramdaki
  849. 26:32gibi daha fazla katman kullanmamız
  850. 26:34gerekir. Compile kısmında modele nasıl
  851. 26:36öğreneceğini söylüyoruz. Optimizer
  852. 26:37[müzik]
  853. 26:38modelin hata yaptıktan sonra
  854. 26:39weight'lerini nasıl güncelleyeceğini
  855. 26:41belirleyen yöntem. Adam en yaygın
  856. 26:43kullanılan optimizer. Çünkü ekstra ayar
  857. 26:45yapmadan çoğu problemde iyi çalışıyor.
  858. 26:47Loss modelin ne kadar hata yaptığını
  859. 26:48ölçen fonksiyon. Categorical
  860. 26:50crossentropy birden fazla sınıf arasında
  861. 26:52seçim yapılan problemlerde kullanılan
  862. 26:54standart hata ölçüsü. Model doğru rakama
  863. 26:56yüksek olasılık verirse ceza düşük,
  864. 26:58düşük olasılık verirse ceza büyük
  865. 27:00oluyor. Metrics ise sadece bizim
  866. 27:01notlardan takip etmemiz için var.
  867. 27:03Accuracy yani doğruluk metriği modelin
  868. 27:06yüzde kaç doğru tahmin yaptığını
  869. 27:07gösteriyor. Tüm metriklerin tamamlanması
  870. 27:09ve parametrelerin ayarlanması sonrasında
  871. 27:11modelin eğitimini başlatan satır burası.
  872. 27:14Meşhur fit fonksiyonuyla model training
  873. 27:15başlar. Eğitim için kullanılan X_train
  874. 27:18ve Y_train veri set parçalarını modele
  875. 27:20veriyoruz. Epoch modelin veri setini kaç
  876. 27:22kere göreceğini belirler. Burada üç
  877. 27:23seçmişiz. Model bu X_train ve Y_train'i
  878. 27:26üç kere tekrar tekrar görüp
  879. 27:27weight'lerini yani ağırlıklarını
  880. 27:29güncelleyecek demektir. Batch size 32
  881. 27:31demek [müzik] modelin resimleri 32'şerli
  882. 27:33gruplar halinde göreceği ve her 32
  883. 27:35resimden sonra weight'lerini
  884. 27:36güncelleyeceği anlamına geliyor.
  885. 27:38Validation split eşittir 0.2 ise eğitim
  886. 27:41verisinin yüzde 20'sini yani 12.000
  887. 27:43resmi kenara ayırıyor. Model bu
  888. 27:44resimlerle eğitilmiyor. Her epoch
  889. 27:46sonunda bu resimlerle sınanıyor ve biz
  890. 27:48modelin gerçekten öğrenip öğrenmediğini
  891. 27:50yoksa ezberleyip ezberlemediğini buradan
  892. 27:52takip ediyoruz. En sonda modelimizin
  893. 27:54performansını [müzik] beğendiysek daha
  894. 27:55sonra tekrar tekrar etmek zorunda
  895. 27:57kalmadan bu ağırlıkla kullanabilmek için
  896. 27:59kaydediyoruz. Machine learning
  897. 28:00modellerini kaydederken genelde .pkl,
  898. 28:03deep learning modellerini kaydederken
  899. 28:04ise .h5 dosyaları oluşur. Bizim
  900. 28:07dosyamızın adı da mnist_model.h5'tir.
  901. 28:09Bu modelin kayıtlı olduğu dosyayı aynı
  902. 28:11repo içerisinde bulabilirsiniz. [müzik]
  903. 28:13Bu dosyayı STM32CubeAI programı
  904. 28:15içerisinde kullandık. .h5 dosyası
  905. 28:17compile edilerek C koduna çevriliyor ki
  906. 28:19donanımımız içerisinde bu modeli
  907. 28:21çalıştırabilelim. Evet, CNN teorik
  908. 28:23anlatımını yaptık. Donanımımızda
  909. 28:24kullandığımız modelin kod yapısını
  910. 28:26inceledik. Son olarak bu repoyu genel
  911. 28:27olarak deneyimlemek [müzik] talimatları
  912. 28:30takip edebilirsiniz. El yazısı resmini
  913. 28:32yüklemenizi sağlayan bir front-end
  914. 28:33arayüzü ve kısa back-end kodları diğer
  915. 28:35dosyalarda bulunuyor. Tüm bu reponun
  916. 28:37linkini açıklamalardaki bağlantılardan
  917. 28:38bulabilirsiniz. Bugünlük benden bu
  918. 28:40kadar. Diğer yapay zeka donanım
  919. 28:42entegrasyonu videolarında görüşmek
  920. 28:43üzere. Kendinize iyi bakın. Söz
  921. 28:45Muhammed'de.
  922. 28:45>> Artık elimizde bir yapay zeka modeli
  923. 28:47var. Fakat uygulama kısmına geçmeden
  924. 28:49önce ufak bir güncelleme yapacağız.
  925. 28:51Biliyorsunuz bundan önceki videolarda
  926. 28:52tüm çalışmalarımızı STM32 Cube IDE
  927. 28:55içerisinde [müzik] yapıyorduk. Ancak ST
  928. 28:56firması STM32 Cube IDE 2.0 versiyonundan
  929. 28:59sonra CubeMX ve CubeIDE yapılarını
  930. 29:01birbirinden ayırdı. Aslında bu çok yeni
  931. 29:03bir durum değil. Bayağıdır bu şekilde
  932. 29:05ilerliyordu. Biz de bu videodan itibaren
  933. 29:07bunları ayrı bir program olarak
  934. 29:09kullanacağız. Ayrıca Python dilinde
  935. 29:10yazılmış bir yapay zeka modelini nasıl
  936. 29:13STM32'ye entegre edeceğimize bakalım.
  937. 29:15[müzik] Bunun için STM32 Cube IDE
  938. 29:17içerisinde bir Cube AI eklentisi var.
  939. 29:19Oradan yapılabiliyordu ve teknik olarak
  940. 29:21hala yapılabiliyor. Fakat ST bu kısmı
  941. 29:23artık güncellemeyeciğini ve yoluna STM32
  942. 29:25Cube AI yazılımı üzerinden devam
  943. 29:27edeceğini duyurdu. Ben de sistemime tüm
  944. 29:29bu programların en güncel sürümlerini
  945. 29:30kurdum. Bundan sonraki süreçte güncel
  946. 29:32versiyonlarla ilerleyeceğiz. Siz de
  947. 29:34CubeIDE, CubeMX ve CubeAI programlarını
  948. 29:36ST'nin resmi web sitesinden
  949. 29:38indirebilirsiniz. Gerekli linkleri
  950. 29:39açıklama kısmına bırakacağım. Bu
  951. 29:41uygulamada doğrudan kullanmayacağız ama
  952. 29:43işinize yarayacak STM32 Programmer ve
  953. 29:45CubeMX 2 yazılımlarını indirmenizi
  954. 29:47tavsiye ederim. Son olarak şunu da
  955. 29:48belirteyim. Daha önce birlikte
  956. 29:50yaptığımız tüm projeleri bu güncel
  957. 29:51versiyonlarda da sorunsuz bir şekilde
  958. 29:53çalıştırabiliyoruz. O zaman hadi
  959. 29:55başlayalım. STM32 Cube AI programımızı
  960. 29:57açıyoruz. Program açıldığında bizi böyle
  961. 29:59bir arayüz karşılıyor. Sol tarafta
  962. 30:01Settings ayarlar kısmı var. Öncelikle
  963. 30:03buraya göz atalım. Bu sayfada yapay zeka
  964. 30:05uygulamaları geliştirmek için gerekli
  965. 30:07olan yazılımlar ve bunların dosya
  966. 30:08yolları yer alıyor. Sırasıyla göz atacak
  967. 30:10olursak ST Edge AI Core. Arka planda
  968. 30:12çalışan derleme ve optimizasyon [müzik]
  969. 30:14katmanı. STM32 Cube AI kurarken
  970. 30:16sistemimize otomatik yüklenen kısım.
  971. 30:18STM32 Cube Programmer. Bu araç hem
  972. 30:20harici bir yazılım olarak
  973. 30:21kullanılabiliyor hem de STM32 Cube IDE
  974. 30:23içerisinde entegre olarak geliyor. Eğer
  975. 30:25harici olarak kurmazsanız sistem
  976. 30:27otomatik olarak CubeIDE içindeki sürüme
  977. 30:28bağlanabilir. STM32 CubeMX ve CubeMX 2
  978. 30:31olmak üzere iki farklı yapılandırma
  979. 30:33aracı seçeneğimiz var. Projelerimizde
  980. 30:34CubeMX'i kullanıyoruz. CubeMX 2'yi aktif
  981. 30:37olarak kullanmasak da önümüzdeki dönemde
  982. 30:38kademeli olarak CubeMX 2'ye geçileceğini
  983. 30:40düşünüyorum. Bu yüzden indirip aşina
  984. 30:42olmakta fayda var. Son olarak
  985. 30:43kodlarımızı yazacağımız IDE
  986. 30:44seçeneklerimiz [müzik] var.
  987. 30:45STM32CubeIDE, Keil ve IAR Embedded
  988. 30:48Workbench. STM32CubeIDE bizim de
  989. 30:50kullandığımız, ST'nin sunduğu tamamen
  990. 30:52ücretsiz IDE. [müzik] Keil ARM'ın resmi
  991. 30:54geliştirme ortamı. Sadece STM32 değil,
  992. 30:56Renesas, NXP gibi tüm ARM mimarilerini
  993. 30:59programlayabiliyor. Ancak ücretli bir
  994. 31:00yazılım. IAR Embedded Workbench sadece
  995. 31:03ARM değil, birçok mimarayı kapsayan
  996. 31:04yüksek kod optimizasyonuna ve
  997. 31:06uluslararası güvenlik sertifikalarına
  998. 31:08sahip endüstri standardı bir platform.
  999. 31:10Ancak bu da ücretli bir IDE. Biz
  1000. 31:12projemizde STM32CubeIDE üzerinden devam
  1001. 31:14edeceğiz. Ayarlar kısmı bu kadardı.
  1002. 31:16Şimdi proje ekranına geri dönelim. Proje
  1003. 31:18oluştura tıklıyorum. Açılan pencerede
  1004. 31:20projemizin ismini giriyorum. Adı rakam
  1005. 31:22olsun. Devam ediyorum. Target sayfası
  1006. 31:23açılıyor. Burada kullandığımız
  1007. 31:25Nucleo-F446RE
  1008. 31:26kartını seçiyoruz. Kart ekranda belirdi.
  1009. 31:29128 KB RAM ve 512 KB Flash olduğu burada
  1010. 31:33belirtilmiş. [müzik] Bu bilgiler
  1011. 31:34projemiz için önemli. Devam ediyorum.
  1012. 31:36Burada C diline dönüştürülen yapay zeka
  1013. 31:38kodlarımızın hangi yazılım programında
  1014. 31:39çalışacağını seçiyoruz. STM32CubeIDE
  1015. 31:42programını seçiyorum. Projemiz
  1016. 31:43oluşturuldu. Yapay zeka modelimiz olan
  1017. 31:45mnist_model.h5 dosyasını model file
  1018. 31:48kısmına tıklayarak ekliyoruz. Yapay zeka
  1019. 31:50modelimiz eklendi. Hemen altında [müzik]
  1020. 31:52optimizasyon kısmı var. Burada
  1021. 31:53seçenekler hafıza öncelikli mi yoksa
  1022. 31:55zaman öncelikli mi olması, [müzik] bir
  1023. 31:57de balans dengeli seçeneği var. Bu
  1024. 31:58uygulamada balans seçeneğini
  1025. 31:59kullanacağız. Devamında target kısmı
  1026. 32:01var. İçerisinde memory pool yani bellek
  1027. 32:03havuzu, RAM yerleşimi ve boyutunun
  1028. 32:05[müzik] ayarlandığı kısım. Yanındaki
  1029. 32:06ayar simgesine tıkladığımızda karşımıza
  1030. 32:08böyle sayfa çıkıyor. Modelin
  1031. 32:10ağırlıklarının ve aktivasyon
  1032. 32:11tamponlarının mikrodenetleyicinin hangi
  1033. 32:13RAM bölgesine yerleştirileceğini burada
  1034. 32:14belirliyoruz. STM32F446RE
  1035. 32:17için SRAM başlangıç adresi yazıyor.
  1036. 32:19Harici bir RAM kullanmayacağımız için
  1037. 32:21burada herhangi bir işlem yapmayıp
  1038. 32:22kapatıyoruz. Validation kısmı Cube
  1039. 32:24AI'dan çıktı almadan önce yapay zeka
  1040. 32:26modelimizi bizim burada ayarladığımız
  1041. 32:28parametrelere uygun olacak şekilde test
  1042. 32:30ediyor. Alttaki mod kısmında cihazda mı
  1043. 32:32yoksa bilgisayarda mı test edileceği
  1044. 32:34soruluyor. Benim tercihim cihazda test
  1045. 32:36edilmesi, ama dikkat bunu seçip teste
  1046. 32:38başlatırsanız içindeki [müzik] kodları
  1047. 32:39silecektir. O da aklınızda bulunsun. Bir
  1048. 32:41de advanced setting kısmı var. Burada
  1049. 32:43generate edilen C modelinin adını
  1050. 32:45soruyor. Herhangi bir şey yazmazsak
  1051. 32:47network olarak kalacak. Ben böyle
  1052. 32:48bırakıyorum. Hemen altında STM32Cube AI
  1053. 32:51uygulamasının önemli bir kısmı olan
  1054. 32:53sıkıştırma seviyesi bölümü. Python'da
  1055. 32:54hazırladığımız yapay zeka modelinin
  1056. 32:56çıktısı [müzik] en direkt STM32'de zaten
  1057. 32:58çalışmaz. Bunu C koduna dönüştüreceğiz.
  1058. 33:00Ama C koduna dönüştürsek bile çoğu zaman
  1059. 33:03hafıza sıkıntısı çekeceğiz. Örneğin bu
  1060. 33:05uygulamada sıkıştırma olmazsa veya az
  1061. 33:07olursa hafıza yetersizliğinden dolayı
  1062. 33:09proje hata verecek. Bundan ötürü [müzik]
  1063. 33:10sıkıştırmayı yüksek seçiyorum. Devamında
  1064. 33:12farklı ayar parametreleri var. Bunları
  1065. 33:14şimdilik olduğu gibi bırakıyoruz.
  1066. 33:15İlerleyen projelerde kısım kısım
  1067. 33:17değiniriz. Kaydet deyip bu pencereyi
  1068. 33:18kapatıyorum. Projemiz test etmeye hazır.
  1069. 33:20[müzik] Kartımız bilgisayara bağlı. Run
  1070. 33:22butonuna basıyorum ve karşımıza bir
  1071. 33:23uyarı ekranı çıkıyor. Cube MX programı
  1072. 33:25arka planda çalışacak, onunla etkileşime
  1073. 33:27girmeyin diyor. Tabii efendim deyip
  1074. 33:28kapatıyoruz. Bu kısım biraz zaman
  1075. 33:29alıyor. Bu süre zarfında programa ve
  1076. 33:31karta ellemiyoruz. Test kısmı başarıyla
  1077. 33:33tamamlandı. Şimdi çıktıyı inceleyelim.
  1078. 33:35Context kısmında kullandığımız kartı,
  1079. 33:37yapay zeka modelinin giriş ve çıkış
  1080. 33:39parametrelerini, yaptığımız
  1081. 33:40optimizasyonları ve ayarları
  1082. 33:41görebilirsiniz. [müzik]
  1083. 33:42Bunları zaten biz belirledik. Asıl
  1084. 33:44önemli olan nokta ise çıktı kısmı.
  1085. 33:46Sonuçlara baktığımızda yapay zeka
  1086. 33:48modelimiz [müzik] flash bellekte 345 KB,
  1087. 33:50RAM'de ise 88 KB yer kaplıyor. Bunu
  1088. 33:53grafikler üzerinden de net bir şekilde
  1089. 33:54görebilirsiniz. Modelimizin [müzik] bir
  1090. 33:56veriyi tahmin etmesi yaklaşık 63 ms
  1091. 33:58sürüyor ve saniyede 15 ila 16 tahmin
  1092. 34:00gerçekleştirebiliyor. Burada da modelin
  1093. 34:02sistemle olan uyumluluk oranı
  1094. 34:03belirtilmiş. Validation yani doğrulama
  1095. 34:05kısmına baktığımızda tahmin başarısı ve
  1096. 34:07doğruluk oranı %90 olarak verilmiş. Bu
  1097. 34:09değer uygulamamız için oldukça yeterli.
  1098. 34:11[müzik] Memory pools kısmında RAM
  1099. 34:13adresinin nerede başlayacağı gösterilmiş
  1100. 34:15ve tekrar kullanılan RAM miktarı
  1101. 34:17belirtilmiş. Şimdi C kodumuzu
  1102. 34:18oluşturalım. Generate code butonuna
  1103. 34:20bastığımızda karşımıza bu uyarı
  1104. 34:21penceresi çıkıyor. Burada proje seçeneği
  1105. 34:23olarak uygulamanın gerçek bir proje için
  1106. 34:26mi yoksa doğrulama testi için mi
  1107. 34:27olduğunu soruyor. Application uygulama
  1108. 34:29seçeneği işaretli olarak kalacak.
  1109. 34:31Devamında ise kod üretim tipini soruyor.
  1110. 34:33Sadece C kodu mu üretilsin yoksa
  1111. 34:35sıfırdan yeni bir proje mi oluştursun?
  1112. 34:37Bizim halihazırda bir projemiz olduğu
  1113. 34:38için sadece C kodu üretme seçeneğini
  1114. 34:40[müzik] işaretli bırakıyoruz. Generate
  1115. 34:41butonuna basıyorum ve kod üretimi
  1116. 34:43başlıyor. İşlem tamamlandı. Kodu
  1117. 34:45masaüstüne [müzik] indiriyoruz. Kaydet
  1118. 34:46butonuna basarak indirme işlemini
  1119. 34:48tamamlıyorum. STM32CubeAI ile işimiz
  1120. 34:50bitti. Artık bu programı kapatabiliriz.
  1121. 34:52Gördüğünüz gibi ürettiğimiz kod
  1122. 34:54masaüstüne sıkıştırılmış bir zip dosyası
  1123. 34:56olarak geldi. Şimdi bir önceki SPI TFT
  1124. 34:58uygulamasında yaptığımız projemizi yeni
  1125. 35:00versiyon CubeMX programında açalım.
  1126. 35:02CubeMX açıldıktan sonra file kısmından
  1127. 35:04var olan bir projeyi açacağımız için
  1128. 35:06load project diyoruz. Açılan pencereden
  1129. 35:08projemizi .ioc dosyasını seçip open
  1130. 35:11butonuna basıyoruz ve projemizin CubeMX
  1131. 35:13arayüzü açılıyor. Gördüğünüz gibi eski
  1132. 35:15versiyona nasıl ayarladıysak burada da
  1133. 35:16aynı şekilde geldi. Eğer sıfırdan bir
  1134. 35:18proje oluşturuyor olsaydık project
  1135. 35:19manager kısmından projemizin dosya
  1136. 35:21yolunu ve hangi IDE'de çalıştırılacağını
  1137. 35:23seçerek oluşturabilirdik. Fakat var olan
  1138. 35:25bir proje üzerinden ilerlediğimiz için
  1139. 35:27bu kısımda herhangi bir değişiklik
  1140. 35:28[müzik] yapmıyorum. Generate code
  1141. 35:29butonuna basıyorum ve CubeMX'te
  1142. 35:31yaptığımız son güncellemeleri kod
  1143. 35:33kısmına aktarıyor. Biz herhangi bir
  1144. 35:34değişiklik yapmadık ama olsun. Bu
  1145. 35:35aşamaları da birlikte görmüş olalım.
  1146. 35:37İşlem tamamlanınca karşımıza çıkan ekran
  1147. 35:39da open project dersek STM32CubeIDE'yi
  1148. 35:40[müzik]
  1149. 35:41açar. Dosya yolunu kontrol ediyoruz.
  1150. 35:42Doğruysa launch butonuna tıklayıp
  1151. 35:44programımızı açıyoruz. Programımız
  1152. 35:45açıldı. Gördüğünüz gibi kodlarımız eski
  1153. 35:47projemizde olduğu gibi geldi. İsterseniz
  1154. 35:49CubeMX ve CubeIDE'yi kapatıp direkt
  1155. 35:51STM32CubeIDE üzerinden [müzik] de
  1156. 35:53açabiliriz. Gördüğünüz gibi eski
  1157. 35:54projemiz programın yeni versiyonunda da
  1158. 35:56problemsiz bir şekilde çalışıyor. Şimdi
  1159. 35:58ekranı küçültüp yapay zeka
  1160. 35:59kütüphanelerimizi [müzik] projemize
  1161. 36:01ekleyelim. Yapay zeka kodlarımızı
  1162. 36:02sıkıştırılmış dosyanın içerisinden
  1163. 36:04çıkartıyoruz. Dosyayı açtığımızda
  1164. 36:06önümüze üç tane klasör çıkıyor. Bu üç
  1165. 36:08dosyayı da sürükleyip kendi projemize
  1166. 36:10atıyoruz. Çıkan uyarı ekranında dosya ve
  1167. 36:12klasörleri kopyalama seçeneği işaretli
  1168. 36:14olacak şekilde kalsın. Ok butonuna
  1169. 36:16basıyoruz ve dosyalarımız kopyalandı.
  1170. 36:18Kopyalanan dosyalar içerisinde AI, AI
  1171. 36:20generated network ve middlewares
  1172. 36:22klasörleri yer alıyor. Bu klasörlerin
  1173. 36:24işlevleri [müzik] kısaca şunlardır. AI
  1174. 36:26yapay zeka modelinin çalışması için
  1175. 36:28gereken temel çalışma zamanı runtime
  1176. 36:30kütüphanelerini ve çekirdek
  1177. 36:31fonksiyonlarını barındırır. AI generated
  1178. 36:33network STM32CubeAI tarafından
  1179. 36:35modelimizin katılımı ile otomatik olarak
  1180. 36:37üretilen yapay zeka ağının mimarisini
  1181. 36:40>> [müzik]
  1182. 36:40>> ve ağırlık verilerini içeren kaynak
  1183. 36:41kodları barındırır. Middlewares STM32
  1184. 36:45donanım ve yazılım katmanları arasında
  1185. 36:46köprü görevi gören ara katılım
  1186. 36:48kütüphanelerini içerir. Şimdi bu
  1187. 36:50kopyaladığımız dosyaların yollarını
  1188. 36:51projemize tanıtalım. İçerisindeki .c ve
  1189. 36:54.h uzantılı dosyaları ayrı ayrı
  1190. 36:56tanıtmamız gerekiyor. Projenin üstüne
  1191. 36:58gelip sağ tık yapıyoruz ve properties
  1192. 37:00seçeneğine basıyoruz. Açılan pencerenin
  1193. 37:01sol tarafında C/C++ General altındaki
  1194. 37:04Path and Symbols seçeneğine tıklıyorum.
  1195. 37:06Source Location kısmından .c uzantılı
  1196. 37:09dosyalarımızı ekleyeceğiz. Dosya ekleme
  1197. 37:11butonuna basarak .c uzantılı
  1198. 37:13dosyalarımızı tek tek ekliyorum.
  1199. 37:17.c uzantılı dosyalar tamam. Şimdi .h
  1200. 37:19uzantılı dosyalar için Includes kısmına
  1201. 37:21geçiyorum. Benzer şekilde ekle butonuna
  1202. 37:23basıyorum. Çıkan ekranda Workspace
  1203. 37:25butonuna [müzik] tıklıyorum. Burada
  1204. 37:26açılan pencerede projemizi de
  1205. 37:27görebiliyoruz. .h uzantılı dosyalarımızı
  1206. 37:30bulup ekliyoruz. Ok butonuna bastıktan
  1207. 37:32sonra tüm kutucukları işaretliyoruz.
  1208. 37:34Ardından tekrar ok butonuna basarak
  1209. 37:35ekleme işlemimizi tamamlıyoruz. Diğer .h
  1210. 37:38uzantılı dosyaların bulunduğu klasörleri
  1211. 37:39de aynı şekilde ekliyoruz.
  1212. 37:44.c ve .h dosyaları dışında lib klasörü
  1213. 37:48içerisinde yer alan .a uzantılı
  1214. 37:50dosyamızı da tanıtmamız gerekiyor. Bunun
  1215. 37:51için de sol tarafta C/C++ Build kısmına
  1216. 37:54tıklıyoruz. Açılan seçeneklerden
  1217. 37:56Settings kısmına tıklıyoruz. Önümüze
  1218. 37:58gelen yeni seçeneklerden alttaki
  1219. 37:59Libraries kısmına tıklıyorum. Sağ
  1220. 38:01tarafta iki bölme beliriyor. Alttaki
  1221. 38:02kısımda dosya ekleme butonuna basıyorum
  1222. 38:04ve karşıma .a uzantılı dosyanın yolu
  1223. 38:06geliyor. Herhangi bir değişiklik
  1224. 38:08yapmadan ok butonuna basıp ekliyorum.
  1225. 38:10Benzer şekilde üstteki bölmenin dosya
  1226. 38:12ekleme butonuna basıyorum ve açılan
  1227. 38:13pencerede çıkan uzantıyı silip başına
  1228. 38:15iki nokta koyup dosyanın adını
  1229. 38:17yazıyorum.
  1230. 38:18Sonra ok butonuna basarak dosyayı
  1231. 38:19ekliyorum. Son olarak Apply and Close
  1232. 38:21butonuna basarak işlemi tamamlıyoruz.
  1233. 38:23Kodumuzu derleyip kontrol edelim, eksik
  1234. 38:25bir nokta var mı diye.
  1235. 38:26Kodumuz derlendi. Hata yok. Sadece iki
  1236. 38:28tane uyarı var. Yani projemiz problemsiz
  1237. 38:30bir şekilde derleniyor. Şimdi kod
  1238. 38:31kısmına geçebiliriz. Kod kısmına önceki
  1239. 38:34projeden kalan kodları silerek
  1240. 38:35başlıyorum.
  1241. 38:36Main.c içerisinde yazdıklarımızın
  1242. 38:38tamamını siliyoruz. AI klasörü içindeki
  1243. 38:41app klasöründe uygulamayı kolaylıkla
  1244. 38:43yapabilmemiz için hazır üretilmiş bir
  1245. 38:45uygulama şablonu mevcut. Bunu
  1246. 38:46kullanacağız. Bu dosyalar appx cube ai.c
  1247. 38:49ve appx cube ai.h dosyaları. Şimdi
  1248. 38:52bunları açalım. Bu projemiz için gereken
  1249. 38:54kodları tek tek yazmak aşırı zaman
  1250. 38:56alacağından ötürü ben bunları önceden
  1251. 38:57yazdım. Şimdi parça parça kopyalayalım
  1252. 38:59ve üzerinde konuşalım. appx cube ai.c
  1253. 39:02içerisine kütüphanelerimizi ekliyoruz.
  1254. 39:04Bu kütüphaneler dokunmatik TFT ekranı
  1255. 39:06kontrol ettiğimiz kütüphanelerdir.
  1256. 39:08Burada fark ettiyseniz testimg.h örnek
  1257. 39:10resim kütüphanesini eklemedim. Çünkü
  1258. 39:12hafızada çok yer kaplıyor ve projemiz
  1259. 39:14için gerekli değil. Devam ediyorum
  1260. 39:15aşağıya doğru. Entry points yazan kısmın
  1261. 39:17altına global değişkenlerimizi
  1262. 39:19kopyalıyorum. Yanlarına açıklamalarını
  1263. 39:20yazdım. AI input buffer yapay zekanın 28
  1264. 39:23x 28'lik girdi matrisi. [müzik] Hemen
  1265. 39:25altındaki değişken bulunan sonucun
  1266. 39:27doğruluk oranı. AI run flag bunu kontrol
  1267. 39:29amaçlı koydum. Bu bayrak ile yapay zeka
  1268. 39:31kodlarını çalıştıracağız. Son olarak
  1269. 39:33tahmin edilen rakamın değişkeni.
  1270. 39:34Değişkenlerin altına fonksiyonlarımızın
  1271. 39:36gövdelerini kopyalıyorum. Burada
  1272. 39:37kafamızda kalem kağıt üzerinde hayali
  1273. 39:39bir çalışma sayfası oluşturalım. Bu
  1274. 39:41sayfada ekranda gördüğünüz gibi bir
  1275. 39:42çalışma sayfası çizdim. Şimdi bunu
  1276. 39:44kodlarla ekrana uygulayalım. Bizim
  1277. 39:45ekranımızda içi boş kutular olacak. Onu
  1278. 39:47çizmek için yardımcı bir fonksiyon
  1279. 39:49yazdım. Bunu kopyalıyorum. Butonlar için
  1280. 39:51içi dolu kutular olacak. Bunun için
  1281. 39:52yardımcı fonksiyonu kopyalıyorum. Ekrana
  1282. 39:54çizdiğimiz rakamın yapay zekaya
  1283. 39:56gönderilen 28 x 28 piksel haline ekrana
  1284. 39:59çizen fonksiyonu kopyalıyorum. Devamında
  1285. 40:00ekranı bölümlere ayıran, butonları
  1286. 40:02ekleyen ana arayüz fonksiyonunu
  1287. 40:04kopyalıyorum. Burada sırasıyla ekranı
  1288. 40:06ikiye bölen çizgi, üst bölümde rakamı
  1289. 40:08yazacağımız bölüm ve tahmin işlemi
  1290. 40:09başlasın komutunu göndereceğimiz AI
  1291. 40:11butonu, alt bölümde 28 x 28 piksele
  1292. 40:14çevrilmiş rakamın yazılacağı kısım ve
  1293. 40:16yanında AI tahmin sonucunun yazacağı
  1294. 40:18kısım. En altta da sayfayı yenileyecek
  1295. 40:20yenile butonu olacak. Fonksiyonları
  1296. 40:22kopyalamaya devam ediyorum. Çizdiğimiz
  1297. 40:23rakamı yapay zekanın daha doğru tahmin
  1298. 40:26etmesi için merkezleyen fonksiyon.
  1299. 40:29Devamında tahmin edilen sonucu ekranda
  1300. 40:31belirlediğimiz bölgeye yazan fonksiyon.
  1301. 40:33Alt tarafında da tahmin edilen sonucun
  1302. 40:35doğruluk oranını yazdıran fonksiyon.
  1303. 40:36Devamında TFT ekranı başlatan, ardından
  1304. 40:39ekranın taslağını çizen init [müzik]
  1305. 40:40fonksiyonunu ekliyoruz. Devamında ekrana
  1306. 40:43rakamı çizerken dokunduğumuz noktayı
  1307. 40:45algılayıp ekranın o noktasının pikselini
  1308. 40:47değiştirecek fonksiyonu ekliyoruz. Bizim
  1309. 40:49ekleyeceğimiz fonksiyonlar bu kadardı.
  1310. 40:50Şimdi halihazırda var olan
  1311. 40:52fonksiyonların içerisine eklemeler ve
  1312. 40:54değişiklikler yapacağız. Aşağıya doğru
  1313. 40:56indiğimizde AI run fonksiyonu var. Bunun
  1314. 40:58sonunda 5 saniye gecikme koymuşlar.
  1315. 41:00Akışı yavaşlattığı için bunu
  1316. 41:01kapatıyorum. Hemen altında AI kısmını
  1317. 41:03girdi fonksiyonu var. Bu kısmın
  1318. 41:05içerisine elimizdeki rakam matris
  1319. 41:06tablosunu vereceğiz. Bunu direkt
  1320. 41:08kopyalayıp değiştiriyorum. Hemen
  1321. 41:10altındaki de çıktı fonksiyonu. Buradan
  1322. 41:11da yapay zekadan gelen çıktıyı alacağız.
  1323. 41:13Yapay zeka modelinin en yüksek [müzik]
  1324. 41:15skora sahip çıktısını bulup alıyor ve
  1325. 41:17TFT ekrana yazdırıyoruz. Bu fonksiyonu
  1326. 41:19da kopyalayıp değiştiriyorum. Kodda
  1327. 41:21aşağıya doğru devam ettiğimizde main
  1328. 41:23loop fonksiyonu var. Bunu da kendi
  1329. 41:24kullanacağımız senaryoya göre
  1330. 41:25değiştiriyorum. Önce bizim rakam yazma
  1331. 41:27fonksiyonumuz çalışıyor. Sonra AI
  1332. 41:29butonuna basarsam yapay zeka kısmı işin
  1333. 41:31içine giriyor ve çizdiğimiz rakamı
  1334. 41:32tahmin ediyor. Aşağıya doğru devam
  1335. 41:34ettiğimde yapay zeka kodlarının init
  1336. 41:36[müzik] fonksiyonu var. Bunu zaten
  1337. 41:37çağıracağız. Onun için kendi TFT ekran
  1338. 41:39init fonksiyonumu da bunun içine
  1339. 41:41ekliyorum. Bu sayfada işimiz bitti.
  1340. 41:43Şimdi fonksiyon prototiplerimizi eklemek
  1341. 41:45için [müzik] appxai.h
  1342. 41:47sayfasına geçip fonksiyonun
  1343. 41:49prototiplerini kopyalıyorum. Bu
  1344. 41:50sayfadaki işimiz de bu kadardı. Şimdi
  1345. 41:52ana sayfa olan main.c [müzik] sayfasına
  1346. 41:54geçelim. Burada yapay zeka kütüphanemiz
  1347. 41:56olan appxai.h
  1348. 41:58kütüphanesini ekleyelim. Sonra int main
  1349. 42:00içerisinde while döngüsüne girmeden önce
  1350. 42:02[müzik] AI init fonksiyonumuzu
  1351. 42:04çağırıyoruz. While içerisine de STM32
  1352. 42:07Cube AI Studio AI [müzik] process
  1353. 42:08fonksiyonumuzu kopyalıyorum. Şimdi
  1354. 42:10kodumuzu bu haliyle derlediğimizde hata
  1355. 42:12verecek. UART'ın tanımlanması ile ilgili
  1356. 42:14olarak AI kütüphanesi [müzik] ile main.c
  1357. 42:16içerisindeki tanım çakışıyor. Bunu
  1358. 42:18düzeltmemiz gerekecek. Bu da middlewares
  1359. 42:20klasörünün altındaki SD klasörünün
  1360. 42:22altındaki AI klasörünün altındaki misc
  1361. 42:24[müzik] klasörünün altındaki inch
  1362. 42:26klasörünün içinde AI device adapter.h
  1363. 42:29sayfası var. Onu açalım. Aşağıya doğru
  1364. 42:31indiğimizde 655. [müzik]
  1365. 42:32satırda extern ile tanımlanmış satırı
  1366. 42:34yoruma alıp bizimki ile uyumlu olacak
  1367. 42:36şekilde yeniden tanımlıyorum. Bu
  1368. 42:37değişikliği de [müzik] yaptıktan sonra
  1369. 42:39artık derleyebiliriz. Ve gördüğünüz gibi
  1370. 42:42hata kalmadı. Şimdi kodumuzu karta
  1371. 42:43yükleyebiliriz. [müzik]
  1372. 42:46Kodumuz başarıyla yüklendi. Şimdi şov
  1373. 42:48zamanı. Ekranımız açılıyor. Kod kısmında
  1374. 42:50oluşturduğumuz ana şablon karşımıza
  1375. 42:51geldi. Şimdi rakamları yazalım. 9
  1376. 42:54yazdım. Mavi AI butonuna basıyorum ve
  1377. 42:56%96 güven skoruyla doğru tahmin etti.
  1378. 42:59Kırmızı clear butonuna basınca ekranı
  1379. 43:01yeniliyor ve yeni rakam giriyorum. Şimdi
  1380. 43:02rakamları karışık şekilde yazıyorum.
  1381. 43:074 rakamını farklılık olsun dijital saat
  1382. 43:09[müzik] şeklinde çiziyorum. Onu da doğru
  1383. 43:10tahmin etti.
  1384. 43:16Rakamları rastgele ve farklı stillerde
  1385. 43:18yazmama rağmen model hepsini doğru
  1386. 43:19bildi. Uygulama testimizi de başarılı
  1387. 43:22tamamlamış olduk. Evet arkadaşlar
  1388. 43:24böylece bir yapay zeka uygulamasının
  1389. 43:25sonuna gelmiş olduk. Bu uygulama
  1390. 43:27hakkındaki düşüncelerinizi gerçekten
  1391. 43:29merak ediyorum. Eksik veya fazla
  1392. 43:30olduğunu düşündüğünüz bir kısım ya da
  1393. 43:32eklemek istediğiniz bir fikir [müzik]
  1394. 43:33varsa yorum kısmında mutlaka yazın.
  1395. 43:35Hepinize iyi çalışmalar dilerim.
  1396. 43:41>> [müzik]

About this transcript

This page contains the full transcript of YAPAY ZEKAYI MİKRODENETLEYİCİYE SIĞDIRDIK! | STM32CUBE.AI by Mühendislik Projeleri, generated from the public captions YouTube serves with the video. The transcript has 6,792 words across 1,396 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.

What you can do with it

Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to choose a caption track available on the video.

Free YouTube transcript tool

YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, caption language selection, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.