Makine öğrenimiyle "Merhaba, Dünya" deyin

1. Başlamadan önce

Bu codelab'de, ML'nin Temel "Dünya

Şu sorunu göz önünde bulundurun: Fitness takibi için aktivite tanıma yapan bir sistem inşa ediyorsunuz. Bir kişinin yürüdüğü hıza erişiminiz olabilir ve bir koşullu koşul kullanarak aktivitesinin bu hıza göre tahmin edilmesini sağlayabilirsiniz.

cc3628d9a1547597.png

if(speed<4){
  status=WALKING;
}

Bunu başka bir koşulla çalıştırmaya genişletebilirsiniz.

f2cc3929221107b8.png

if(speed<4){
    status=WALKING;
} else {
    status=RUNNING;
}

Son olarak, bisiklet sürmeyi benzer şekilde tespit edebilirsiniz.

aeb282cf03d5cff.png

if(speed<4){
    status=WALKING;
} else if(speed<12){
    status=RUNNING;
} else {
    status=BIKING;
}

Şimdi de golf gibi bir aktivite eklemek istediğinizde ne olacağını düşünün. Etkinliği belirlemek için bir kuralın nasıl oluşturulacağı daha az anlaşılır.

fc772abb6fee2804.png

// Now what?

Golfü tanıyacak olan bir program yazmak son derece zordur. Bu durumda ne yaparsınız? Sorunu çözmek için makine öğrenimini kullanabilirsiniz.

Ön koşullar

Bu codelab'i denemeden önce aşağıdakilere sahip olmanız gerekir:

  • Python'a dair engin bilgi birikimi
  • Temel programlama becerileri

Neler öğreneceksiniz?

  • Makine öğrenimiyle ilgili temel bilgiler

Geliştireceğiniz uygulama

  • İlk makine öğrenimi modeliniz

Gerekenler

TensorFlow'u kullanarak hiç makine öğrenimi modeli oluşturmadıysanız tüm gerekli bağımlılıkları içeren tarayıcı tabanlı bir ortam olan Colaboratory'yi kullanabilirsiniz. Colab'da çalışan codelab'in geri kalanının kodunu bulabilirsiniz.

Farklı bir IDE kullanıyorsanız Python'un yüklü olduğundan emin olun. Ayrıca TensorFlow ve NumPy kitaplığına da ihtiyacınız olacaktır. TensorFlow'u buradan yükleyebilir ve daha fazla bilgi edinebilirsiniz. NumPy'yi buraya yükleyin.

2. ML nedir?

Aşağıdaki şemada gösterildiği gibi, geleneksel uygulama oluşturma yöntemini göz önünde bulundurun:

c72f871306134e45.png

Kuralları programlama dilinde ifade edersiniz. Verilere göre hareket ederler ve programınız yanıtlar verir**.** Etkinlik algılama söz konusu olduğunda, kurallar (etkinlik türlerini tanımlamak için yazdığınız kod) bir yanıt oluşturmak için verilere (kişinin hareket hızı) göre işlem yapar: Kullanıcının aktivite durumunu (yürürken, koşarak, bisiklete binerken veya başka bir şey yaparken) belirlemek için işlevden elde edilen dönüş değeri.

Etkinlik durumunu makine öğrenimi aracılığıyla algılama süreci oldukça benzerdir ve yalnızca eksenler farklıdır.

9b85a337ee816e1b.png

Kuralları tanımlamaya ve bir programlama dilinde belirtmeye çalışmak yerine, yanıtları (veriler ile birlikte) etiketler olarak sağlarsınız ve makine, yanıtlar ile veriler arasındaki ilişkiyi belirleyen kuralları tahmin eder. Örneğin, etkinlik algılama senaryonuz makine öğrenimi bağlamında aşağıdaki gibi görünebilir:

6ff58697a85931f4.png

Birçok veri topluyor ve verimli bir şekilde "Yürüyüş böyle görünüyor" veya "koşu bu şekilde görünüyor" demek için etiketliyorsun. Ardından, bilgisayar, belirli bir etkinliği gösteren farklı kalıpların verilerden ne tür veriler sağladığını belirler.

Bu senaryoyu programlamanın alternatif bir yöntemi olmanın yanı sıra bu kural, kural tabanlı geleneksel programlama yaklaşımıyla mümkün olamayacak golf senaryosu gibi yeni senaryolar da açabilmenizi sağlıyor.

