MXNet ile Derin Öğrenme 2.2: Softmax Regresyon (Uygulama)
Herkese merhabalar, MXNet ile derin öğrenme serisine devam ediyoruz. Önceki bölümde softmax regresyon konusunda teorik bilgiler paylaşmıştık. Bu bölümde softmax regresyon konusunda MXNet kütüphanesini kullanarak uygulama yapacağız.
Önceki bölümü incelemeyenler buradan erişebilirsiniz.
Uygulama
- Kütüphane ekleme,
- Veriseti
- Sinir ağ modeli oluşturma,
- Model parametrelerini belirleme,
- Eğitim,
- Test,
kısımlarından oluşacaktır.
1. Kütüphaneleri Ekleme
İlk aşamada gerekli olan kütüphaneleri ekleyeceğiz.
%matplotlib inline import sys from mxnet import gluon from d2l import mxnet as d2l d2l.use_svg_display()
2. Veriseti
Veri seti olarak literatürde yaygın olarak kullanılan FashionMNIST veriseti kullanıldı. Fashion-MNIST, Zalando’nun makale görüntülerinin bir veri setidir—60.000 örneklik bir eğitim seti ve 10.000 örneklik bir test setinden oluşur. Her örnek, 10 sınıftan bir etiketle ilişkilendirilmiş 28×28 gri tonlamalı bir görüntüdür. Her görüntü 28 piksel yüksekliğinde ve 28 piksel genişliğinde olup, toplamda 784 pikseldir. Her pikselin kendisiyle ilişkilendirilmiş, o pikselin açıklığını veya koyuluğunu gösteren tek bir piksel değeri vardır ve daha yüksek sayılar daha koyu anlamına gelir. Bu piksel değeri, 0 ile 255 arasında bir tamsayıdır. Eğitim ve test veri setlerinde 785 sütun bulunur. İlk sütun sınıf etiketlerinden oluşur ve giyim eşyasını temsil eder. Sütunların geri kalanı, ilişkili görüntünün piksel değerlerini içerir.
Gluon kütüphanesi kullanılarak FashionMNIST veriseti yüklendi.
mnist_train = gluon.data.vision.FashionMNIST(train=True) mnist_test = gluon.data.vision.FashionMNIST(train=False) print('Çıktı: ', len(mnist_train), len(mnist_test))
Çıktı: (60000, 10000)
print('Çıktı: ', mnist_train[0][0].shape)
Çıktı: (28, 28, 1)
Bu kısımda verisetinin içeriklerini görselleştirmek için etiketlerin çekildiği ve resimlerin görselleştirildiği iki fonksiyon yazıyoruz.
def get_fashion_mnist_labels(labels): text_labels = [ 't-shirt', 'trouser', 'pullover', 'dress', 'coat', 'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot'] return [text_labels[int(i)] for i in labels]
def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5): figsize = (num_cols * scale, num_rows * scale) _, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize) axes = axes.flatten() for i, (ax, img) in enumerate(zip(axes, imgs)): ax.imshow(img.asnumpy()) ax.axes.get_xaxis().set_visible(False) ax.axes.get_yaxis().set_visible(False) if titles: ax.set_title(titles[i]) return axes
X, y = mnist_train[:18] print(X.shape) show_images(X.squeeze(axis=-1), 2, 9, titles=get_fashion_mnist_labels(y))
Şekil 1: Örnek FashionMNIST veriseti içeriği
3. Sinir Ağ Modeli Oluşturma
Softmax regresyonunun çıktı katmanı tam bağlantılı bir katmandır. Bu nedenle, modeli uygulamak için, Sıralamayı 10 çıkışlı tam bağlantılı bir katman eklemek yeterlidir. Başlangıç ağırlıkları rasgele sıfır ortalama ve 0,01 standart sapma ile başlatıldı.
net = nn.Sequential() net.add(nn.Dense(10)) net.initialize(init.Normal(sigma=0.01))
4. Model Parametrelerini Belirleme
Verisetini her yinelemede farklı veriler ele alması için karıştırma işlemi gerçekleştirildi. Veriler dizi formatından tensor formatına çevirildi. Derin öğrenme modelini eğitmek için bu zorunludur. Ayrıca batch size 64 olarak seçildi. Burada modelin eğitim hızı ve başarı oranına göre orantılı değer olarak 64 değeri kullanıldı. num_workers , paralel olarak partiler oluşturan işlemlerin sayısını belirtir. Yeterince yüksek sayıda çalışan, CPU hesaplamalarının verimli bir şekilde yönetilmesini sağlar. Bu değer batch size ile orantılı olacak şekilde seçilerek eğitim hızı artırılması amaçlanmaktadır.
batch_size = 64 transformer = gluon.data.vision.transforms.ToTensor() train_iter = gluon.data.DataLoader(mnist_train.transform_first(transformer), batch_size, shuffle=True, num_workers=4)
Model parametrelerinden olan loss fonksiyonu Cross entropy loss fonksiyonu seçildi. Ayrıca optimizasyon fonksiyonu olarak stochastic gradient descent algoritması seçild. Optimizasyon fonksiyonunda kullanılan learning rate olarak 0.1 değeri seçildi. Burada seçilen düşük değerler 0.000001 gibi eğitim sonucunda daha yüksek başarı oranı elde etme ihtimali bulunurken model yavaş öğrenmektedir. Learning rate değerinin yüksek olması durumunda ise eğitim hızı artacak fakat model öğrenme kaliteli olmayacaktır. Bu iki durum dikkate alınarak learning rate oranı 0.1 değeri seçildi.
loss = gluon.loss.SoftmaxCrossEntropyLoss() trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.1})
5. Eğitim
Eğitim için epok değeri 10 olarak belirlendi. Gerekli loss fonksiyonları, veriseti girdi olarak verilerek eğitim işlemi yapıldı.
num_epochs = 10 d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
Şekil 2: Eğitim test kayıp ve başarı çıktıları
6. Test
Bu kısımda eğitilen modelin test işlemi yapıldı. Bu kısımda ilk olarak tahmin yapılması için fonksiyon oluşturuldu. Bu fonksiyon ile girdi görseli verilerek etiketin tahmin edilmesi hedeflendi. Gerçek etiket, tahmin edilen etiket ve girdi verisi görselleştirildi.
def predict_ch3(net, test_iter, n=6): for X, y in test_iter: break trues = d2l.get_fashion_mnist_labels(y) preds = d2l.get_fashion_mnist_labels(net(X).argmax(axis=1)) titles = [true + '\n' + pred for true, pred in zip(trues, preds)] d2l.show_images(X[0:n].reshape((n, 28, 28)), 1, n, titles=titles[0:n]) predict_ch3(net, test_iter)
Şekil 3: Tahmin çıktıları
Softmax Regresyon bölümünün uygulama kısmını bitirmiş olduk. Bu bölümde FashiıonMNIST verisetini kullanarak softmax regresyon ile modeli eğittik ve test ettik.
Kodların tamamına buradan ulaşabilirsiniz.
Serinin sonraki bölümlerinde görüşmek dileğiyle.