Veri Kümesine Genel Bakış
- Bu eğitim için 'işaret dili rakamları veri seti' ni (https://www.kaggle.com/c/digit-recognizer/overview) kullanacağız.
- Bu veri setinde 2062 adet işaret dili rakamlı görsel bulunmaktadır.
- Bildiğiniz gibi rakamlar 0'dan 9'a kadardır. Dolayısıyla 10 tane işaret vardır.
- Başlangıç seviyesi olduğu için basitlik açısından sadece 0 ve 1 işaretlerini kullanacağız.
- Verilerde "sıfır" işareti 204 ile 408 indeksleri arasındadır. Sıfır işareti sayısı 205'tir.
- Ayrıca "bir" işareti 822 ile 1027 indeksleri arasındadır. "Bir" işaretin sayısı 206'dır. Bu nedenle her sınıftan (etiketlerden) 205 örnek kullanacağız.
- Not: Aslında 205 örnek derin öğrenme için çok çok çok az. Ama bu eğitim giriş olduğu için bu yüzden çok önemli değil.
- X ve Y dizilerimizi hazırlayalım. X, görüntü dizisidir ("sıfır" ve "bir" işareti) ve Y, etiket dizisidir (0 ve 1).
# load dataset
x_l = np.load('X.npy')
Y_l = np.load('Y.npy')
img_size = 64
plt.subplot(1, 2, 1)
plt.imshow(x_l[405].reshape(img_size, img_size), cmap='gray')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(x_l[900].reshape(img_size, img_size), cmap='gray')
plt.axis('off')
(-0.5, 63.5, 63.5, -0.5)
- Resim dizisini oluşturmak için "sıfır" ve "bir" işaret dizilerini birleştiriyorum.
- Daha sonra sıfır işaretli görüntüler için 0 ve bir işaretli görüntüler için 1 etiket dizisini oluşturuyorum.
# Join a sequence of arrays along an row axis.
X = np.concatenate((x_l[204:409], x_l[822:1027] ), axis=0) # from 0 to 204 is zero sign and from 205 to 410 is one sign
z = np.zeros(205)
o = np.ones(205)
Y = np.concatenate((z, o), axis=0).reshape(X.shape[0],1)
print("X shape: " , X.shape)
print("Y shape: " , Y.shape)
X shape: (410, 64, 64)
Y shape: (410, 1)
- X'in shape'i (410, 64, 64)
- 410, görüntü sayımızın 410 olduğu anlamına gelir (sıfır ve bir işareti)
- 64, resim boyutumuzun 64x64 (64x64 piksel) olduğu anlamına gelir
- Y'nin shape'i (410,1)
- 410, etiket sayımızın 410 olduğu anlamına gelir (0 ve 1)
- X ve Y'yi eğitim ve test setlerine ayıralım.
- test_size = test sayısının oranı. test = 15% ve train = 85%
- random_state = randomize ederken aynı seed'i kullanın. Bu, tekrar tekrar train_test_split'i çağırırsak, aynı random_state'e sahip olduğumuz için her zaman aynı train ve test dağılımını oluşturduğu anlamına gelir.
# Then lets create x_train, y_train, x_test, y_test arrays
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.15, random_state=42)
number_of_train = X_train.shape[0]
number_of_test = X_test.shape[0]
print("number_of_train:",number_of_train)
print("number_of_test:",number_of_test)
number_of_train: 348
number_of_test: 62
- Şimdi 3 boyutlu giriş dizimiz (X) var, bu yüzden ilk derin öğrenme modelimiz için girdi olarak kullanmak üzere düzleştirme (2D) yapmamız gerekiyor.
- Etiket dizimiz (Y) zaten düzleştirilmiş (2D) olduğu için bu şekilde bırakıyoruz.
- X dizisini (görüntü dizisini) düzleştirelim.
X_train_flatten = X_train.reshape(number_of_train,X_train.shape[1]*X_train.shape[2])
X_test_flatten = X_test .reshape(number_of_test,X_test.shape[1]*X_test.shape[2])
print("X train flatten: ",X_train_flatten.shape)
print("X test flatten: ",X_test_flatten.shape)
X train flatten: (348, 4096)
X test flatten: (62, 4096)
- Gördüğünüz gibi, 348 görüntümüz var ve her görüntü 4096 piksele sahip.
- Ayrıca 62 görüntümüz var ve test dizisinde her görüntü 4096 piksele sahip.
- O zaman devriğini alalım. NEDEN diyebilirsiniz aslında teknik bir cevabı yok. Ben sadece kodu ona göre yazıyorum :)
x_train = X_train_flatten.T
x_test = X_test_flatten.T
y_train = Y_train.T
y_test = Y_test.T
print("x train: ",x_train.shape)
print("x test: ",x_test.shape)
print("y train: ",y_train.shape)
print("y test: ",y_test.shape)
x train: (4096, 348)
x test: (4096, 62)
y train: (1, 348)
y test: (1, 62)
Bu noktaya kadar yaptıklarımız:
- "Sıfır" işaretli ve "bir" işaretli etiketlerimizi (sınıflarımızı) seçtik.
- Eğitim ve test setlerini oluşturduk ve düzleştirdik.
- Nihai girdilerimiz (görüntüler) ve çıktılarımız (etiketler veya sınıflar) şu şekilde görünür:
Hesaplama Grafiği (Computation Graph)
- Hesaplama grafikleri, matematiksel ifadeleri göstermenin güzel bir yoludur.
- Matematiksel ifadelerin görselleştirilmesi gibidir.
- Örneğin; $$c = \sqrt{a^2 + b^2}$$
- Hesaplama grafiği şudur.
- Gördüğünüz gibi matematiği grafikle ifade ettik.
Lojistik Regresyon
İkili sınıflandırma denilince (0 ve 1 çıkışlı) ilk akla gelen lojistik regresyondur.
Bununla birlikte, derin öğrenme eğitiminde lojistik regresyon ile ne yapılmalı?
Yanıt, lojistik regresyonun aslında çok basit bir sinir ağı olduğudur.
Bu arada sinir ağı ve derin öğrenme aynı şeydir. Yapay sinir ağlarında 'derin' gibi terimleri detaylı olarak anlatacağım.
Lojistik regresyonu (basit derin öğrenme) anlamak için önce hesaplama grafiğini öğrenelim.
Şimdi lojistik regresyonun hesaplama grafiğine bakalım.