Geleneksel programlamada, kodunuz genellikle program adı verilen bir ikili programda derlenir. Makine öğreniminde, verilerden ve etiketlerden oluşturduğunuz öğeye model denir.

Bu şemaya geri dönerseniz:

53ff9e2cb511936e.png

Bunun sonucunu, çalışma zamanında şu şekilde kullanılan bir model olarak düşünün:

693430bb4d7fa001.png

Modele bazı veriler aktarıyorsunuz ve model, tahminde bulunmak için eğitimden tahmin ettiği kuralları kullanıyor. Örneğin, "Bu veriler yürüyüş gibi görünüyor" veya "Bu veriler bisiklet gibi görünüyor."

3. İlk makine öğrenimi modelinizi oluşturma

Aşağıdaki sayı gruplarını değerlendirin. Aralarındaki ilişkiyi görebilir misiniz?

X:

-1

0

1

2

3

4

E:

-2

1

4

7

10

13

Bunları incelediğinizde, soldan sağa doğru okuduğunuzda X değerinin 1, Y'nin karşılık gelen değerinin ise 3 arttığını görebilirsiniz. Muhtemelen Y'nin, 3'ün toplamına eşit olduğunu düşünüyorsun. Ardından, X'te 0'a göz atıp Y'nin 1 olduğunu ve Y=3X+1 ilişkisini ortaya çıkardığını görebilirsin.

Verilerdeki kalıpları tespit etmek için bir modeli eğitmek üzere neredeyse aynı kodu kullanırsınız.

Şimdi bunu yapmak için koda bakabilirsin.

Bir nöral ağı, eşdeğer bir görevi yapmak için nasıl eğitirsiniz? Veriler kullanılıyor! Bunları bir dizi X's ve bir Y's ile besleyerek aralarındaki ilişkiyi anlayabilir.

İçe aktarmalar

İçe aktarma işlemlerinizle başlayın. Burada TensorFlow'u içe aktarıyor ve kullanım kolaylığı için tf olarak adlandırıyorsunuz.

Ardından, verilerinizi kolay ve hızlı bir şekilde liste olarak temsil eden numpy adlı bir kitaplığı içe aktarın.

Bir nöral ağı sıralı katman grubu olarak tanımlamanın çerçevesi keras olarak adlandırılır. Bu yüzden onu da içe aktarın.

import tensorflow as tf
import numpy as np
from tensorflow import keras

Nöral ağı tanımlama ve derleme

Ardından, mümkün olan en basit nöral ağı oluşturun. Bir katmanı vardır, bu katman bir nörona sahiptir ve katmana girilen giriş şekli yalnızca bir değerdir.

model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])

Ardından, nöral ağınızı derlemek için kodu yazın. Bunu yaptığınızda iki işlev belirtmeniz gerekir: loss ve optimizer.

Bu örnekte, sayılar arasındaki ilişkinin Y=3X+1 olduğunu biliyorsunuz.

Bilgisayar bunu öğrenmeye çalıştığında bir tahminde bulunabilir. Belki de Y=10X+10. loss işlevi, tahmin edilen yanıtları bilinen doğru cevaplarla karşılaştırmalı olarak ölçer.

Ardından, model başka bir tahmin yapmak için optimizer işlevini kullanır. Kaybolma işlevinin sonucuna göre kayıpı en aza indirmeye çalışır. Bu noktada aklınıza Y=5X+5 gibi bir şey gelir. Bu hâlâ oldukça kötü olsa da, doğru sonuca daha yakındır (kayıp oranı daha düşüktür).

Model, kısa bir süre içinde göreceğiniz sıfır zaman sayısı için bunu tekrar eder.

İlk olarak, kayıp için mean_squared_error, optimize edici için sayısal gradyan iniş (sgd) nasıl kullanılacağını söyler. Henüz matematiği anlaman gerekmiyor ama işe yaradıklarını görebilirsin.

Zaman içinde farklı senaryolara yönelik farklı ve uygun kayıp ve optimize edici işlevlerini öğreneceksiniz.

model.compile(optimizer='sgd', loss='mean_squared_error')

Verileri sağlama

Ardından, bazı verileri besleyin. Bu durumda, önceki 6 ve altı Y değişkenini alırsınız. Gördüğünüz gibi, arasındaki ilişki Y=3X+1 şeklindedir. Dolayısıyla X, -1, Y, -2'dir.

