Bu çalışmada konvolüsyon katmanları ile oluşturulmuş tipik bir CNN yapısı tanıtılacak ve örnek bir modelinin eğitimi TensorFlow/Keras ile gerçekleştirilecektir. Veri seti olarak Cifar10 kullanılarak bu veri seti üzerinde örnek çok-sınıflı sınıflandırıcı bir CNN modelinin başarımı incelenecektir.
Giriş:
Derin öğrenme ağları genelde sınıflandırıcı olarak problem tipine göre çeşitli sayıda katmandan oluşan tam bağlantılı katmanlardan (Fully Connected Layer) oluşan yapay sinir ağlarını kullanır. Makine öğrenmesinde manuel olarak belirlenmesi gereken sınıflandırıcı girişleri, derin öğrenme ağlarında özellik çıkarıcı bazı katmanlar aracılığı ile otomatik olarak veriden elde edilir. Yani eğitim sırasında bu katmanlar başarıyı artıracak özellikleri seçecek şekilde eğitilir. Konvolüsyonel veya Evrişimsel Sinir Ağları (CNN) derin öğrenme modellerinde yaygın olarak tercih edilen ağlardan birisidir. CNN ile sinyal, dizi, görüntü veya hacimsel veriler gibi pratikte karşılaşılabilecek verileri işlemek için tasarlanmış bir tür yapay sinir ağıdır. CNN modelleri görüntü sınıflandırma, nesne algılama ve görüntü tanıma gibi birçok uygulamada etkili olduğu kanıtlanmıştır.
CNN mimarilerinin en önemli özelliği giriş verilerine sahip oldukları kernel olarak adlandırılan eğitilebilir katsayılar ile konvolüsyon işlemlerini uygulayan katmanların kullanılmasıdır. Konvolüsyon, kernelin giriş verileri üzerinde kaydırılmasını ve bir özellik haritası oluşturmak için giriş verileri üzerinde ağırlıklar ile çarpma ve toplama işlemlerini içerir. Böylece giriş verilerindeki önemli özellikleri öğrenerek lokal ve global ilişkilerin yakalanmasına yardımcı olur.
Görüntü sınıflandırma için kullanılabilecek tipik bir CNN yapısı anlatılmaktadır. Ağın yapısında temel olarak, konvolüsyon katmanları, aktivasyon fonksiyonları, havuzlama katmanları ve tam bağlantılı bir katman bulunmaktadır. Pratikte böyle bir modelin tanımlanması ve bir amaç için eğitimi çeşitli derin öğrenme uygulama programlama arayüzleri (API) ile gerçekleştirilebilir. Keras API bu amaçla yaygın olarak kullanılan araçlardan biridir[2].
Keras API:
Keras, makine öğrenimi platformu TensorFlow üzerinde çalışan, Python ile yazılmış bir derin öğrenme API’dir. Derin öğrenme modellerinin daha pratik bir şekilde eğitilmesi, analizi ve test edilmesi için oldukça pratik araçlar sağlamaktadır. Tipik bir CNN modelinin gerçekleştirilmesi için gerekli olarak konvolüsyon, havuzlama, aktivasyon fonksiyonu gibi katmanlar Keras ile kolayca tanımlanabilir. Bunun yanında aktivasyon fonksiyonları, kayıp (loss) fonksiyonları, optimizasyon algoritmaları, performans metrikleri gibi bir çok derin öğrenme aracını da sağlamaktadır.
Keras ile örnek bir CNN modeli:
Keras ile bir model tanımlanırken katmanların birbiri ardına geldiği sıralı modeller veya katmanların paralel çalışabildiği ve birden fazla giriş-çıkış noktalarının bulunduğu fonksiyonel model yapısı kullanılabilir. Burada oluşturacağımız model sıralı yapıdaki bir CNN olacağından bu amaçla Sequential sınıfını kullanacağız.
from keras import layers
def cnn_model():
model=Sequential()
model.add(layers.Conv2D(filters=32,
kernel_size=(3,3),
activation='relu',
padding='same',
input_shape= (32, 32, 3)))
#model.add(Activation('relu'))
model.add(layers.Conv2D(filters=32,
kernel_size=(3,3),
padding='same',
activation='relu'))
model.add(layers.MaxPool2D())
model.add(layers.Conv2D(filters=64,
kernel_size=(3,3),
padding='same',
activation='relu'))
model.add(layers.MaxPool2D())
model.add(layers.Conv2D(filters=64,
kernel_size=(3,3),
padding='same',
activation='relu'))
model.add(layers.MaxPool2D())
model.add(layers.Flatten())
model.add(layers.Dense(512,activation='relu'))
model.add(layers.Dense(10,activation='softmax'))
model.summary()
return model
Örnek cnn_model() fonksiyonunda görüldüğü gibi bu sınıfa ait add metodu ile istenilen ağın oluşturulması için gerekli katmanlar eklenir. Burada Conv2D ile iki boyutlu konyolüsyon işlemini gerçekleştiren katmanlar eklenmiştir. Bu katmana ait tipik parameteler aşağıdaki gibi açıklanabilir:
- filters: Burada filters parametresi katmandaki filtre sayısını tanımlar. Örneğin ilk katmanda 32 adet filtre aynı anda görüntü üzerinden özellik çıkarmak için kullanılır.
- kernel_size: Her bir filtreyi tanımlayan kernel boyutları ise kernel_size parametresi ile 3x3 olacak şekilde tanımlanmıştır. Böylece her bir kernel üzerinde toplam 3*3=9 adet eğitilebilir parametre bulunmaktadır.
- activation: Konvolüsyon işlemi sonrasında her bir çıkış aktivasyon fonksiyonu olarak relu tanımlanmıştır.
- padding: konvolüsyon uygulanırken satır ve sütun sayılarında kernel boyutuna bağlı olarak azalma meydana gelir. Burada padding=’same’ seçilerek görüntüye kernel boyutuna bağlı sayıda satırlar ve sütunlar eklenebilir. Aksi takdirde default değer olan padding=’valid’ kullanılacak, satır ve sütun sayılarında azalma meydana gelecektir.
- input_shape: Oluşturulan modelde her bir katmanın giriş sayısı bir öncekinin çıkış sayısı ile belirlenir. Sadece ilk katmanda giriş boyutu veri setinin boyutlarına göre veya yeniden boyutlandırma yapıldıysa buna göre belirtilmesi gerekir. Burada kullanılan input_shape= (32, 32, 3) giriş görüntüsünün 32x32 ve 3 kanal, yani renkli olduğunu göstermektedir.
Conv2D ile birlikte veri boyutunu azaltma amacıyla MaxPool2D havuzlama katmanı kullanılmıştır. MaxPool2D katmanı parametre olarak havuzlama boyutunu içeren pool_size parametresi içerir ve yaygın olarak (2,2) boyutlarında kullanılır. Konvolüsyon ve havuzlama işlemleri sonunda üretilen özelliklerin sınıflandırıcı katmana uygulanabilmesi için Flatten katmanı ile matrisel formdaki veriler birleştirilerek vektörlere dönüştürülür. Ardından Dense olarak adlandırılan tam bağlantılı katmanlara uygulanır.
Oluşturulan modelin genel özellikleri model.summary() ile incelenebilir. Burada modelin katmanlarına ait giriş-çıkış boyutları ve parametre sayıları katman bazında verilmiştir. Ayrıca ağın bellekte kapladığı alan, eğitilebilir ve eğitilemez (dondurulmuş) parametre sayıları ve boyutları ayrıca görülebilmektedir.
Cifar10 veri seti ile modelin eğitilmesi:
Cifar10 veriseti keras.datasets ile çağrılarak 50.000 eğitim ve 10.000 test verisi aşağıdaki gibi yüklenip normalize edilebilir.
from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
#normalizasyon
x_train=x_train.astype('float32')/255.0
x_test=x_test.astype('float32')/255
Veri setinde toplam 10 adet sınıf bulunmaktadır. Cifar10 veri setine ait bazı örnekler matplotlib ile aşağıdaki gibi elde edilebilir:
import matplotlib.pyplot as plt
# Example images
figs, axes = plt.subplots(4, 6)
for i in range(4):
for j in range(6):
axes[i, j].imshow(x_train[i*6+j,:,:,:])
axes[i, j].set_xticks([])
axes[i, j].set_yticks([])
Veri setinin kullanıldığı model aşağıdaki gibi oluşturulduktan sonra kayıp fonksiyonu, optimizasyon algoritması ve başarım metrikleri compile metodu ile belirlenebilir. Burada kayıp fonksiyonu olarak çok sınıflı sınıflandırma da yaygın olarak kullanılan kayıp fonksiyonu olarak categorical_crossentropy kullanılmıştır. Optimizasyon algoritması olarak RMSprop öğrenme oranı belirtilerek kullanılmıştır. Başarımı ölçmek için kullanılan metrics olarak doğruluk (accuracy=acc) belirtilmiştir. Kayıp fonksiyonu olarak categorical_crossentropy kullanıldığı için etiketlere one-hot encoding uygulanmıştır.Etiket 10 adet çıkıştan hangisine karşılık geliyorsa ilgili konum 1 diğerleri 0 olarak dönüştürülür.
from keras import optimizers
model=cnn_model()
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.RMSprop(learning_rate=1e-4),
metrics=['acc'])
from keras.utils import to_categorical
y_train=to_categorical(y_train,10)
y_test=to_categorical(y_test,10)
Modelin eğitimi için fit metodu çeşitli eğitim parametreleri ile birlikte kullanılır. Tipik olarak bunlar verisetine ait veri ve etiketleri, epoch sayısı, geçerleme (validation) verileri şeklindedir. Veriler klasörlerden okunduğu durumlarda burada ImageDataGenerator gibi sınıflardan faydalanılır. Eğitim setinin ne kadarının geçerleme için kullanılacağı ise validation_split ile belirtilir. Örneğin burada 0.2 verisetinin %20’si yani 10.000 tanesi eğitimde kullanılmaz, geçerleme için kullanılır. Eğer geçerleme verileri ayrıca yüklenmişse validation_data=(x_val,y_val) şeklinde belirtilebilir.
history=model.fit(x_train,
y_train,
epochs=50,
validation_split=0.2)
Eğitim sonucunda fit metodunun döndürdüğü eğitim durumu verileri Şekil 6’da görüldüğü g,b, history değişkeni üzerinden okunabilir. Sözlük yapısında döndürülen veriler ilgili key değerleri ile incelenebilir.
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1,len(acc)+1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'r', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.legend()
plt.show()
Eğitimi tamamlanan model aşağıdaki gibi test veri seti üzerinde evaluate metodu ile test edilebilir.
loss,acc=model.evaluate(x_test,y_test)
Eğitilen modeli predict metodu ile uygulamalarımızda kullanabiliriz. Test veri setinden seçilen bir görüntü modele uygulanabilir. Predict metoduna birden fazla görüntü örneğini değerlendirebilir. Bundan dolayı tek görüntü uygulanırken örnek sayısı için bir boyut daha eklemek gerekir. Bu durumda giriş verisi 1x32x32x3 boyutlarına dönüştürülmüş olur. Verilen örnekte CNN çıkışları 10 adet olduğu için tahmin vektörü boyutu da 10’dur. Bunlardan en yüksek olanını belirten indis değeri argmax ile belirlenerek girişin ait olduğu sınıf tahmin edilir.
Sonuç
Keras API ile CNN tabanlı modelleri oluşturmak oldukça pratik hale gelmiştir. İstenilen katmanlar seçilip model oluşturulduktan sonra optimizasyon algoritması, öğrenme oranı, kayıp fonksiyonu gibi parametreler belirtilerek model eğitime hazır hale gelir. Hiperparametre olarak adlandırılan bu parametreler eğitimin başarısı açısından oldukça önemlidir. Bundan dolayı deneyler genelde model yapısının da değiştirildiği farklı hiperparametreler ile gerçekleştirilerek daha iyi sonuç veren modellere ulaşılmaya çalışılır. Verilen örnekte her ne kadar hafızaya direkt yüklenen bir veri seti kullanılsa da, birçok durumda verilerin dosyadan batch olarak adlandırılan belli sayıda parçalar halinde yüklenmesi gerekmektedir. Ayrıca ezberleme durumunda, ezberleme önlemeyi sağlayan Dropout katmanı, l1 ve l2 regülasyonu, model yapısını küçültme ve veri zenginleştirme gibi bir çok yaklaşımın yanında transfer öğrenme modellerinin kullanılması da tercih edilmektedir.