NumPy adlı python kitaplığı, bunu yapmak için birçok dizi türü veri yapısı sağlar. Değerleri np.array[] ile NumPy'de bir dizi olarak belirtin.

xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-2.0, 1.0, 4.0, 7.0, 10.0, 13.0], dtype=float)

Artık nöral ağı tanımlamak için ihtiyacınız olan tüm koda sahipsiniz. Sonraki adım, bu sayılar arasındaki kalıpları çıkarıp çıkaramayacağını görmek ve bunları bir model oluşturmak için kullanmak üzere eğitmektir.

4. Nöral ağı eğitme

X's ile Y's arasındaki ilişkiyi öğrenen nöral ağı eğitme süreci model.fit görüşmesindedir. Burada, tahmin yapılmadan önce döngüden geçer, ne kadar iyi veya kötü olduğunu (kayıp) ölçer veya başka bir tahmin yapmak için optimize ediciyi kullanır. Bu işlem, belirttiğiniz dönemlerin sayısı için bunu yapar. Bu kodu çalıştırdığınızda, kaybın her dönem için yazdırılacağını görürsünüz.

model.fit(xs, ys, epochs=500)

Örneğin, ilk birkaç dönem için kayıp değerinin oldukça büyük olduğunu, ancak her bir adımla boyutun küçüldüğünü görebilirsiniz.

f110d5abed07c1b9.png

Eğitim ilerledikçe kayıp kısa süre sonra çok küçük hale gelir.

81ca5e71298b414b.png

Eğitim sona erdiğinde kayıp çok fazla az oluyor. Bu da modelimizin sayılar arasındaki ilişkiyi çıkartıyor olduğunu gösteriyor.

12b187014b639fd.png

Muhtemelen 500 dönemin tümüne ihtiyacınız yoktur ve farklı tutarlarla deneme yapabilirsiniz. Örnekte de görebileceğiniz gibi, kayıp yalnızca 50 dönemden sonra çok azdır, bu da yeterli olabilir.

5. Modeli kullanın

X ile Y arasındaki ilişkiyi öğrenmek için eğitilmiş bir modeliniz vardır. Daha önce bilinmeyen X için Y'yi anlamasını sağlamak amacıyla model.predict yöntemini kullanabilirsiniz. Örneğin X'in 10 olması durumunda Y'nin ne olacağını düşünüyorsunuz? Aşağıdaki kodu çalıştırmadan önce tahminde bulunun:

print(model.predict([10.0]))

31 düşünmüş olabilirsiniz ama sonuçta biraz kaldı. Neden böyle olduğunu düşünüyorsunuz?

Nöral ağlar, olasılıklarla ilgilenir. Bu nedenle, X ile Y arasındaki ilişkinin Y=3X+1 olma olasılığının çok yüksek olduğunu hesaplamıştır. Ancak yalnızca altı veri noktasıyla emin olamaz. Sonuç, 31'e çok yakındır ancak 31 olması gerekmez.

Nöral ağlarla çalışırken bu kalıbın tekrarlandığını görürsünüz. Neredeyse her zaman olasılıklarla değil, olasılıklarla ilgilenirsiniz ve özellikle sınıflandırma söz konusu olduğunda sonucun olasılıklara göre ne olduğunu anlamak için biraz kodlama kullanırsınız.

6. Tebrikler

İster inanın ister inanmayın, makine öğreniminde çok daha karmaşık senaryolarda kullanacağınız kavramların çoğunu ele almıştınız. Bir nöral ağı, ağı tanımlayarak iki sayı kümesi arasındaki ilişkiyi tespit etmek için nasıl eğiteceğinizi öğrendiniz. Daha sonra bir kayıp işlevi ve optimize ediciyle derlediğiniz, nöronlar (bu örnekte yalnızca bir tane) içeren bir katman grubu (bu örnekte yalnızca bir) tanımlamıştınız.

Bir ağ, kayıp işlevi ve optimize edici toplama işlemi, sayılar arasındaki ilişkiyi tahmin etme, ne kadar iyi olduklarını ölçme ve yeni tahminler için yeni parametreler oluşturma sürecini yürütür. TensorFlow.org adresinden daha fazla bilgi edinin.

Daha fazla bilgi

Makine öğrenimi ve TensorFlow'un bilgisayar görüşü modellerinizle ilgili nasıl yardımcı olabileceğini öğrenmek için TensorFlow ile bilgisayar görüşü modeli oluşturma bölümüne geçin.